Ruby中的’|| =’运算符

有人可以向我解释以下Ruby代码的含义吗? (我在一个人的项目中看到了这段代码):

car ||= (method_1 || method_2 || method_3 || method_4) 

上面的代码和下面的代码有什么区别?

 car = method_1 || method_2 || method_3 || method_4 

———-更新————–

好的,在阅读@ Dave的解释之后,我得到了||=运算符的含义,我的下一个问题是,如果method_2method_3method_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,它将在右侧分配第一个值,该值不返回nilfalse

所以,从上面给出你的例子,如果你给汽车分配一个值

 car = "BMW" 

并且你执行代码片段,汽车的价值仍将是“宝马”;

如果method_1返回(例如)字符串"Value from Method 1"并且car为nilfalse ,则将此字符串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。

– 更新 –

要回答您的更新问题,将从左到右评估右侧的值,因此将分配第一个不返回nilfalse值。

 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值。