Ruby:如何在返回哈希时删除“在字符串键中”

时间:2017-07-06 21:07:13

标签: arrays ruby hash

我正在尝试通过向元数组中添加元素来返回哈希,其中键是字符串,值是数组,例如:

    {"Fixnum"=>[1, 8], "Hash"=>[{7=>"einzeln", 5=>[13]}]}

但我想删除“在键中,就像这样:

    {Fixnum=>[1, 8], Hash=>[{7=>"einzeln", 5=>[13]}]}

显然我不能简单地使用.delete('“'),因为那时”和einzeln一样也会消失。我还尝试在将元素添加到值数组时冻结元素的.to_s形式,然后使用.delete,但它不起作用。我也没有找到迭代或抓取密钥并直接在密钥上使用.delete,因为密钥被冻结。

有没有这样做?

1 个答案:

答案 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,您可以使用FixnumHash类作为键,如下所示:

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