Ruby's New &.!= Operator

Well, it’s actually two operators. Sue me. The 2.3.0 release of Ruby included the safe navigation operator, &.. It does the same thing as try! in Rails. You can chain method calls together and bail early if you hit a nil.

In Ruby some things you don’t normally think of as method calls are in fact just that. For example, operators like !=.

A Brief Overview of Safe Navigation

Let’s say we have an array of integers. We want to know if the first one is positive. To check we might do something like:

> some_array.first.positive?
# => true

Note: positive? is another new 2.3.0 method.

What happens if some_array is empty?

> [].first.positive?
# => NoMethodError: undefined method `positive?' for nil:NilClass

The call to first returns nil and nil doesn’t have a positive? method. Before 2.3.0 we might have done something like:

(value = some_array.first) && value.positive?

Now we can use &. to solve our problem.

some_array.first&.positive?

If first returns nil then the entire expression returns nil. If not then we’ll continue down the method chain and call positive?.

Brilliant or Abusive?

I run libgrader.com which helps Ruby developers find quality libraries. Two pieces of data that I record for each library are homepage and source code URLs. On occasion they turn out to be the same link. In that case, to reduce noise, I only show the homepage. In the template I show the source URL if it exists and is different than the homepage.

if lib.source_url && lib.source_url != lib.homepage_url
  # display source url
end

I can use the safe navigation operator to perform the same check.

if lib.source_url &.!= lib.homepage_url
  # display source url
end

I like that I’ve DRYed my code. Less code means less chance for me or future me to muck it up. On the other hand, I value readability. At the moment it just looks odd. Someone who’s not seen it before would have a hard time figuring out what it means. Anyone who’s tried to google code symbols can attest to how frustrating it can be. Still, we use things like !! and eventually everyone gets used to it. I’m going to leave it and see if I get used to it. In the near future, maybe code like &.&, &.<<, and &.+ will be something we’re all used to.