Руби - Если Элсиф Else Ошибка - PullRequest
5 голосов
/ 11 мая 2011

Я получаю сообщение об ошибке с простой цепью if else, и я не могу понять, что происходит. Я начал изучать ruby ​​на днях, я уже знал немного java и просто пытался переписать программы для более быстрого изучения ruby. Я пытаюсь подсчитать гласные и согласные. В любом случае вот мой код ...

#!/usr/bin/ruby/
alphabet = 'abcdefghijklmnopqrstuvwxyz'

array = alphabet.chars.to_a
vowel = 0
cons = 0
puts array.at(1)
for i in 0...26 
    if array.at(i) == "a"
        vowel++   
    elsif array.at(i) == 'e'
        vowel++
        elsif array.at(i) == 'i'
        vowel++
    elsif array.at(i) == 'o'
        vowel++
    elsif array.at(i) == 'u'
        vowel++
    else
        cons++
    end#end if else chain
end#end for loop

puts 'Vowel: ' + vowel.to_s
puts 'Consonants: ' + cons.to_s

Вот ошибка, которую я получаю:

C: / Users / Kelan / Документы / Программирование / рубин Файлы / Маленькие программы / Alphabet.rb: 11: Синтаксическая ошибка, неожиданное ключевое слово_elsif elsif array.at (i) == 'e' ^

C: / Users / Kelan / Документы / Программирование / рубин Файлы / Маленькие программы / Alphabet.rb: 13: Синтаксическая ошибка, неожиданное ключевое слово_elsif elsif array.at (i) == 'i' ^

C: / Users / Kelan / Документы / Программирование / рубин Файлы / Маленькие программы / Alphabet.rb: 15: Синтаксическая ошибка, неожиданное ключевое слово_elsif elsif array.at (i) == 'o' ^

C: / Users / Kelan / Документы / Программирование / рубин Файлы / Маленькие программы / Alphabet.rb: 17: Синтаксическая ошибка, неожиданное ключевое слово_elsif elsif array.at (i) == 'u' ^

C: / Users / Kelan / Документы / Программирование / рубин Файлы / Маленькие программы / Alphabet.rb: 19: Синтаксическая ошибка, неожиданное ключевое слово_это

C: / Users / Kelan / Документы / Программирование / рубин Файлы / Маленькие программы / Alphabet.rb: 21: Синтаксическая ошибка, неожиданное ключевое слово_end

C: / Users / Kelan / Документы / Программирование / рубин Файлы / Маленькие программы / Alphabet.rb: 25: синтаксическая ошибка, неожиданный конец $, ожидание ключевых слов 'Согласные:' + cons.to_s ^

[Завершено за 0,203 секунды]

Я уверен, что это просто что-то глупое, но я всегда искал помощи в Интернете и слышал о вашем замечательном сообществе, поэтому я решил попробовать здесь,

Kelan

Ответы [ 5 ]

15 голосов
/ 11 мая 2011

В Ruby нет оператора ++. Вы должны были использовать += 1 Вы также можете узнать о case утверждении:

alphabet = 'abcdefghijklmnopqrstuvwxyz'

26.times do |i|
    case alphabet[i]
        when 'a' then vowel += 1
        when 'e' then vowel += 1
        when 'i' then vowel += 1
        when 'o' then vowel += 1
        when 'u' then vowel += 1
        else cons += 1
    end#end case
end#end times

puts 'Vowel: ' + vowel.to_s
puts 'Consonants: ' + cons.to_s

Или, что еще лучше, используйте метод count из класса String, например:

alphabet = 'abcdefghijklmnopqrstuvwxyz'
vowels = 'aeiou'
vowel_count = alphabet.count vowels
cons_count = alphabet.length - vowel_count
puts "Vowels: #{vowel_count}"
puts "Consonants: #{cons_count}"
5 голосов
/ 11 мая 2011

Ваша проблема в том, что вы используете оператор приращения в стиле Java / PHP / C.Руби не доволен этим.Вместо этого вы должны использовать foo += 1.

Как насчет того, чтобы показать вам более рубиновый способ сделать это?

# use a range to define your alphabet
alphabet = ('a'..'z').entries  #=> ['a', 'b', 'c', ...]

# define vowels as members of an array. it's more flexible, which
# is great for things that change (what if you decide to use 'y'?)
vowels = %w{ a e i o u }  #=> ['a', 'e', 'i', 'o', 'u']

# keep counts all together in a hash, which I personally find cleaner
counts = { :vowels => 0, :consonants => 0 }

# even the `for` loops in ruby use the iterators, so you actually
# get better performance out of using the more user-friendly `.each`
alphabet.each do |letter|
  if vowels.include? letter
    counts[:vowels] += 1
  else 
    counts[:consonants] += 1
  end
end

puts "There were #{counts[:vowels]} vowels and #{counts[:consonants]} consonants."
3 голосов
/ 11 мая 2011

Я думаю, что вместо vowel++ и con++ вам нужно использовать vowel+=1 и con+=1.

В Ruby нет пре / пост-инкрементов стиля C.

2 голосов
/ 11 мая 2011
  • Существует простой способ построения набора алфавитов, используя Range.
  • Поскольку вы используете ruby, вы должны использовать внутренние итераторы вместо внешних. В хорошей программе на ruby ​​вы редко увидите цикл for.
  • case конструкция удобна в этом случае. Вы можете поместить несколько совпадающих шаблонов в один, разделив их запятой.
  • В ruby ​​нет операторов ++ или --. Используйте += 1.
  • Используйте обозначение "#{ }". Это намного лучше и быстрее, чем использовать +. На самом деле, вы можете опустить to_s, если используете его.

Я бы сказал так:

vowel = 0
cons = 0
('a'..'z').each do |c|
  case c
  when 'a', 'e', 'i', 'o', 'u'; vowel += 1
  else                          cons += 1
  end
end

puts "Vowel: #{vowel}"
puts "Consonants: #{cons}"

Если бы я хотел более короткий, я мог бы пойти с этим:

partition = ('a'..'z').group_by{|c| c =~ /[aeiou]/}
puts "Vowel: #{partition[0].length}"
puts "Consonants: #{partition[nil].length}"
2 голосов
/ 11 мая 2011

Вот еще один способ написать демо:

puts("%d vowels & %d consonants" % ('a'..'z').inject([0,0]) do |m, e|
    m[/[aeiou]/.match(e) ? 0:1] += 1; m 
  end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...