0

家系図プログラムで次のメソッドを使用して、マリアージュ/配偶者を人に追加します。@mariages は配列の配列です。

def add_spouse(spouse, mariage_date = nil, divorce_date = nil)
  @mariages.push([spouse, mariage_date, divorce_date]) unless @mariages.index{|(a, b, c)| a == spouse && b == mariage_date} 
  spouse.mariages.push(self) unless spouse.mariages.index{|(a, b, c)| a == self && b == mariage_date} 
end

i を使用unless @mariages.index{|(a, b, c)| a == spouse && b == mariage_date}して、マリアージュが配列にまだないかどうかを確認します。

今、私はマリアージュをこのようなハッシュの配列に保持したい

def add_spouse(spouse, mariage_date = nil, divorce_date = nil)
    @mariages.push({:spouse => spouse, :mariage_date => mariage_date, :divorce_date => divorce_date}) unless ...
    spouse.mariages.push({:spouse => self, :mariage_date => mariage_date, :divorce_date => divorce_date}) unless ... 
end

ハッシュが配列にまだ存在していないかどうかをチェックするために、unless部分を適応させるのを誰かが手伝ってくれますか?

4

3 に答える 3

1

繰り返される要素に入るブロックにindexはハッシュがあるので、次を使用する必要があります

.. unless @mariages.index{|h| h[:spouse] == spouse && h[:mariage_date] == mariage_date}

.. unless spouse.mariages.index{|h| h[:spouse] == self && h[:mariage_date] == mariage_date} 

PS:mariageスペルが間違っています。それは結婚であるべきです。

于 2012-08-20T14:28:08.803 に答える
1

称賛のあなたの質問に従って、私は次のようなことをします。日付は日付クラスを使用する必要があり、結婚のパートナーも出生と死亡などのクラスである必要があることに注意してください。しかし、うまくいけば、データを何をすべきかを知っているオブジェクトに移動することで、物事が大きくなるにつれて設計を簡素化できることがわかるでしょう。(簡単にするために新郎新婦も一緒に行きましたが、系図的に承認された方法で自由に変更してください)。

各人に関連付けられた結婚があり、花嫁と花婿がいる場合、1 つの結婚を共有できますが、結婚のリストは異なります。

class Marriage
  attr_accessor :marriage_date, :divorce_date, :bride, :groom

  def initialize(date, bride, groom)
    @marriage_date = date
    @bride = bride
    @groom = groom
  end

  def marriage_equals(m)
    return (@marriage_date == m.marriage_date) && 
           (@bride == m.bride) &&
           (@groom == m.groom)
  end    
end

class Marriages
  def initialize
    @marriages = []
  end

  def add_marriage(marriage)
    if (@marriages.any? { |m| m.marriage_equals(marriage) })
      puts "Marriage of #{marriage.groom} already listed"
      return false
    else
      puts "Added new marriage"
      @marriages.push(marriage)
      return true
    end
  end

end


m1 = Marriage.new("1-1-0002", "Wilma", "Fred")
m2 = Marriage.new("6-8-0003", "Betty", "Barney")
m3 = Marriage.new("2-8-8003", "Jane", "George")


marriages = [m1,m2]
p marriages.any? { |m| m.marriage_equals(m1) } # true
p marriages.any? { |m| m.marriage_equals(m3) } # false

m_list = Marriages.new
m_list.add_marriage(m1) # Added new marriage
m_list.add_marriage(m2) # Added new marriage
m_list.add_marriage(m2) # Marriage of Barney already listed
于 2012-08-20T16:28:00.827 に答える
1

配列には他の配列ではなくハッシュが含まれるようになったため、「配列のアンパッキング」を使用できません (その公式用語が何であるかはわかりません)。ハッシュのインスタンスを取得し、通常どおりアクセスできます。

 @mariages.push({:spouse => spouse, 
                 :mariage_date => mariage_date, 
                 :divorce_date => divorce_date}) unless @mariages.index{|h| h[:spouse] == spouse && h[:mariage_date] == mariage_date}
于 2012-08-20T14:27:21.517 に答える