0

我正在比较对象数组,并且我有一个方法可以确定两个元素是否相等。我想在两个数组中的每对元素上调用此方法,是否有一种优雅的方法可以找到真值(即,如果每个数组中的所有元素都相等,则为 true,否则为 false)

这是我目前拥有的:

c = false
self.children.zip(other.children).each do |s,o| 
  c = s.equiv o  # I need a good way to store this result
  break if not c
end

我希望我能做这样的事情:

c = self.children.zip(other.children).each{|s,o| s.equiv o}

任何帮助,将不胜感激。

4

4 回答 4

2

怎么用all?

c = self.children.zip(other.children).all?{|s,o| s.equiv o}
于 2012-09-22T18:42:42.130 回答
2

那么你有Enumerable#all 吗?

c = self.children.zip(other.children).all? {|s,o| s.equiv o}
于 2012-09-22T18:42:44.970 回答
1

一个更好的解决方案是只定义==你的对象。然后您可以使用Array#==它来完成您的工作,因为它已经进行了所有对的比较。

这是一个简单的例子:

class Widget
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def ==(other)
    @name == other.name
  end
end

if $0 == __FILE__
  require 'minitest/autorun'

  describe 'widget arrays' do
    let(:some_widgets) { %w(foo bar baz).map { |name| Widget.new(name) } }
    let(:diff_widgets) { %w(bar baz spam).map { |name| Widget.new(name) } }

    it 'returns true if the widget arrays are the same' do
      (some_widgets == some_widgets).must_equal true
    end

    it 'returns false if the widget arrays are different' do
      (some_widgets == diff_widgets).must_equal false
    end
  end
end

您只需调用some_widgets == my_other_widgets来比较每个元素。

于 2012-09-22T18:51:39.367 回答
0

我认为如果您替换eachmap,c将是您要查找的数组。我不能 100% 确定,因为我无法立即进行测试,而且我知道zip.

于 2012-09-22T18:40:50.817 回答