定制ruby .new运算符

Pet*_*rdk 2 ruby constructor

假设我有一个类Foo,构造函数需要2个参数.基于这些参数,initialize方法执行一些繁重的计算,并将它们作为变量存储在类的实例中.对象已创建.

现在我想优化它并创建这些对象的缓存.在创建新的Foo对象时,如果参数匹配,我想从缓存中返回现有的Foo对象.我怎样才能做到这一点?

我目前有一个self.new_using_cache(param1, param2),但我很乐意将这个集成在正常情况下Foo.new().这有可能吗?

我还可以推断,使用.new()与缓存相结合并不是真正的语法正确.这意味着应该调用该方法new_or_from_cache().

澄清 这不仅仅是关于繁重的计算,它也是首选,因为限制了重复对象的数量.当我可以从缓存中获得50个唯一的对象时,我不希望内存中有5000个对象.所以我真的需要自定义.new方法,而不仅仅是缓存的值.

Ale*_*yne 5

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)
Run Code Online (Sandbox Code Playgroud)

你可以实际定义self.new,然后调用,super如果你真的想使用Class#new.

此外,如果实际上不需要新实例,这种完全方法可防止任何实例化发生.这是因为初始化方法实际上没有做出决定.