假设我有一个类 Foo
并且构造函数有 2 个参数。
基于这些参数,initialize 方法进行一些繁重的计算,并将它们作为变量存储在类的实例中。对象已创建。
现在我想优化它并创建这些对象的缓存。创建新的 Foo 对象时,如果参数匹配,我想从缓存中返回一个现有对象。我该怎么做?
我目前有一个 self.new_using_cache(param1, param2)
,但我希望将它集成到普通的 Foo.new()
中。
这有可能吗?
我还可以推断出将 .new()
与缓存结合使用在语法上并不正确。
这意味着该方法应称为 new_or_from_cache()
。
澄清 这不仅仅是繁重的计算,它也是首选,因为它限制了重复对象的数量。当我可以从缓存中获得 50 个唯一对象时,我不希望内存中有 5000 个对象。所以我真的需要自定义 .new 方法,而不仅仅是缓存的值。
最佳答案
class Foo
@@cache = {}
def self.new(value)
if @@cache[value]
@@cache[value]
else
@@cache[value] = super(value)
end
end
def initialize(value)
@value = value
end
end
puts Foo.new(1).object_id #2148123860
puts Foo.new(2).object_id #2148123820 (different from first instance)
puts Foo.new(1).object_id #2148123860 (same as first instance)
你实际上可以定义self.new
,如果你真的想使用Class#new
,然后调用super
。
此外,如果实际上不需要新实例,这种完全方法可以防止任何实例化发生。这是因为初始化方法实际上并没有做出决定。
关于ruby - 自定义 ruby .new 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5929347/