使用带散列而不是数组的索引

时间:2012-08-20 14:20:18

标签: ruby

我在家谱程序中使用以下方法将一个婚姻/配偶添加到一个人。 @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

使用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

有人可以帮我修改除非部分进行检查,看看哈希是否已经在阵列中完全占据主导地位了吗?

3 个答案:

答案 0 :(得分: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}

答案 1 :(得分: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拼写错误。应该是婚姻。

答案 2 :(得分: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