关于if语句:Ruby – 如果Elsif Else错误

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_else

C:/Users/Kelan/Documents/Programming/Ruby
Files/Little Programs/Alphabet.rb:21:
syntax error, unexpected keyword_end

C:/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。您还可以了解case声明:

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

或者,更好的方法是使用String类的方法count,如下所示:

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风格的增量运算符。鲁比对此并不失望。你必须用foo += 1来代替。

不过,我给你展示一种更为红宝石的方法怎么样?

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."


我认为你需要使用vowel+=1con+=1,而不是vowel++con++

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)