在 Groovy 中,有一个很好的语法来处理空值。
例如,我可以做一个 if 语句:
if (obj1?.obj2?.value) {
}
即使 obj1 为 null(它将评估为 false),这也不会引发 NullPointerException。
这是非常方便的东西,所以想知道是否有我错过的 Ruby 等价物。
在 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
这已添加到 Ruby 2.3。
语法是obj1&.meth1&.meth2
.
Ruby 2.3 将支持安全导航运算符:
obj1&.obj2&.value
https://www.ruby-lang.org/en/news/2015/11/11/ruby-2-3-0-preview1-released/
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