在Ruby中,将哈希中的所有键从字符串转换为符号的(最快/最干净/直接)方法是什么?

这在解析YAML时非常方便。

my_hash = YAML.load_file('yml')

我希望能够使用:

my_hash[:key] 

而不是:

my_hash['key']

当前回答

如果你正在使用json,并且想要使用它作为哈希,在核心Ruby中你可以这样做:

json_obj = JSON.parse(json_str, symbolize_names: true)

symbolize_names:如果设置为true,将返回JSON对象中名称(键)的符号。否则返回字符串。字符串是默认的。

Doc: Json#解析symbolize_names

其他回答

如果您需要这样做的原因是因为您的数据最初来自JSON,那么您可以跳过任何解析,只需在摄取JSON时传入:symbolize_names选项即可。

不需要Rails和工作与Ruby >1.9

JSON.parse(my_json, :symbolize_names => true)

如果你想要香草红宝石解决方案,因为我没有访问ActiveSupport这里是深符号解决方案(非常类似于以前的)

    def deep_convert(element)
      return element.collect { |e| deep_convert(e) } if element.is_a?(Array)
      return element.inject({}) { |sh,(k,v)| sh[k.to_sym] = deep_convert(v); sh } if element.is_a?(Hash)
      element
    end

如果你在使用Rails,这里有一个更好的方法:

params.symbolize_keys

最后。

如果你不是,那就抄袭他们的代码(链接中也有):

myhash.keys.each do |key|
  myhash[(key.to_sym rescue key) || key] = myhash.delete(key)
end

这是嵌套哈希的一行代码

def symbolize_keys(hash)
  hash.each_with_object({}) { |(k, v), h| h[k.to_sym] = v.is_a?(Hash) ? symbolize_keys(v) : v }
end

参数个数。Symbolize_keys也可以工作。这个方法将哈希键转换为符号并返回一个新的哈希值。