在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 2.5.0开始,你可以使用哈希#transform_keys或哈希#transform_keys!
{'a' => 1, 'b' => 2}.transform_keys(&:to_sym) #=> {:a => 1, :b => 2}
其他回答
这并不完全是一行程序,但是它将所有字符串键转换为符号,包括嵌套的符号:
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
这是一种深度象征物体的方法
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
facet的Hash#deep_rekey也是一个不错的选择,特别是:
如果你在项目中发现了其他糖的用途, 如果您更喜欢代码可读性而不是神秘的一行程序。
示例:
require 'facets/hash/deep_rekey'
my_hash = YAML.load_file('yml').deep_rekey
我们想要改变的数组。
strings = ["HTML", "CSS", "JavaScript", "Python", "Ruby"]
将一个新变量作为一个空数组,这样我们就可以。输入符号。
Symbols = []
在这里,我们定义了一个带有块的方法。
字符串。每个{|x| symbols.push(x.intern)}
代码结束。
因此,这可能是在Ruby中将字符串转换为数组中的符号的最直接的方法。创建一个字符串数组,然后创建一个新变量,并将该变量设置为空数组。然后选择第一个用“。”创建的数组中的每个元素。每个“的方法。然后使用分组代码来“。按下"新数组中的所有元素并使用".intern或.to_sym"将所有元素转换为符号。
符号更快,因为它们在代码中节省了更多的内存,并且只能使用一次。符号是哈希中最常用的键,这很好。我不是最好的ruby程序员,但这种形式的代码帮助了我很多。如果有人知道更好的方法,请分享,你也可以使用这个方法哈希!
这是为那些使用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也是递归包含的散列 返回符号化的哈希值 工作到位!