`nil.&to_s` evaluates to false
ruby 2.3 introducted the Safe Naviation Operator &.
intended to make nil checks less verbose, simulating the functionality of the Rails introduced try
method.
This helps to prevent unwanted NoMethodError
s
> 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 to_s
?
> nil.&to_s
false
This breaks expectations. This statement is equivalent to nil & to_s
.
> nil & to_s
false
Ruby defines &
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.
So with 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.