Ruby - 更新哈希键以去除空格

Ron*_*pes 1 ruby

我想从我的哈希中删除空格,所以如果我有

{"my hash key": 12}
Run Code Online (Sandbox Code Playgroud)

我想得到

{"myhashkey": 12}
Run Code Online (Sandbox Code Playgroud)

我找到了一些方法来剥离这些值,但在键上遇到了问题.当我尝试

 my_hash.each_key{|k| k.gsub!(' ', '')}
Run Code Online (Sandbox Code Playgroud)

我收到了错误:

RuntimeError: can't modify frozen String
Run Code Online (Sandbox Code Playgroud)

如果只使用gsub(没有'!')它运行正常,但不起作用.

那么实现这一目标的最佳方法是什么?谢谢!

Ale*_*kin 6

散列中的键被冻结(如错误消息所示),因此无法在原位修改它们.必须使用新密钥构造新哈希:

{"my hash key" => 12}.map { |k, v| [k.delete(' '), v] }.to_h
#? {"myhashkey"=>12}
Run Code Online (Sandbox Code Playgroud)

NB!有一个陷阱:你可能会失去一些价值!

{"a b c" => 42, "abc" => :foo}.
  map { |k, v| [k.delete(' '), v] }.to_h
#? {"abc"=>:foo}
Run Code Online (Sandbox Code Playgroud)


Ste*_*fan 5

你可以使用transform_keys:

my_hash = { 'my hash key': 12 }
#=> {:"my hash key"=>12}

my_hash.transform_keys { |k| k.to_s.delete(' ').to_sym }
#=> {:myhashkey=>12}
Run Code Online (Sandbox Code Playgroud)

to_s/ to_sym转换是必要的,因为Symbol没有实现delete.如果您的密钥实际上是字符串,则可以省略它:

my_hash = { 'my hash key' => 12 }
#=> {:"my hash key"=>12}

my_hash.transform_keys { |k| k.delete(' ') }
#=> {:myhashkey=>12}
Run Code Online (Sandbox Code Playgroud)