Class.new为私有时,实例方法的新实例

时间:2012-02-15 06:17:24

标签: ruby

我有一个类new方法被设为私有,因为我只想要我的类方法“构造函数”来创建新实例。但是,我现在也需要一些实例方法来创建新实例。

例如,请查看以下代码段。它位于method_a,我遇到了麻烦:

Class Foo

  class << self

    #a "constructor" method
    def from_x arg
      stuff_from_arg = arg.something #something meaningful from arg
      new(stuff_from_arg)
    end
  end

  def initialize stuff
    @stuff = stuff
  end

  private_class_method :new #forces use of Foo.from_x

  def method_a
    other_stuff = "blah"
    #These do not work
    return new(blah) #nope, instance cannot see class method
    return self.class.new(blah) #nope, new is private_class_method
    return Foo.new(blah) #same as previous line
    return initialize(blah) #See *, but still doesn't work as expected
  end
end

我开始想到的是,我可能已经设计了这个类,我需要创建另一个类构造函数方法来创建一个新的Foo,如下所示:

#in addition to previous code
Class Foo
  class << self
    def just_like_new stuff
      new(stuff)
    end
  end
end

这感觉不太对劲或非常干,但也许这就是我为自己做的床。我有什么可以做的吗?

*这条线有点令人惊讶。它返回blah。在类定义之外,还有一个initialize,它需要0个参数并返回nil有谁知道这里发生了什么?

1 个答案:

答案 0 :(得分:1)

您始终可以使用send来绕过访问控制:

def from_x arg
  stuff_from_arg = arg.something #something meaningful from arg
  self.class.send(:new, stuff_from_arg)
end