我有一个类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
有谁知道这里发生了什么?
答案 0 :(得分:1)
您始终可以使用send
来绕过访问控制:
def from_x arg
stuff_from_arg = arg.something #something meaningful from arg
self.class.send(:new, stuff_from_arg)
end