22

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

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

if (obj1?.obj2?.value) {

}

即使 obj1 为 null(它将评估为 false),这也不会引发 NullPointerException。

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

4

4 回答 4

24

在 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

于 2012-06-22T21:11:29.060 回答
6

这已添加到 Ruby 2.3。

语法是obj1&.meth1&.meth2.

于 2015-10-23T16:55:19.023 回答
3

Ruby 2.3 将支持安全导航运算符:

obj1&.obj2&.value

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

于 2015-11-13T11:33:32.083 回答
2

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
于 2013-12-18T19:05:10.250 回答