2013-03-16 5 views
2

내 IRB에서 singleton class으로 게임하고있었습니다. 그리고 그렇게하는 것은 아래 발췌 문장을 시도했습니다. 나는 위의 여기`singleton` 메소드는 어디에 있습니까?

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_singFoo 인스턴스의 singleton class에 대한 참조를 보유하고 있는지 테스트합니다.

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

위에서 singleton_methodbarfoo_sing에 있으면 나는보고 있었다 또는 아뇨하지만 내 질문은 there.Then가 존재하지 발견 - singleton_method 루비에 어디에 존재 하는가? 우리는 일반 클래스처럼, singleton class의, singleton class의 예 여부와 서브 클래스를 만들 수 있는지가 확인 된 위의 부분에서

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에서 재정의되는 것을 볼 수 있습니다. 그러나 위의 질문에서 찾을 수없는 클래스 내의 메소드를 검색 할 때.

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

왜 살고있는 곳에서 중요합니까? 그들이 일하는 것이 훨씬 더 중요하지 않습니까? 정말 중요한 경우 소스 코드를 살펴보십시오. –

+0

@iAmRubuuu는 싱글 톤 클래스에 대한 이해를 얻고 싶다고 생각합니다. –

+0

BTW, 며칠 후에 블로그 게시물을 게시하고 이에 대한 답변을 시도 할 것입니다. –

답변

2

당신은 올바른 길을 가고 있습니다.

1) 싱글 클래스의 메소드를 찾을 때, 당신은하지 methodsinstance_methods, 사용하고 싶었 : "인스턴스 메소드 정의"정말 의미 method_defined? 이후 조금 혼란

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

을, 반면, methods의 실제 의미는 singleton methods ...

2) 싱글 톤 클래스이므로 서브 클래스 또는 인스턴스화 할 수 없습니다. 즉, 인스턴스가 정확히 하나만 존재하기 때문입니다.

재사용하려는 코드에 mixins를 사용해야하므로 아무래도 상관 없습니다. 원하는만큼 많은 싱글 톤 클래스 나 일반 클래스에 포함/추가 할 수 있습니다.

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

물론 가능합니다. 나는 모든 대답을 보거나 그 이상을보고 싶다. 당신이 당신의 포스트에 그것을 쓰면, 좋을 것입니다. :) –