使用哈希键值的别名

时间:2014-04-07 05:50:50

标签: ruby hash

我收到一些json数据,并且我JSON.parse为哈希。散列键名称是整数字符串,如data["0"]data["1"]data["2"]等...其中每个值对应一个状态。喜欢0 => START,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]

由于

1 个答案:

答案 0 :(得分: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"