在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']
当前回答
在ruby中,我发现这是最简单、最容易理解的将字符串键转换为符号的方法:
my_hash.keys.each { |key| my_hash[key.to_sym] = my_hash.delete(key)}
对于散列中的每个键,我们调用delete函数将其从散列中删除(delete也返回与被删除的键相关的值),并立即将其设置为符号化的键。
其他回答
如果你在使用Rails,这里有一个更好的方法:
params.symbolize_keys
最后。
如果你不是,那就抄袭他们的代码(链接中也有):
myhash.keys.each do |key|
myhash[(key.to_sym rescue key) || key] = myhash.delete(key)
end
对于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
我们想要改变的数组。
strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
将一个新变量作为一个空数组,这样我们就可以。输入符号。
Symbols = []
在这里,我们定义了一个带有块的方法。
字符串。每个{|x| symbols.push(x.intern)}
代码结束。
因此,这可能是在Ruby中将字符串转换为数组中的符号的最直接的方法。创建一个字符串数组,然后创建一个新变量,并将该变量设置为空数组。然后选择第一个用“。”创建的数组中的每个元素。每个“的方法。然后使用分组代码来“。按下"新数组中的所有元素并使用".intern或.to_sym"将所有元素转换为符号。
符号更快,因为它们在代码中节省了更多的内存,并且只能使用一次。符号是哈希中最常用的键,这很好。我不是最好的ruby程序员,但这种形式的代码帮助了我很多。如果有人知道更好的方法,请分享,你也可以使用这个方法哈希!
这并不完全是一行程序,但是它将所有字符串键转换为符号,包括嵌套的符号:
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
类似于前面的解决方案,但写得有点不同。
This allows for a hash that is nested and/or has arrays. Get conversion of keys to a string as a bonus. Code does not mutate the hash been passed in. module HashUtils def symbolize_keys(hash) transformer_function = ->(key) { key.to_sym } transform_keys(hash, transformer_function) end def stringify_keys(hash) transformer_function = ->(key) { key.to_s } transform_keys(hash, transformer_function) end def transform_keys(obj, transformer_function) case obj when Array obj.map{|value| transform_keys(value, transformer_function)} when Hash obj.each_with_object({}) do |(key, value), hash| hash[transformer_function.call(key)] = transform_keys(value, transformer_function) end else obj end end end