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 || y
为 x
,否则为 y
。 "a"
是真实的(除 nil
和 false
之外的所有内容都是真实的,这两个和 只有 这两个是虚假的),因此 "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
是一个里面有一个字母的字符串。
这是我的代码:
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 || y
为 x
,否则为 y
。 "a"
是真实的(除 nil
和 false
之外的所有内容都是真实的,这两个和 只有 这两个是虚假的),因此 "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
是一个里面有一个字母的字符串。