0

オブジェクトの配列を比較しており、2 つの要素が等しいかどうかを判断するメソッドがあります。両方の配列の要素の各ペアでこのメソッドを呼び出したいのですが、真の値を見つけるためにこれを行うエレガントな方法はありますか (つまり、各配列のすべての要素が等しい場合は 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

で置き換えるeachmapc探している配列になると思います。すぐにテストできないため、100% 確信を持てませんzip

于 2012-09-22T18:40:50.817 に答える