我想编写一个模块,在数组实例变量上提供类似功能的活动记录。
使用它的例子是
x = Container.new
x.include(ContainerModule)
x.elements << Element.new
x.elements.find id
module ContainerModule
def initialize(*args)
@elements = []
class << @elements
def <<(element)
#do something with the Container...
super(element)
end
def find(id)
#find an element using the Container's id
self
#=> #<Array..> but I need #<Container..>
end
end
super(*args)
end
end
问题是我需要这些方法中的Container对象。对self的任何引用都将返回Array,而不是Container对象。
有没有办法做到这一点?
谢谢!
答案 0 :(得分:1)
这样的事情对你有用吗?
class Container
attr_accessor :elements
def initialize
@elements = ContainerElements.new
end
end
class ContainerElements < Array
def find_by_id(id)
self.find {|g| g.id == id }
end
end
所以我创建了一个容器类,以及一个继承自Array的ContainerElements,并添加了(特定的)find_by_id方法。
如果您确实想要将其称为find
,则需要alias
。
示例代码为:
class ElemWithId
attr_accessor :id
def initialize(value)
@id = value
end
end
cc = Container.new
cc.elements << ElemWithId.new(1)
cc.elements << ElemWithId.new(5)
puts "elements = #{cc.elements} "
puts "Finding: #{cc.elements.find_by_id(5)} "
希望这会有所帮助......
答案 1 :(得分:0)