Ruby 只检查布尔表达式的第一个元素?

Ruby only checks for first element of a boolean expression?

这是我的代码:

array = ["b", "c", "a", "e", "d", "g", "i", "f"]
array.each_index do |letter| 
  if array[letter] == ("a" || "e" || "i" || "o" || "u")
    puts "found #{array[letter]}"
  end
end

我希望它 return 这个:

found a
found e
found i

但我只得到

found a

此外,如果我在第 3 行更改 () 内元素的顺序,例如像这样

if array[letter] == ("e" || "a" || "i" || "o" || "u")

代码 returns found e 而不是 found a

我想我理解了这个问题——Ruby 只检查 array 中的第一个元素 ()。但是谁能解释这是为什么?我希望它能检查所有这些。

如果 x 为真,

x || yx,否则为 y"a" 是真实的(除 nilfalse 之外的所有内容都是真实的,这两个和 只有 这两个是虚假的),因此 "a" || whatever_it_doesnt_matter总是 "a".

所以,

if array[letter] == ("a" || "e" || "i" || "o" || "u")

等同于

if array[letter] == ("a" || ("e" || ("i" || ("o" || "u"))))

计算结果为

if array[letter] == ("a" || ("i" || ("o" || "u")))

计算结果为

if array[letter] == ("a" || ("o" || "u"))

计算结果为

if array[letter] == ("a" || "u")

计算结果为

if array[letter] == "a"

布尔语句在逻辑上是错误的。 应该是

array[letter] == "e" || array[letter] == "a" || array[letter] == "i" || array[letter] == "o" || array[letter] == "u" 

或更地道的

["a" , "e" , "i" , "o" ,"u"].include?(array[letter])

查看@JörgWMittag 对您的代码为何不起作用的解释。

你可以这样写:

array = %w(b c a e d g i f)

vowels = %w(a e i o u)
array.each do |letter|
  puts "found #{letter}" if vowels.include? letter
end

或者只是:

array.grep(/[aeiou]/).each do |vowel|
  puts "found #{vowel}"
end

请注意,由于 Ruby 是动态的,因此变量名非常重要。

这在语法上是正确的:

array.each_index do |letter|

但是给人的印象是letter是一个里面有一个字母的字符串。