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'))
答案 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
上重复使用它