【问题标题】:Does Ruby have syntax for safe navigation operator of nil values, like in Groovy?Ruby 是否具有用于 nil 值的安全导航运算符的语法,就像在 Groovy 中一样?
【发布时间】:2012-06-22 20:56:24
【问题描述】:

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

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

if (obj1?.obj2?.value) {

}

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

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

【问题讨论】:

标签: ruby null operators


【解决方案1】:

在 Rails 应用程序中有 Object#try

所以你可以这样做

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

或用一个块(如下面的 cmets 所述)

obj.try {|obj| obj.value}

更新

在 ruby​​ 2.3 中有这样的操作符:

obj&.value&.foo

和obj && obj.value && obj.value.foo一样

【讨论】:

  • 或者:obj.try {|obj| obj.value} - 恕我直言,块模式通常更具视觉意义。
  • 当你想对值做一些事情时,这种块语法最有意义,比如调用它的方法。
  • 解决此类问题的常见模式是null objects。
  • 请注意,Object#try 是 ActiveSupport gem 的一部分,它也可以在 Rails 之外使用。
  • “与“相同”...当obj 为false 时,情况并非如此。
【解决方案2】:

This has been added 到 Ruby 2.3。

语法是obj1&.meth1&.meth2。

【讨论】:

    【解决方案3】:

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

    obj1&.obj2&.value
    

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

    【讨论】:

      【解决方案4】:

      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
      

      【讨论】:

      • 所以,当我回答问题时,尝试是唯一的方法。这 &。符号只是在 Ruby 2.3 中添加的。否决票并不是真正必要的,我们将不胜感激。
      • 不确定您的否决票是否相关,但我刚刚进行了编辑,因为您在 if 语句中使用了 JavaScript 语法。
      猜你喜欢
      • 2016-04-07
      • 2012-03-13
      • 1970-01-01
      • 2017-12-22
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      相关资源
      最近更新 更多