三元运算符语法问题

时间:2015-11-06 21:48:19

标签: ruby

我想回归" true"如果速度低于40或超过60,否则为假。

这是我的代码:

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 ==)

我尝试将每个参数放在括号内,以及使用&#34; true&#34;和&#34;假&#34;作为字符串。

2 个答案:

答案 0 :(得分:2)

您不需要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

正如engineermnky指出的那样,这里不需要使用三元运算符,因为表达式求值为布尔值。所以你需要的就是:

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

答案 1 :(得分:2)

只返回表达式的布尔结果

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

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

这就是你所期望的:

unsafe? 10
#=> true

unsafe? 50
#=> false 

unsafe? 70
#=> true

这既易于阅读又更具惯用性,并减少了代码中不必要的混乱。此外,将变量重命名为 unsafe?会使其更自然,并且在表达诸如not_safe? 50 #=> false之类的想法时减少对双重否定的混淆。