ruby-on-rails - ruby 中的哈希减法

标签 ruby-on-rails ruby

我有 2 个哈希(稍后将转换为数组,不确定这是否相关):

Hash1 = {"X"=>2, "Y"=>1, "Z"=>1}

Hash2 = {"X"=>1, "Y"=>1}

我需要像 (Hash3 = Hash1 - Hash2) 这样减去它们,并且我需要 Hash3 的结果,在这种情况下:

Hash3 = {"X"=>1, "Y"=>0, "Z"=>1}

我看到的所有示例和答案都会导致结果哈希中不存在值为 0 (Y) 的键,这不是我需要的。

我正在使用 Ruby 2.3.3 和 Rails 5.0

最佳答案

您可以 merge他们:

h1 = {"X"=>2, "Y"=>1, "Z"=>1}
h2 = {"X"=>1, "Y"=>1}

h1.merge(h2) { |k, v1, v2| v1 - v2 }
#=> {"X"=>1, "Y"=>0, "Z"=>1}

只要两个哈希中都存在一个键,就会调用该 block 来确定新值。


由于这种行为,如果键仅出现在 h2 中,它将不会产生负值:

h1 = {"X"=>2, "Y"=>1}
h2 = {"X"=>1, "Y"=>1, "Z"=>1}

h1.merge(h2) { |k, v1, v2| v1 - v2 }
#=> {"X"=>1, "Y"=>0, "Z"=>1}

您可能期望:

#=> {"X"=>1, "Y"=>0, "Z"=>-1}

这是什么tadman's solution会回来的。

关于ruby-on-rails - ruby 中的哈希减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45088423/

相关文章:

ruby-on-rails - 在 Rails 3 中使用 Paperclip 安装 RMagick 时出现问题

ruby-on-rails - Rails 使用 curl 设计登录

ruby-on-rails - ActiveRecord::Fixture::FixtureError:表 "users"没有名为 "status"的列

ruby-on-rails - 如何调用另一个 Controller 的方法

ruby - 如何使用 Ruby 的邮件 gem 通过 smtp 发送电子邮件?

ruby-on-rails - Rails has_many 通过为多种类型使用 source 和 source_type 别名

ruby - 如何在 rspec 输出中设置类的顺序?

ruby-on-rails - Ruby on Rails 中的 Controller 是否有任何部分类型的东西

ruby - 如何只检索未嵌套的元素?

Ruby 使用 JSON 序列化结构