从外部隐藏ruby的构造函数,但在实例方法中使用它

时间:2012-11-30 16:24:40

标签: ruby constructor instantiation

我需要创建一个类来防止外部代码直接实例化它。所有实例都是通过调用几个类方法获得的,还有一些实例方法可以生成新实例并返回它们。

class SomeClass
  class << self
    private :new, :allocate
  end

  def initialize(hash)
    @hash = hash
  end

  # A class method that returns a new instance
  def self.empty
    new({})   # works fine!
  end

  # Another class method that returns a new instance
  def self.double(a, b)
    new({a => b})   # works fine!
  end

  # An instance method that will generate new instances
  def combine_with(a, b)
    # Here's the problem!
    # Note: it doesn't work with self.class.new either
    SomeClass.new(@hash.merge({a => b}))
  end
end

所以我将new方法定义为私有。这适用于类方法,在它们内部我仍然可以在内部调用new。但我不能在实例方法中调用new。我尝试将new定义为受保护,但这也无济于事。

1 个答案:

答案 0 :(得分:1)

您是否尝试使用send

SomeClass.send :new, @hash.merge({a => b})