`singleton`方法在Ruby中的位置在哪里?

时间:2013-03-16 16:03:27

标签: ruby ruby-1.9.3 singleton-methods

我在IRB中玩singleton class。这样做尝试了下面的片段。

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

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

上面我刚刚在类singleton的实例上创建了一个Foo方法。

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>>"

在上面,我尝试在类singleton class的实例上创建Foo。并且还测试了foo_sing是否在类singleton class的实例上引用了Foo

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

在上面我看到singleton_method bar是否在foo_sing中。但是发现它不在那里。然后我的问题是 - 那些singleton_method在Ruby中的位置是什么?

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的子类,就像常规类一样。但我发现答案为NO。 背后的概念或理论或目的是什么?

再次在下面的代码中,我可以看到在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

1 个答案:

答案 0 :(得分: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)你不能对单例类进行子类化或实例化,因为它是一个单例,即只有一个实例。

无论如何,因为您应该使用mixins来代替您想要重用的代码。这些可以包含/预先包含在任意数量的单例类或普通类中:

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