Ruby是否具有nil值的安全导航操作符的语法,比如Groovy?

时间:2012-06-22 20:56:25

标签: ruby null operators

在Groovy中,有一个很好的语法来处理空值。

例如,我可以做一个if语句:

if (obj1?.obj2?.value) {

}

即使obj1为null(它将评估为false),也不会抛出NullPointerException。

这是非常方便的,所以想知道我是否错过了Ruby等价物。

4 个答案:

答案 0 :(得分:23)

在rails应用中,有Object#try

所以你可以做到

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

或带有一个块(如下面的评论所述)

obj.try {|obj| obj.value}

<强>更新

在ruby 2.3中有运营商:

obj&.value&.foo

obj && obj.value && obj.value.foo

相同

答案 1 :(得分:6)

This has been added到Ruby 2.3。

语法为obj1&.meth1&.meth2

答案 2 :(得分:3)

Ruby 2.3将支持安全导航操作符:

obj1&.obj2&.value

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

答案 3 :(得分:2)

try是在Ruby 2.3之前执行此操作的唯一标准方法。使用Ruby 2.3,您可以:

if obj1&.obj2&.value

end

此外,如果您有哈希结构,则可以将_.运算符与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