基于单例类创建新的非单例类

时间:2009-03-17 20:18:17

标签: ruby singleton

Ruby可以基于单例类定义一个新的非单例类吗?

我试过这样的事情(剪辑):

module SomeModule
  extend self
  class Singleton;end
end

class NonSingleton
  include SomeModule
end
nonsingleton = NonSingleton.new

但是当然对你们来说,这已经很明显,这不会像我预期的那样有效。

基本上我想要的是重用Singleton类的功能,而不会以任何方式影响它的行为。有可能吗?

经过进一步调查后,似乎根本不可能(如果我错了,请纠正我)。像下面这样的黑客会不会太乱或太乱?

singleton = File.read('some_singleton.rb')
non_singleton = eval(singleton.gsub('include Singleton', ''))
# Or perhaps:
non_singleton = eval(singleton.gsub('module SomeModule', 'module MyOwnModule'))

1 个答案:

答案 0 :(得分:1)

行。我这里没有真正的红宝石,只有IronRuby,但是当我尝试这样做时会发生这种情况:

# define a new object
>>> s = "hello"
=> "hello"

# add a method to it's singleton class
>>> class << s
... def say; puts self; end
... end
=> nil

# get it's singleton class
>>> SingletonBaseClass = class << s; self; end
=> #<Class:#<String:0x000005c>>

# try build a new one inheriting from the singleton class
>>> class NonSingletonClass < SingletonBaseClass
... end
:0: can't make subclass of virtual class (TypeError)

IronRuby非常符合普通的ruby语言本身,我愿意打赌在真正的ruby中会发生类似的错误信息。简而言之,你不能这样做。

这引出了一个问题:你想做什么?如果特定对象的单例类变得足够复杂以至于您想要重用它,那么您是否应该将该代码放在常规类或模块中?

例如,你可以这样做:

# define our reusable code
module SharedMethods
  def a;end
  def b;end
  # and so on
end

# mix it into the singleton of some object
s = "hello"
class << s; include SharedMethods; end

然后,您可以在任何其他对象/类/ etc

上重复使用它