Ruby变量赋值中的双管符号?

时间:2010-12-21 14:38:17

标签: ruby boolean variable-assignment

  

可能重复:
  What does ||= mean in Ruby?

请原谅我,如果这是一个新问题,但我正在读一本关于作者在辅助方法中使用这个表达式的轨道上的书:

@current_user ||= User.find_by_id(session[:user_id])

双管道的使用是否仍然是布尔OR语句?

如果是这样,它是如何运作的?

3 个答案:

答案 0 :(得分:55)

这是一项有条件的任务。来自here

 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

答案 1 :(得分:18)

代码foo ||= bar几乎等同于foo = foo || bar。在Ruby中(如在许多语言中,如JavaScript或Io),布尔运算符是“保护”运算符。它们不是总是返回truefalse,而是评估第一个操作数的值,该操作数的值是“truthy”值。

例如,此代码foo = 1 || delete_all_files_from_my_computer()不会删除任何内容:foo将设置为1,第二个操作数甚至不会被评估

在Ruby中,唯一的“非真实”值是nilfalse。因此,如果foo ||= barbarfoo,代码foo将仅评估nil并将false设置为结果。

由于实例变量在未设置时默认为nil,因此@foo ||= bar之类的代码是设置实例变量的常用Ruby习惯用法(如果尚未设置)。

答案 2 :(得分:7)

您可以将其视为简称:

@current_user = @current_user || User.find_by_id(session[:user_id])
首先评估

@current_user,如果它是非null,则OR返回@ current_user的值,并且不调用User.find_by_id。