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

这在解析YAML时非常方便。

my_hash = YAML.load_file('yml')

我希望能够使用:

my_hash[:key] 

而不是:

my_hash['key']

当前回答

我真的很喜欢马什宝石。

你可以使用mash['key'],或者mash[:key],或者mash.key

其他回答

我真的很喜欢马什宝石。

你可以使用mash['key'],或者mash[:key],或者mash.key

@igorsales answer的修改

class Object
  def deep_symbolize_keys
    return self.inject({}){|memo,(k,v)| memo[k.to_sym] = v.deep_symbolize_keys; memo} if self.is_a? Hash
    return self.inject([]){|memo,v    | memo           << v.deep_symbolize_keys; memo} if self.is_a? Array
    return self
  end
end

这里有很多答案,但rails函数的一个方法是hash.symbolize_keys

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

不需要Rails和工作与Ruby >1.9

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

在Ruby >= 2.5 (docs)中,你可以使用:

my_hash.transform_keys(&:to_sym)

使用旧的Ruby版本?下面是一个单行程序,它将哈希复制到一个新的哈希中,并将键符号化:

my_hash = my_hash.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}

使用Rails,您可以使用:

my_hash.symbolize_keys
my_hash.deep_symbolize_keys