【问题标题】:Ternary operator syntax issue三元运算符语法问题
【发布时间】:2015-11-06 21:48:19
【问题描述】:

如果速度低于 40 或超过 60,我会尝试返回“true”,否则返回 false。

这是我的代码:

def not_safe?(speed)

  if speed < 40 || speed > 60 ? true : false

  end
end

这是错误:

Failure/Error: expect(answer).to eq(false)

expected: false
got: nil

(compared using ==)

我尝试将每个参数放在括号内,以及使用“true”和“false”作为字符串。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    您不需要if。它应该是这样的:

    def not_safe?(speed)
      speed < 40 || speed > 60 ? true : false
    end
    
    irb(main):027:0> not_safe? 30
      => true
    irb(main):028:0> not_safe? 50
      => false
    

    正如engineersmnky 所指出的,这里没有必要使用三元运算符,因为表达式的计算结果为布尔值。所以你只需要这样:

    def not_safe?(speed)
      speed < 40 || speed > 60
    end
    

    【讨论】:

    • 或只是speed &lt; 40 || speed &gt; 60,因为这将始终是一个布尔响应。三元运算符在这里并不适用
    【解决方案2】:

    只返回表达式的布尔结果

    由于 Ruby 方法将返回最后一个表达式的计算结果,在这种情况下,您可以简单地将表达式的布尔结果作为返回值。重写方法的惯用方式是:

    def unsafe? speed
      speed < 40 || speed > 60
    end
    

    这符合您的预期:

    unsafe? 10
    #=> true
    
    unsafe? 50
    #=> false 
    
    unsafe? 70
    #=> true
    

    这既更容易阅读,也更惯用,并减少了代码中不必要的混乱。此外,将变量重命名为 unsafe? 使其听起来更自然,并在表达 not_safe? 50 #=&gt; false 之类的想法时减少对双重否定的潜在混淆。

    【讨论】:

    • @engineersmnky 将其称为“XY 答案”,既具有描述性又具有互补性。
    猜你喜欢
    • 2014-08-16
    • 2011-10-24
    • 2011-07-13
    • 1970-01-01
    • 2021-06-25
    • 2012-11-19
    • 2016-08-09
    • 2015-05-20
    • 1970-01-01
    相关资源
    最近更新 更多