Ruby 如何将一个散列';用另一个s键并过滤掉匹配的值?

Ruby 如何将一个散列';用另一个s键并过滤掉匹配的值?,ruby,ruby-on-rails-3,hash,Ruby,Ruby On Rails 3,Hash,我从Rails文档中得到这个: {1 => 2}.diff(1 => 2) # => {} {1 => 2}.diff(1 => 3) # => {1 => 2} {}.diff(1 => 2) # => {1 => 2} {1 => 2, 3 => 4}.diff(1 => 2) # => {3 => 4} 这几乎是完美的,但我不希望散列中的值

我从Rails文档中得到这个:

{1 => 2}.diff(1 => 2)         # => {}
{1 => 2}.diff(1 => 3)         # => {1 => 2}
{}.diff(1 => 2)               # => {1 => 2}
{1 => 2, 3 => 4}.diff(1 => 2) # => {3 => 4}
这几乎是完美的,但我不希望散列中的值作为参数传递,而不是调用散列中的值

我想要的是:

{}.diff(1 => 2) # => {}
{a: 1}.diff({a: 1, b: 2}) # => {} instead of {:b => 2}
此外,它必须尽可能高效。例如,我不想检查第二个散列并检查其中的每个键是否没有出现在第一个散列中


有什么想法吗?

查看源代码在这里很有帮助

def diff(h2)
  dup.delete_if { |k, v| h2[k] == v }.merge!(h2.dup.delete_if { |k, v| has_key?(k) })
end
它迭代散列中的每个条目。我假设您不想添加不必要的迭代。所以这比上面提到的要容易

def my_diff(h2)
  dup.delete_if { |k, v| h2[k] == v }
end

查看源代码在这里很有帮助

def diff(h2)
  dup.delete_if { |k, v| h2[k] == v }.merge!(h2.dup.delete_if { |k, v| has_key?(k) })
end
它迭代散列中的每个条目。我假设您不想添加不必要的迭代。所以这比上面提到的要容易

def my_diff(h2)
  dup.delete_if { |k, v| h2[k] == v }
end
这很简单:

a.select {|k, v| b.key?(k) && b[k] != v }
这是O(n),因为
键?
散列[]
都是O(1)。

这很简单:

a.select {|k, v| b.key?(k) && b[k] != v }

这是O(n),因为
key?
Hash#[]
都是O(1)。

Heh,我一直试图不惜一切代价使用diff。没有想到使用不同的方法进行gp。
my_diff
如果h2包含h不包含的键-
{a:1,b:2},则无法工作。my_diff(a:2)=>{a=>1,b=>2}
。块应该是
h2[k]==v | |!h2.key?(k)
@chrishald这实际上是所需的行为,因为
{a:1,b:2}
的两个键与
{a:2}
不同。我希望调用散列的所有元素(键和值)与第二个散列不同。另一条路不行!嘿,我被困在不惜任何代价尝试使用diff。没有想到使用不同的方法进行gp。
my_diff
如果h2包含h不包含的键-
{a:1,b:2},则无法工作。my_diff(a:2)=>{a=>1,b=>2}
。块应该是
h2[k]==v | |!h2.key?(k)
@chrishald这实际上是所需的行为,因为
{a:1,b:2}
的两个键与
{a:2}
不同。我希望调用散列的所有元素(键和值)与第二个散列不同。另一条路不行!