我正在尝试通过向元数组中添加元素来返回哈希,其中键是字符串,值是数组,例如:
{"Fixnum"=>[1, 8], "Hash"=>[{7=>"einzeln", 5=>[13]}]}
但我想删除“在键中,就像这样:
{Fixnum=>[1, 8], Hash=>[{7=>"einzeln", 5=>[13]}]}
显然我不能简单地使用.delete('“'),因为那时”和einzeln一样也会消失。我还尝试在将元素添加到值数组时冻结元素的.to_s形式,然后使用.delete,但它不起作用。我也没有找到迭代或抓取密钥并直接在密钥上使用.delete,因为密钥被冻结。
有没有这样做?
答案 0 :(得分:2)
哈希键实际上没有双引号("
),你看到它们是因为键是字符串而ruby会显示所有字符串用双引号括起来;所以你不能(也不需要)删除它们。
你可以做的是使用符号而不是字符串作为哈希键(这是Ruby的最佳实践)。
为此,您可以使用 symbols 创建哈希,如下所示:
my_hash = {Fixnum: [1, 8], Hash: [{7=>"einzeln", 5=>[13]}]}
#=> {:Fixnum=>[1, 8], :Hash=>[{7=>"einzeln", 5=>[13]}]}
如果您无法控制哈希的键,则可以将键转换为 symbols ,如下所示:
my_hash = {"Fixnum"=>[1, 8], "Hash"=>[{7=>"einzeln", 5=>[13]}]}
Hash[my_hash.map{ |k, v| [k.to_sym, v] }]
#=> {:Fixnum=>[1, 8], :Hash=>[{7=>"einzeln", 5=>[13]}]}
或者,作为pointed out by mu is too short,您可以使用Fixnum
和Hash
类作为键,如下所示:
my_hash = {Fixnum => [1, 8], Hash => [{7=>"einzeln", 5=>[13]}]}
#=> {Fixnum=>[1, 8], Hash=>[{7=>"einzeln", 5=>[13]}]}
同样,如果你无法控制哈希的键,你可以将键转换为它们的类,比如 1 :
my_hash = {"Fixnum"=>[1, 8], "Hash"=>[{7=>"einzeln", 5=>[13]}]}
Hash[my_hash.map{ |k, v| [eval(k.to_s), v] }]
#=> {Fixnum=>[1, 8], Hash=>[{7=>"einzeln", 5=>[13]}]}
1 请注意,只有在完全信任/控制传递给它的值时,才建议使用eval
。