ruby - 自定义 ruby​​ .new 运算符

标签 ruby constructor

假设我有一个类 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/

相关文章:

ios - 使用 RubyMotion 解析 JSON

ruby-on-rails - 在我的 rspec 中为 #<RSpec::ExampleGroups 获取未定义的方法 `get'

ruby - 在 Ruby 中解析制表符分隔文件的最佳方法是什么?

c++ - STL vector 和 c++ : how to . 在没有默认构造函数的情况下调整大小?

c# - 创建新的设置实例

ruby-on-rails - 无法使用 OpenSSL 编译 Ruby

C++ - 全局静态对象和局部静态对象的构造函数调用是否不同?

c++ - 为什么只允许一个隐式转换将参数解析为 C++ 中的函数?

c++ - 我的复制构造函数有什么问题?

ruby - 按键后跟值对哈希数组进行分组