What is the difference between the && and and operators in Ruby?
8 Answers
and is the same as && but with lower precedence. They both use short-circuit evaluation.
WARNING: and even has lower precedence than = so you'll usually want to avoid and. An example when and should be used can be found in the Rails Guide under "Avoiding Double Render Errors".
The practical difference is binding strength, which can lead to peculiar behavior if you're not prepared for it:
foo = :foo
bar = nil
a = foo and bar
# => nil
a
# => :foo
a = foo && bar
# => nil
a
# => nil
a = (foo and bar)
# => nil
a
# => nil
(a = foo) && bar
# => nil
a
# => :fooThe same thing works for || and or.
The Ruby Style Guide says it better than I could:
Use &&/|| for boolean expressions, and/or for control flow. (Rule of thumb: If you have to use outer parentheses, you are using the wrong operators.)
# boolean expression
if some_condition && some_other_condition do_something
end
# control flow
document.saved? or document.save! 3 || and && bind with the precedence that you expect from boolean operators in programming languages (&& is very strong, || is slightly less strong).
and and or have lower precedence.
For example, unlike ||, or has lower precedence than =:
> a = false || true => true
> a => true
> a = false or true => true
> a => falseLikewise, unlike &&, and also has lower precedence than =:
> a = true && false => false
> a => false
> a = true and false => false
> a => true What's more, unlike && and ||, and and or bind with equal precedence:
> !puts(1) || !puts(2) && !puts(3)
1 => true
> !puts(1) or !puts(2) and !puts(3)
1
3 => true
> !puts(1) or (!puts(2) and !puts(3))
1 => trueThe weakly-binding and and or may be useful for control-flow purposes: see .
and has lower precedence than &&.
But for an unassuming user, problems might occur if it is used along with other operators whose precedence are in between, for example, the assignment operator:
def happy?() true; end
def know_it?() true; end
todo = happy? && know_it? ? "Clap your hands" : "Do Nothing"
todo
# => "Clap your hands"
todo = happy? and know_it? ? "Clap your hands" : "Do Nothing"
todo
# => true 2 and has lower precedence, mostly we use it as a control-flow modifier such as if:
next if widget = widgets.popbecomes
widget = widgets.pop and nextFor or:
raise "Not ready!" unless ready_to_rock?becomes
ready_to_rock? or raise "Not ready!"I prefer to use if but not and, because if is more intelligible, so I just ignore and and or.
Refer to "Using “and” and “or” in Ruby" for more information.
I don't know if this is Ruby intention or if this is a bug but try this code below. This code was run on Ruby version 2.5.1 and was on a Linux system.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true 4 and checks only first condition and gives result on other hand && strongly checks both conditions and gives logical result.