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)