Jean Barmash
Jean Barmash

Reputation: 4789

Does Ruby have syntax for safe navigation operator of nil values, like in Groovy?

In Groovy, there is a nice syntax for working with null values.

For example, I can do an if statement:

if (obj1?.obj2?.value) {

}

This will not throw a NullPointerException even if obj1 is null (it will evaluate to false).

This is something that's very convenient, so wondering if there is a Ruby equivalent I missed.

Upvotes: 24

Views: 9382

Answers (4)

Javid Jamae
Javid Jamae

Reputation: 9009

try was the only standard way to do this before Ruby 2.3. With Ruby 2.3 you can do:

if obj1&.obj2&.value

end

Also, if you have a hash structure, you can use the _. operator with Hashie:

require 'hashie'
myhash = Hashie::Mash.new({foo: {bar: "blah" }})

myhash.foo.bar
=> "blah"    

myhash.foo?
=> true

# use "underscore dot" for multi-level testing
myhash.foo_.bar?
=> true
myhash.foo_.huh_.what?
=> false

Upvotes: 1

jeremywoertink
jeremywoertink

Reputation: 2341

This has been added to Ruby 2.3.

The syntax is obj1&.meth1&.meth2.

Upvotes: 8

Ruby 2.3 will have support for the safe navigation operator:

obj1&.obj2&.value

https://www.ruby-lang.org/en/news/2015/11/11/ruby-2-3-0-preview1-released/

Upvotes: 2

Ismael
Ismael

Reputation: 16730

In a rails app there is Object#try

So you can do

obj1.try(:obj2).try(:value)

or with a block (as said on comments bellow)

obj.try {|obj| obj.value}

UPDATE

In ruby 2.3 there is operator for this:

obj&.value&.foo

Which is the same as obj && obj.value && obj.value.foo

Upvotes: 26

Related Questions