2013-03-16 60 views
2

我在我的IRB中玩singleton class。这样做尝试了以下片段。`singleton`方法在Ruby中驻留在哪里?

class Foo ; end 
#=> nil 
foo = Foo.new 
#=> #<Foo:0x2022738> 

foo.define_singleton_method(:bar , method(:puts)) 
#=> #<Method: Object(Kernel)#puts> 

这里上面我刚刚创建的Foo类的实例singleton方法。

foo.bar("hi") 
hi 
#=> nil 
foo.singleton_methods 
#=> [:bar] 

foo_sing = foo.singleton_class 
#=> #<Class:#<Foo:0x2022738 
foo_sing.is_a? Class 
#=> true 
foo_sing.instance_of? Class 
#=> true 
foo_sing.inspect 
#=> "#<Class:#<Foo:0x1e06dc8>>" 

在上面我试图在Foo类的实例创建singleton class。并且还测试foo_sing对类Foo的实例是否参照singleton class

foo_sing.methods(false) 
#=> [] 
foo_sing.methods.include? :bar 
#=> false 

在上面我一直在寻找,如果singleton_methodbar是在foo_sing或not.But发现它不存在there.Then我的问题是 - 哪里那些singleton_method居住在红宝石?

foo_sing.new.methods(false) 
#TypeError: can't create instance of singleton class 
#  from (irb):10:in `new' 
#  from (irb):10 
#  from C:/Ruby193/bin/irb:12:in `<main>' 
class Bas < foo_sing ; end 
#TypeError: can't make subclass of singleton class 
#  from (irb):16 
#  from C:/Ruby193/bin/irb:12:in `<main>' 

在我被检查,如果我们能够创造的singleton class实例或不与子类的singleton class,像普通类以上的部分。但是我发现的答案是否定的。 它背后的概念或理论或目的是什么?

再次在下面的代码中,我可以看到在singleton class内部重写了相同的名称方法。但是当我在上面问的时候没有找到类中的那个方法时。

class Foo ; end 
#=> nil 
foo = Foo.new 
#=> #<Foo:0x225e3a0> 

def foo.show ; puts "hi" ; end 
#=> nil 

foo.show 
#hi 
#=> nil 

class << foo ;def show ; puts "hello" ; end ;end 
#=> nil 

foo.show 
#hello 
#=> nil 
+0

为什么他们住在哪里很重要?他们工作起来不是更重要吗?如果对你来说真的很重要,请查看源代码。 – 2013-03-16 16:32:39

+0

我认为@iAmRubuuu想要了解单身人士课程。 – 2013-03-16 16:34:54

+0

顺便说一句,我会在几天后发布一篇博文,并会尝试回答这些问题。 – 2013-03-16 16:35:44

回答

2

你在正确的轨道上。

1)当寻找单身类中的方法,你想用instance_methods,不methods:“实例方法定义”,而

foo_sing.instance_methods.include? :bar # => true 
# or 
foo_sing.method_defined? :bar # => true 

这是一个有点混乱,因为method_defined?的真正含义, methods真的意思是singleton methods ...

2)你不能继承或实例化一个单例类,因为它意味着是一个单例,即只有一个实例。

无论如何,这并不重要,因为您应该使用mixin代码来重用。这些可以包括/预装在尽可能多的单身人士班或普通班,只要你想:

foo.extend ResuableFunctionality 
# or equivalently: 
class << foo 
    include ReusableFunctionality 
end 
+0

当然,我会的。我想看看所有的答案或更多。如果你把它写在你的帖子上,那会很棒。 :) – 2013-03-16 16:41:09