【问题标题】:Ruby: ignoring nil?Ruby:忽略零?
【发布时间】:2014-04-23 00:02:11
【问题描述】:

我正在尝试解析一堆 json 属性并将它们分配给一个哈希值。 json 有很多级别:

player[:position]=player["positions"]["primary_position"]["position"]["name"]

我遇到的问题是这些级别中的任何一个都可能是nil,这意味着我需要写四个单独的nil?检查只是为了提取值。

我不关心nil 的值——如果数组只是将它们记录为" " 或类似的东西就可以了。

有什么方法可以关闭nil 这种特殊类型的错误吗?或者我应该通过rescue 方法运行整个事情,该方法在nil 的情况下返回我想要的值?

【问题讨论】:

  • 如果nil,那么预期输出?假设layer["positions"]["primary_position"]nil,那么下一步你在想什么?我需要这些信息。

标签: ruby json hash


【解决方案1】:
player[:position]=player["positions"]["primary_position"]["position"]["name"] rescue " "

这将返回所需的值,如果某些东西为零,则返回“”。

【讨论】:

  • 在完整的救援块中这是正确的,但如果您只想返回一个空字符串,则不需要。这种方法比整个块更优雅,对吗?
【解决方案2】:

您可以使用andand gem,它类似于Maybe monad

player[:position] = player.andand["positions"].andand["primary_position"].andand["position"].andand["name"]

这是一个受保护的方法调用。如果结果不是nil,它只会继续向对象发送方法,否则返回nil。这样,当其中一个返回 nil 时,链式调用就会停止。

【讨论】:

    【解决方案3】:

    通常的做法是这样使用inject

    path  = %w[positions primary_position position name]
    value = path.inject(player) { |h, k| h && h[k] }
    

    您可以调整h && h[k] 测试以适应您的特定需求,假设您不必担心h 中的非哈希值。您可以根据需要进行详细说明。

    如果您一直在做这种事情,您甚至可以将其修补到 Hash

    class Hash
      def follow_path(*path)
        # You could also path.flatten if you're not expecting Array keys
        path.inject(self) { |h, k| h && h[k] }
      end
    end
    
    value = person.follow_path(*%w[positions primary_position position name])
    

    或者把它扔到一个私有的实用方法中:

    private
    
      def follow_path(h, *path)
        # Assuming you're not using Array keys...
        path.flatten.inject(h) { |h, k| h && h[k] }
      end
    

    然后:

    value = follow_path(person, %w[positions primary_position position name])
    

    【讨论】:

      猜你喜欢
      • 2011-07-17
      • 2020-12-10
      • 1970-01-01
      • 2020-05-19
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多