Ruby是否有像Groovy那样的零值安全导航操作符的语法?
在Groovy中,有一种很好的处理空值的语法 例如,我可以执行if语句:Ruby是否有像Groovy那样的零值安全导航操作符的语法?,ruby,null,operators,Ruby,Null,Operators,在Groovy中,有一种很好的处理空值的语法 例如,我可以执行if语句: if (obj1?.obj2?.value) { } 即使obj1为null,这也不会引发NullPointerException(它的计算结果将为false) 这是非常方便的,所以我想知道是否有一个Ruby等价物我错过了 在rails应用程序中有对象#try 所以你可以 obj1.try(:obj2).try(:value) 或者使用块(如下面评论中所述) 更新 在ruby 2.3中,有这样一个操作符: obj&a
if (obj1?.obj2?.value) {
}
即使obj1为null,这也不会引发NullPointerException(它的计算结果将为false)
这是非常方便的,所以我想知道是否有一个Ruby等价物我错过了 在rails应用程序中有
对象#try
所以你可以
obj1.try(:obj2).try(:value)
或者使用块(如下面评论中所述)
更新
在ruby 2.3中,有这样一个操作符:
obj&.value&.foo
这与
obj&&obj.value&&obj.value.foo
try
是Ruby 2.3之前实现这一点的唯一标准方法。使用Ruby 2.3,您可以:
if obj1&.obj2&.value
end
此外,如果您具有哈希结构,则可以将.
运算符与以下内容一起使用:
到Ruby 2.3
语法为
obj1&.meth1&.meth2
Ruby 2.3将支持安全导航操作符:
obj1&.obj2&.value
谢谢!刚才还发现了AndandGem,它试图通过一种方法将其引入ruby:还没有稳定的版本,但是ruby的开发分支现在有了
?
操作符。请参阅或选择:obj.try{| obj | obj.value}
-块模式通常在IMHO中更具视觉意义。当您想对值执行某些操作(如调用方法)时,此块语法最有意义。解决此类问题的常见模式是。请注意,它是gem的一部分,也可以在Rails之外使用。“这和"... 当obj
为false
时,这是不正确的。因此,当我回答问题时,尝试是唯一的方法。那&。符号是在Ruby 2.3中添加的。没有必要进行下一票,请发表评论或进行编辑。我不确定你的下一票是否相关,但我只是进行了编辑,因为你在if语句中使用了JavaScript语法。
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
obj1&.obj2&.value