我发现我有很多场合,我有一个通常需要实例化为“集合”的类。我的解决方案一直是做这样的事情:
class Foo
attr_accessor :bar
def initialize bar
@bar = bar
end
end
class FooCollection
attr_accessor :foos
def initialize
(0.10).each {|n| @foos[n] = Foo.new(n)}
@coolest = 3
end
def coolest
@foos[@coolest]
end
end
我考虑过为这种行为使用类方法。我似乎无法决定这样做是否更干净或更麻烦。
class Foo
attr_accessor :bar
@@all = []
def self.create_all
(0.10).each {|n| @@all[n] = Foo.new(n)}
@@coolest = 3
end
def self.coolest
@@all[@@coolest]
end
def initialize bar
@bar = bar
end
end
我知道使用类方法会产生一个问题,因为它是一个单例,所以如果我需要创建多个foo集合,我可能必须使集合成为数组或其他东西的散列。但实际上,这些解决方案对我来说都不是“干净”,而在这种情况下,通常会有一个我不知道的更好的选择。有吗?
答案 0 :(得分:1)
您可能会喜欢这个想法:
class FooCollection < Array
def initialize
super
(0..10).each { |n| self[n] = Foo.new n }
@coolest = 3
end
def coolest
self[@coolest]
end
end
答案 1 :(得分:1)
关于“我有哪些替代方案?”,我不能说是一个已经学会如何正确行事的人,就像那些做事不正确的人一样。
我会说避免单身人士。你可能认为只会出现某种情况,但这可能会因为没有人能预料到的原因而发生变化。我知道有“你不会需要它”,但这一次,把它想象成“你不需要单身人士”,而不是“你不需要能够做多个FooCollections”。
如果FooCollection
听起来很愚蠢,请不要将其作为单身人士的理由。尝试找出使用FooCollection
的内容。如果使用FooCollection只有一件事,比如说Bazza
,那么可能有代码处理Foo
中的Bazza
,或者包含在Bazza
中的模块。否则,如果有多个对象使用FooCollection
,只需尝试将尽可能多的方法放入FooCollection
,直到这样可以让您了解要重命名的内容。