在Ruby中,将哈希中的所有键从字符串转换为符号的(最快/最干净/直接)方法是什么?
这在解析YAML时非常方便。
my_hash = YAML.load_file('yml')
我希望能够使用:
my_hash[:key]
而不是:
my_hash['key']
在Ruby中,将哈希中的所有键从字符串转换为符号的(最快/最干净/直接)方法是什么?
这在解析YAML时非常方便。
my_hash = YAML.load_file('yml')
我希望能够使用:
my_hash[:key]
而不是:
my_hash['key']
当前回答
从Psych 3.0开始,你可以添加symbolize_names:选项
心理。加载("——\n foo: bar") # => {"foo"=>"bar"}
心理。加载("——\n foo: bar", symbolize_names: true) # => {:foo=>"bar"}
注意:如果你的Psych版本低于3.0,symbolize_names:将被默默地忽略。
我的Ubuntu 18.04自带ruby 2.5.1p57
其他回答
会像下面这样工作吗?
new_hash = Hash.new
my_hash.each { |k, v| new_hash[k.to_sym] = v }
它会复制哈希值,但大多数时候你不会在意。可能有一种不复制所有数据的方法。
我喜欢这一行,当我不使用Rails时,因为这样我就不必在处理它时进行第二个哈希并持有两组数据:
my_hash = { "a" => 1, "b" => "string", "c" => true }
my_hash.keys.each { |key| my_hash[key.to_sym] = my_hash.delete(key) }
my_hash
=> {:a=>1, :b=>"string", :c=>true}
哈希#delete返回已删除键的值
我真的很喜欢马什宝石。
你可以使用mash['key'],或者mash[:key],或者mash.key
这是为那些使用mruby并且没有定义任何symbolize_keys方法的人准备的:
class Hash
def symbolize_keys!
self.keys.each do |k|
if self[k].is_a? Hash
self[k].symbolize_keys!
end
if k.is_a? String
raise RuntimeError, "Symbolizing key '#{k}' means overwrite some data (key :#{k} exists)" if self[k.to_sym]
self[k.to_sym] = self[k]
self.delete(k)
end
end
return self
end
end
方法:
仅表示字符串类型的键 如果符号化字符串意味着丢失一些信息(覆盖哈希的一部分)将引发RuntimeError symbolic也是递归包含的散列 返回符号化的哈希值 工作到位!
这是一种深度象征物体的方法
def symbolize(obj)
return obj.inject({}){|memo,(k,v)| memo[k.to_sym] = symbolize(v); memo} if obj.is_a? Hash
return obj.inject([]){|memo,v | memo << symbolize(v); memo} if obj.is_a? Array
return obj
end