2

singleton class私は自分のIRBで遊んでいました。そして、そうすることで、以下のスニペットを試しました。

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上記では、クラスのonインスタンスを作成しようとしましたFoo。また、クラスのonインスタンスfoo_singへの参照を保持するかどうかもテストされ ています。singleton classFoo

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

上記では、singleton_method barが含まれているかどうかを調べていましたが、そこにfoo_sing存在しないことがわかりました。それでは、私の質問は、Rubyのどこにあるのかということです。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しかし、私が見つけた答えは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
4

1 に答える 1

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)シングルトンクラスはシングルトンであることが意図されているため、サブクラス化またはインスタンス化することはできません。つまり、インスタンスが1つだけです。

代わりに、再利用したいコードにミックスインを使用する必要があるため、とにかく問題ではありません。これらは、必要な数のシングルトンクラスまたは通常のクラスに含める/追加することができます。

foo.extend ResuableFunctionality
# or equivalently:
class << foo
  include ReusableFunctionality
end
于 2013-03-16T16:31:13.160 に答える