私は、互いに関係を持つ一連のオブジェクト、たとえば「人」を持っています。配列内の別のオブジェクトになる、ある人から別の人に到達できるようにしたいと考えています。
だから私はこれを思いついた:
class Person
attr_accessor :name, :parent, :collection
def parents
rtn = []
pid = @parent
while pid
p = collection.select{|i|i.name == pid}.first
if p
rtn << p
pid = p.parent
else
pid = nil
end
end
rtn
end
def to_s;@name;end
end
class PersonCollection < Array
def <<(obj)
obj.collection = self
super
end
end
...これにより、これを行うことができます:
p1 = Person.new
p1.name = 'Anna'
p2 = Person.new
p2.name = 'Bob'
p2.parent = 'Anna'
pc = PersonCollection.new
pc << p1
pc << p2
pp p2.parents
私のかなりぎこちない例を許してください。主な目的は、コレクションのメンバーが同じコレクションの他のメンバーにアクセスできるようにすることです。より良い方法はありますか?