Update 1: The article was translated to Japanese
Update 2: This post is featured in RubyWeekly #374
&. 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.