在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']
当前回答
更简洁的是:
Hash[my_hash.map{|(k,v)| [k.to_sym,v]}]
其他回答
更短的一行代码:
my_hash.inject({}){|h,(k,v)| h.merge({ k.to_sym => v}) }
我真的很喜欢马什宝石。
你可以使用mash['key'],或者mash[:key],或者mash.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
对于Ruby中YAML的特定情况,如果键以':'开头,它们将被自动作为符号存储。
require 'yaml' require 'pp' yaml_str = " connections: - host: host1.example.com port: 10000 - host: host2.example.com port: 20000 " yaml_sym = " :connections: - :host: host1.example.com :port: 10000 - :host: host2.example.com :port: 20000 " pp yaml_str = YAML.load(yaml_str) puts yaml_str.keys.first.class pp yaml_sym = YAML.load(yaml_sym) puts yaml_sym.keys.first.class
输出:
# /opt/ruby-1.8.6-p287/bin/ruby ~/test.rb {"connections"=> [{"port"=>10000, "host"=>"host1.example.com"}, {"port"=>20000, "host"=>"host2.example.com"}]} String {:connections=> [{:port=>10000, :host=>"host1.example.com"}, {:port=>20000, :host=>"host2.example.com"}]} Symbol
这并不完全是一行程序,但是它将所有字符串键转换为符号,包括嵌套的符号:
def recursive_symbolize_keys(my_hash)
case my_hash
when Hash
Hash[
my_hash.map do |key, value|
[ key.respond_to?(:to_sym) ? key.to_sym : key, recursive_symbolize_keys(value) ]
end
]
when Enumerable
my_hash.map { |value| recursive_symbolize_keys(value) }
else
my_hash
end
end