【问题标题】:Ruby only checks for first element of a boolean expression?Ruby 只检查布尔表达式的第一个元素?
【发布时间】:2017-02-05 20:42:00
【问题描述】:

这是我的代码:

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

我希望它返回这个:

found a
found e
found i

但我只得到

found a

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

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

代码返回found e 而不是found a

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

【问题讨论】:

    标签: ruby boolean-expression


    【解决方案1】:

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

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

    或者更惯用的

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

    【讨论】:

      【解决方案2】:

      x || yx 如果 x 是真的,y 否则。 "a" 是真实的(除了nilfalse 之外的一切都是真实的,这两个并且只有这两个是虚假的),因此"a" || whatever_it_doesnt_matter总是 @987654329 @。

      所以,

      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"
      

      【讨论】:

      • 加上||短路,所以你不需要超越("a" || (...))
      • 我希望@pjs 的评论指向您选择的“评估”一词。
      【解决方案3】:

      查看@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是一个里面有一个字母的字符串。

      【讨论】:

        猜你喜欢
        • 2020-01-02
        • 2018-02-07
        • 2011-11-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        相关资源
        最近更新 更多