Ruby — If Elsif Else Error
我在这里得到了一个简单的if-else链的错误,我不知道发生了什么。前几天我开始学习Ruby,我已经知道了一些Java,只是想重新编写程序来更快地学习Ruby。我正在努力计算元音和辅音。总之,这是我的密码…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #!/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/Documents/Programming/Ruby
Files/Little Programs/Alphabet.rb:11:
syntax error, unexpected keyword_elsif
elsif array.at(i) == 'e'
^C:/Users/Kelan/Documents/Programming/Ruby
Files/Little Programs/Alphabet.rb:13:
syntax error, unexpected keyword_elsif
elsif array.at(i) == 'i'
^C:/Users/Kelan/Documents/Programming/Ruby
Files/Little Programs/Alphabet.rb:15:
syntax error, unexpected keyword_elsif
elsif array.at(i) == 'o'
^C:/Users/Kelan/Documents/Programming/Ruby
Files/Little Programs/Alphabet.rb:17:
syntax error, unexpected keyword_elsif
elsif array.at(i) == 'u'
^C:/Users/Kelan/Documents/Programming/Ruby
Files/Little Programs/Alphabet.rb:19:
syntax error, unexpected keyword_elseC:/Users/Kelan/Documents/Programming/Ruby
Files/Little Programs/Alphabet.rb:21:
syntax error, unexpected keyword_endC:/Users/Kelan/Documents/Programming/Ruby
Files/Little Programs/Alphabet.rb:25:
syntax error, unexpected $end,
expecting keyword_end puts
'Consonants: ' + cons.to_s
^[Finished in 0.203 seconds]
号
我肯定这是很愚蠢的事情,但我一直在网上寻求帮助,我听说你的社区很棒,所以我想我会在这里尝试,
克兰
Ruby中没有++运算符。你应该使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
或者,更好的方法是使用
1 2 3 4 5 6 | alphabet = 'abcdefghijklmnopqrstuvwxyz' vowels = 'aeiou' vowel_count = alphabet.count vowels cons_count = alphabet.length - vowel_count puts"Vowels: #{vowel_count}" puts"Consonants: #{cons_count}" |
。
你的问题是使用Java/PHP/C风格的增量运算符。鲁比对此并不失望。你必须用
不过,我给你展示一种更为红宝石的方法怎么样?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 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." |
我认为你需要使用
Ruby没有C样式的前/后递增器。
- 使用
Range 可以很容易地构造字母集。 - 因为您使用的是Ruby,所以应该使用内部迭代器而不是外部迭代器。在Ruby中,很难在一个好的程序中看到
for 循环。 - 在这种情况下,
case 结构很方便。您可以将多个匹配模式放在一个模式中,用逗号分隔。 - Ruby中没有
++ 或-- 操作符。使用+= 1 。 - 使用
"#{ }" 符号。它比使用+ 更快更好。实际上,如果您使用它,可以省略to_s 。
我想要这个:
1 2 3 4 5 6 7 8 9 10 11 | 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}" |
如果我想要一个短一点的,我可以用这个:
1 2 3 | partition = ('a'..'z').group_by{|c| c =~ /[aeiou]/} puts"Vowel: #{partition[0].length}" puts"Consonants: #{partition[nil].length}" |
。
下面是编写演示的另一种方法:
1 2 3 | puts("%d vowels & %d consonants" % ('a'..'z').inject([0,0]) do |m, e| m[/[aeiou]/.match(e) ? 0:1] += 1; m end) |
号