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
foo ||= bar is almost equivalent to
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
false. So the code
foo ||= bar will only evaluate
bar and set
foo to the result if
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.