Ruby 如果/除非修饰符与和/或

Ruby 如果/除非修饰符与和/或,ruby,Ruby,有时,您希望使用if/修饰符,除非修饰符,但有条件执行的部分包含要在条件中定义的局部变量。比如说, 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? 将给出一个解析错误,因为在if/之前读取x,y,除非修饰符。为了避免这种情况,我认为使用和而不是if和或而不是是非常常见的(至少对我来说),除非: x = a[2] and n = 3*(x**2) + 4

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

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?
将给出一个解析错误,因为在
if
/
之前读取
x
y
,除非
修饰符。为了避免这种情况,我认为使用
而不是
if
而不是
是非常常见的(至少对我来说),除非

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

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

如果其中一方的计算结果为true,则逻辑or返回true

除非
行相等,否则是否确定
行相等
(可能是,
行始终计算为true,因为
m=6*(y**2)+7*y+8
为true)

编辑:


不,我错了,看一看——这似乎是您正在寻找的替代方案,当出现此问题时,我会选择(并使用)这些替代方案:

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]

我刚刚意识到这两者之间是有区别的

if x = something then f(x) end          (1)


这是当
某物
取值
false
时。在这种情况下,(1)返回
nil
,而(2)返回
false

我意识到您的第二个选项可能没有那么糟糕。前两个选项的附加值是将变量赋值放在第一位,在使用它的语句之前读取它。我最常遇到的第一个。我不喜欢第三个。Ruby的
不是逻辑or。它返回第一个非nil或-false值(或最后一个值)。您真正谈论的是特定语言的通用编码样式。在Perl中,在
if
测试和简短的布尔测试中执行赋值是非常常见的,之后是
在某些操作中加入。这可能也是为什么Perl程序看起来也像行噪声的部分原因。:-)在Ruby中,我们倾向于不这样做,因为简洁性并没有带来太多好处,而且也没有那么明显/清楚什么意思会导致维护问题。我看到过一些建议,建议Perl开发人员停止那样编写,但有些人认为这样做很有男子气概,而其他人则在与旧习惯作斗争
x = something and f(x)                  (2)