ruby 2.3 introducted the Safe Naviation Operator
&. intended to make nil checks less verbose, simulating the functionality of the Rails introduced
This helps to prevent unwanted
> nil.do_something NoMethodError (undefined method `do_something' for nil:NilClass) > nil&.do_something nil
What happens when you type the
& on the right side of the
> nil.&do_something NameError (undefined local variable or method `do_something' for main:Object)
Normally you’d get an error, because
do_something isn’t defined, but what if you are calling a method available on everything like
> nil.&to_s false
This breaks expectations. This statement is equivalent to
nil & to_s.
> nil & to_s false
& as a method on nil.
> nil.method(:&) #<Method: NilClass#&>
This method in the documentation is defined as:
And—Returns false. obj is always evaluated as it is the argument to a method call—there is no short-circuit evaluation in this case.
nil.&to_s you’re calling the
& operator as a method and passing the result of
to_s called on the
main object, but it doesn’t matter because
nil.& always evaluates to false.