我在家谱程序中使用以下方法将一个婚姻/配偶添加到一个人。 @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
有人可以帮我修改除非部分进行检查,看看哈希是否已经在阵列中完全占据主导地位了吗?
答案 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