要向Hash添加新对,我会:
{:a => 1, :b => 2}.merge!({:c => 3}) #=> {:a => 1, :b => 2, :c => 3}
是否有类似的方法从哈希删除密钥?
这有效:
{:a => 1, :b => 2}.reject! { |k| k == :a } #=> {:b => 2}
但我希望有类似的东西:
{:a => 1, :b => 2}.delete!(:a) #=> {:b => 2}
重要的是返回值将是剩余的哈希值,因此我可以执行以下操作:
foo(my_hash.reject! { |k| k == my_key })
在一行 .
13 回答
如果删除返回散列的删除对,那就太好了 . 我这样做:
这也可以:
hash[hey] = nil
我已经设置了这个,以便.remove返回哈希的副本,删除键,同时删除!修改哈希本身 . 这符合ruby惯例 . 例如,从控制台
如果你想使用纯Ruby(没有Rails),不想创建扩展方法(也许你只需要在一两个地方,并且不想用大量方法污染名称空间)并且不想编辑哈希就位(即,你喜欢像我这样的函数式编程),你可以'选择':
Oneliner普通红宝石,它只适用于红宝石> 1.9.x:
Tap方法总是返回被调用的对象...
否则,如果您需要
active_support/core_ext/hash
(在每个Rails应用程序中自动需要),您可以根据需要使用以下方法之一:except使用黑名单方法,因此它删除列为args的所有键,而slice使用白名单方法,因此它删除未列为参数的所有键 . 还存在那些方法(
except!
和slice!
)的爆炸版本,它们修改给定的散列,但它们的返回值不同,它们都返回一个散列 . 它表示slice!
的已删除键以及为except!
保留的键:有许多方法可以从哈希中删除密钥并在Ruby中获取剩余的哈希值 .
.slice
=>它将返回选定的键,而不是从原始哈希中删除它们.delete
=>它将从原始哈希中删除所选的键(它只能接受一个键而不能超过一个键).except
=>它将返回剩余的键但不删除原始哈希中的任何内容.delete_if
=>如果您需要根据值删除密钥 . 它显然会从原始哈希中删除匹配的键结果基于Ruby 2.2.2 .
见Ruby on Rails: Delete multiple hash keys
为什么不使用:
您可以使用refinements if you are using Ruby 2代替猴子修补或不必要地包含大型库:
您可以使用此功能,而不会影响程序的其他部分,或者必须包含大型外部库 .
在纯Ruby中:
Rails has an except/except! method返回删除了这些键的哈希值 . 如果你在创建自己的版本时没有任何意义 .
您可以使用
facets
gem中的except!
:原始哈希不会改变 .
编辑:正如Russel所说,facets存在一些隐藏的问题,并且与ActiveSupport不完全API兼容 . 另一方面,ActiveSupport并不像facet那样完整 . 最后,我使用AS并在代码中包含边缘情况 .
这是一种单行方式,但它不是很易读 . 建议改用两条线 .