if /除了修饰符vs.和/或

时间:2011-04-05 15:15:16

标签: ruby

有时,您希望使用if / unless修饰符,但有条件执行的部分包含要在条件中定义的局部变量。例如,

a = [1, 2, 3]
n = 3*(x**2) + 4*x + 5 if x = a[2]
m = 6*(y**2) + 7*y + 8 unless (y = a[0]).zero?

会给出解析错误,因为在x / y修饰符之前会读取ifunless。为了避免这种情况,我认为使用and代替ifor代替unless非常常见(至少对我而言):

x = a[2] and n = 3*(x**2) + 4*x + 5
(y = a[0]).zero? or m = 6*(y**2) + 7*y + 8

除了它没有引发错误之外,还有什么区别吗?这样做会有副作用吗?并且,有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

出现此问题时我会选择(并已使用过)的替代方案:

if x=a[2]
  n = 3*(x**2) + 4*x + 5
end

if x=a[2] then n = 3*(x**2) + 4*x + 5 end

x=nil
n = 3*(x**2) + 4*x + 5 if x=a[2]

答案 1 :(得分:0)

逻辑或如果其中一方评估为真,则返回true ...

您确定orunless行是否相等 (可能是or行始终评估为真,因为m = 6*(y**2) + 7*y + 8为真)?

编辑:

nope我错了看看this doc - 似乎是你在找什么

答案 2 :(得分:0)

我刚才意识到

之间存在差异
if x = something then f(x) end          (1)

x = something and f(x)                  (2)

这是something获取值false的时间。在这种情况下,(1)返回nil,而(2)返回false