2015-05-28 35 views
1

我想制作一个课程,或者可以使用“require”或“require_relative”加载/需要的模块。但是,为了简单起见,我不想实例化任何对象,只是开始使用它的方法,类似于Ruby的Prime类。我怎样才能做到这一点?如何在Prime类中创建Ruby中的默认实例?

require "my_module" 
puts My_module.convert("data") 

取而代之的是:

require "my_module" 
an_instance = My_module::My_class.new 
puts an_instance.convert("data") 

http://ruby-doc.org/stdlib-1.9.3/libdoc/prime/rdoc/Prime.html

+0

“......我不希望任何实例化对象,......”似乎有矛盾的问题的标题。 '需要“my_module”;放入My_module.convert(“data”)'如果'convert'是一个模块方法,就可以正常工作:'module My_module; def self.convert(str)...'。那是你在找什么? –

回答

3

Prime类使用singleton pattern实现这一行为,那么uses a clever trick使所有的实例方法看起来好像他们是类方法。但是,我真的不明白为什么这样做。如果需要保持一些全局状态,单例模式会很有用,但Prime类并没有真正使用它。有人说单身人士是最被滥用的模式,他们可能是对的。

我现在只是猜测你的转换器不需要保持全局状态。遵循这个假设,您可以使用模块方法来实现您所描述的API。例如:

module MyModule 
    def self.convert(data) 
    MyClass.new.convert(data) 
    end 
end 

然后,您可以调用此方法

MyModule.convert("data") 
+0

很好的答案。我需要一些安静的时间来理解“聪明的把戏”。 –

+0

现在我再次想到,也许Prime类实际上在前一段时间使用了全局状态,现在它们只是为了向后兼容而保留单例。 –

+0

@CarySwoveland它其实并不复杂,除了一件事。每次定义一个实例方法时,这段代码都会定义一个具有相同名称的类方法,该方法只会委派给单例实例。现在最困难的部分是:它使用'Forwardable'模块来实现此目的,这意味着将实例方法委托给另一个对象。但是由于我们想要委托类方法,我们需要得到“更高的水平”。这是通过通过'(class << self; self; end)'获得元类来完成的,并使用'def_delegator'来代替类本身。 –