0

我在一个家谱程序中使用以下方法将婚姻/配偶添加到一个人。@marages 是一个数组数组。

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

使用unless @mariages.index{|(a, b, c)| a == spouse && b == mariage_date}i 检查数组中的 mariage 是否已准备就绪。

现在我想将我的 mariages 保存在这样的哈希数组中

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

有人可以帮助我调整除非部分来检查哈希是否尚未在数组中存在吗?

4

3 回答 3

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 回答
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

根据您在推荐中提出的问题,我将执行以下操作。请注意,日期应该使用日期类,而婚姻中的伴侣也应该是类,包括出生和死亡等等。但希望您能看到如何将数据移动到知道如何处理它的对象中,随着事情变得越来越大,可以简化设计。(为了简单起见,我还和新娘和新郎一起去了,随意以家谱认可的方式改变它)。

每个人都会有一个与他们相关的婚姻,如果你有一个新娘和一个新郎,他们可以共享一个婚姻,但会有不同的婚姻列表。

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 回答