【问题标题】:using an alias name for hash key value使用哈希键值的别名
【发布时间】:2014-05-19 05:29:43
【问题描述】:

我有一些我收到的 json 数据,并且我将 JSON.parse 转换为哈希。哈希键名称是整数字符串,如data["0"]data["1"]data["2"] 等......其中每个值对应一个状态。就像 0 => 开始,1 => 停止,2 => 重新开始。

我无法更改源 json 数据以使密钥更具可读性。每个哈希将有 5 对对应于 5 个不同的状态。

我想知道是否有一种好方法可以将数字别名为有意义的名称,因此在引用哈希键值时我不必使用数字。

目前我正在使用像下面这样的常量,但我想可能会有更好、更 Ruby 的方式。使用另一个哈希或结构,以便我可以使用 data[STATES.start] 或其他什么?

STATE_START     =       "0"
STATE_STOP      =       "1"
STATE_RESTART   =       "2"

data = JSON.parse value
puts data[STATE_START]

谢谢

【问题讨论】:

    标签: ruby hash


    【解决方案1】:

    我认为常量很好。但是,如果您想稍微修改一下这段代码,例如,您可以将源哈希包装在一个可以转换方法名称的对象中。

    class MyHash
      def initialize(hash)
        @hash = hash
      end
    
      MAPPING = {
        start:   '0',
        stop:    '1',
        restart: '2',
      }
    
      # dynamically define methods like
      #
      # def start
      #   @hash['0']
      # end
      #
      # or you can use method_missing  
      MAPPING.each do |method_name, hash_key|
        define_method method_name do
          @hash[hash_key]
        end
      end
    end
    
    mh = MyHash.new({'0' => 'foo', '1' => 'bar'})
    
    mh.start # => "foo"
    mh.stop # => "bar"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2013-03-22
      • 1970-01-01
      相关资源
      最近更新 更多