Ruby中的’|| =’运算符
有人可以向我解释以下Ruby代码的含义吗? (我在一个人的项目中看到了这段代码):
car ||= (method_1 || method_2 || method_3 || method_4)
上面的代码和下面的代码有什么区别?
car = method_1 || method_2 || method_3 || method_4
———-更新————–
好的,在阅读@ Dave的解释之后,我得到了||=
运算符的含义,我的下一个问题是,如果method_2
, method_3
和method_4
返回一个值,哪一个值将分配给car
? (我猜car
最初是零 )
它是’条件赋值’的赋值运算符
看这里 – > http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators
条件转让:
x = find_something() #=>nil x ||= "default" #=>"default" : value of x will be replaced with "default", but only if x is nil or false x ||= "other" #=>"default" : value of x is not replaced if it already is other than nil or false
运算符|| =是表达式的简写forms:
x = x || "default"
编辑:
在看到OP的编辑之后,这个例子只是这个的扩展,意思是:
car = method_1 || method_2 || method_3 || method_4
将method_1,method_2,method_3,method_4(按此顺序)的第一个非零或非假返回值分配给car
或者它将保留其旧值。
car ||= (method_1 || method_2)
相当于
car = (car || (method_1 || method_2))
一般来说,
x op= y
手段
x = x op y
如果您的价值car
已经设置, ||=
运算符首先检查。 如果car
返回nil,它将在右侧分配第一个值,该值不返回nil
或false
。
所以,从上面给出你的例子,如果你给汽车分配一个值
car = "BMW"
并且你执行代码片段,汽车的价值仍将是“宝马”;
如果method_1返回(例如)字符串"Value from Method 1"
并且car为nil
或false
,则将此字符串car分配给car
car = nil car ||= (method_1 || method_2) car # => "Value from Method 1"
如果method_1也返回nil
/ false
,它将检查method_2中的值,依此类推,直到它获得某种真值
与第二个代码片段的区别在于,在||=
的情况下,将首先评估变量car
,如果返回nil或false则设置。
如果仅使用=
,则不会进行评估,并且将汽车设置为右侧的第一个值,该值不返回nil或false。
– 更新 –
要回答您的更新问题,将从左到右评估右侧的值,因此将分配第一个不返回nil
或false
值。
car = nil # method_1 => "nil" # method_2 => "false" # method_3 => "value method 3" # method_4 => "I won't be called" car ||= (method_1 || method_2 || method_3 || method_4) # => "value method 3"
car ||= (method_1 || method_2 || method_3 || method_4)
如果汽车最初不是零,汽车将在此声明运行后保留其价值。
如果在此声明之前汽车为零,则从method_1,method_2,…返回的第一个非零值将被分配给汽车。
car = method_1 || method_2 || method_3 || method_4
在这种情况下,即使汽车在此语句运行之前已经具有非零值,汽车将被重新分配第一个非零值以返回方法
car || =(method_1 || method_2)
等于
car = car || (method_1 || method_2)
简而言之,它等于:
car = car || method_1 || method_2
更详细地说,它有点复杂:
car = (defined?(car) && car) || (method_1 || method_2)
在任何情况下, ||=
之后的内容只会在car
:
- 尚未定义
- 是
false
-
nil
回答更新:
method_2被赋值,因为它是列表中的第一个非false,非nil值。