Update 1: The article was translated to Japanese
Update 2: This post is featured in RubyWeekly #374
The &.
operator, added to Ruby 2.3, is handy and I’ve cleaned a lot of code with it. You can use it in conjunction with default operators as described in Ruby's New &.!= Operator.
Recently I introduced a bug when using &.
. First we had:
if start_date && start_date < start_of_month && end_date.nil?
# …
end
I refactored it to use &.
:
if start_date &.< start_of_month && end_date.nil?
# …
end
The new version looked cleaner. But do you see the bug? Have a look with parenthesis to see the order of execution:
if start_date &.< (start_of_month && end_date.nil?)
# …
end
The issue is that after I introduced &.
, the special operator <
became a normal method call. The right hand side of &.<
are considered to be method arguments and are executed first.
To fix it we must wrap the first part with parenthesis:
if (start_date &.< start_of_month) && end_date.nil?
# …
end
The next time you refactor to &.
operator, keep in mind the change of the behavior.