What does ||= (or-equals) mean in Ruby?
This question has been discussed so often on the Ruby mailing-lists and Ruby blogs that there are now even threads on the Ruby mailing-list whose only purpose is to collect links to all the other threads on the Ruby mailing-list that discuss this issue.
Here's one: The definitive list of ||= (OR Equal) threads and pages
If you really want to know what is going on, take a look at Section 11.4.2.3 "Abbreviated assignments" of the Ruby Language Draft Specification.
As a first approximation,
a ||= b
is equivalent to
a || a = b
and not equivalent to
a = a || b
However, that is only a first approximation, especially if a
is undefined. The semantics also differ depending on whether it is a simple variable assignment, a method assignment or an indexing assignment:
a ||= b
a.c ||= b
a[c] ||= b
are all treated differently.
What does ||= mean?
Basically, a ||= b
means assign b to a if a is null or undefined or false (i.e. false-ish value in ruby)
, it is similar to a = b unless a
, except it will always evaluate to the final value of a
(whereas a = b unless a
would result in nil
if a
was true-ish).
What does ||= mean?
It is an assignment operator which means: or assign this value to a variable.
So if you did something like x ||= y
this meansx || x = y
so if x is nil or false set x to be the value of y.
What does the operator ||= stand for in Ruby?
It assigns a value if not already assigned. Like this:
a = nil
a ||= 1
a = 1
a ||= 2
In the first example, a will be set to 1. In the second one, a will still be 1.
What does the '||=' operator do in ruby?
what does || do? If you have a and b then a || b
is true if and only if either a or b is true. It is the same with ||= this operator combines two operations '=' and '||'. So a ||= b
is equivelent to c || c = b
EDIT: so in your context ENV['ENVIRONMENT'] ||= 'test' means that if ENV['ENVIRONMENT'] is not nil and not false it will preserve its value, otherwise it will become 'test' and after that the new value of ENV['ENVIRONMENT'] is assigned to RACK_ENV
What does the ||= operand stand for in ruby
It is the shorthand for a logical OR operation. It is equivalent to:
a || a = b
Note: The above code sample has been corrected to reflect the true (if unintuitive) behavior if expanding a ||= b
. Thanks to the people who pointed that out for me. Here is the source
if a
evaluates to true it will remain as is, otherwise b
will be assigned to a
. In ruby nil
evaluates to false
, so you can see how this is useful for lazy loading and default value assignment.
Ruby: What does the !~ operator mean?
It is negation of =~
, a regex match.
"a" !~ /b/
# => true
It is useful when you want to check whether a string does not match a certain pattern. For example, if you want to check if string s
includes only numbers, then you can do:
s !~ /\D/
When do we use the ||= operator in Rails ? What is its significance?
Lets break it down:
@_current_user ||= {SOMETHING}
This is saying, set @_current_user
to {SOMETHING}
if it is nil
, false
, or undefined. Otherwise set it to @_current_user
, or in other words, do nothing. An expanded form:
@_current_user || @_current_user = {SOMETHING}
Ok, now onto the right side.
session[:current_user_id] &&
User.find(session[:current_user_id])
You usually see &&
with boolean only values, however in Ruby you don't have to do that. The trick here is that if session[:current_user_id]
is not nil, and User.find(session[:current_user_id])
is not nil, the expression will evaluate to User.find(session[:current_user_id])
otherwise nil.
So putting it all together in pseudo code:
if defined? @_current_user && @_current_user
@_current_user = @_current_user
else
if session[:current_user_id] && User.find(session[:current_user_id])
@_current_user = User.find(session[:current_user_id])
else
@_current_user = nil
end
end
What does - operator in Ruby mean?
That's a new syntax for lambda. You can also write it like this:
subject.post_source = lambda { new_post }
Here's how old and new versions look like with parameters (thanks to Michael Kohl for suggestion):
v_old = lambda {|a, b| a + b}
v_new = ->(a, b) { a + b}
v_old.call(1, 2) # => 3
v_new.call(3, 4) # => 7
||=' operator in Ruby
It's an assignment operator for 'Conditional Assignment'
See here -> http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators
Conditional assignment:
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
Operator ||= is a shorthand form of the expression:
x = x || "default"
EDIT:
After seeing OP's edit, the example is just an extension of this, meaning:
car = method_1 || method_2 || method_3 || method_4
Will assign the first non-nil or non-false return value of method_1, method_2, method_3, method_4 (in that order) to car
or it'll retain its old value.
Related Topics
Is Alias_Method_Chain Synonymous with Alias_Method
If Else Statements in .Html.Erb in Views
Rails: How to Get a File Extension/Postfix Based on the Mime Type
Best Way to Group by Date with Mongoid
Ruby: How to Generate CSV Files That Has Excel-Friendly Encoding
Counting Days Excluding Weekends
Help Understanding Yield and Enumerators in Ruby
Detect Rspec Test Failure on After Each Method
Rubocop Error 'Class Definition Is Too Long Ruby'
Printing to Screen in a Rake Task
How to Include a Yaml File Inside a Yaml File in Ruby
Write and Read a File with Utf-8 Encoding
<Rubygems> How to Change Gem Environment Settings
How Does Pack() and Unpack() Work in Ruby
Generating a Short Uuid String Using Uuidtools in Rails
How to Use Nokogiri::Xml::Reader to Parse Large Xml Files
Setting Up Facets in Elasticsearch with Searchkick Gem in Rails 4.1