Does Ruby have syntax for safe navigation operator

2019-02-11 18:43发布

问题:

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.

回答1:

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



回答2:

This has been added to Ruby 2.3.

The syntax is obj1&.meth1&.meth2.



回答3:

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/



回答4:

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