问题描述:

Possible Duplicate:

What does ||= mean in Ruby?

Forgive me if this is a newby question but im reading a book on rails where the writer used this expression in a helper method:

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

Is this use of double pipes still a Boolean OR statement?

If so how does it work?

网友答案:

It's a conditional assignment. From 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
网友答案:

The code foo ||= bar is almost equivalent to foo = foo || bar. In Ruby (as in many languages, like JavaScript or Io) boolean operators are "guard" operators. Instead of always returning true or false, they evaluate to the value of the first operand that evaluates to a "truthy" value.

For example, this code foo = 1 || delete_all_files_from_my_computer() will not delete anything: foo will be set to 1 and the second operand won't even be evaluated.

In Ruby, the only "non-truthy" values are nil and false. So the code foo ||= bar will only evaluate bar and set foo to the result if foo is nil or false.

As instance variables default to nil when not set, code like @foo ||= bar is a common Ruby idiom to set the instance variable if it has not already been set.

网友答案:

You can think of it as short for:

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

@current_user gets evaluated first, if it is non-null then the OR returns the value of @current_user and does not call User.find_by_id.

相关阅读:
Top