문제
루비의 싱글 톤 클래스는 그 자체로 수업입니까? 모든 개체가 "클래스"에 속하는 이유입니까? 개념은입니다 흐린, 그러나 나는 그것이 클래스 메소드를 전혀 정의 할 수있는 이유와 관련이 있다고 생각합니다.class foo; def foo.bar ...
).
루비의 싱글 톤 수업은 무엇입니까?
해결책
첫째, 작은 정의 : a 싱글 톤 방법 단일 객체에 대해서만 정의되는 메소드입니다. 예시:
irb(main):001:0> class Foo; def method1; puts 1; end; end
=> nil
irb(main):002:0> foo = Foo.new
=> #<Foo:0xb79fa724>
irb(main):003:0> def foo.method2; puts 2; end
=> nil
irb(main):004:0> foo.method1
1
=> nil
irb(main):005:0> foo.method2
2
=> nil
irb(main):006:0> other_foo = Foo.new
=> #<Foo:0xb79f0ef4>
irb(main):007:0> other_foo.method1
1
=> nil
irb(main):008:0> other_foo.method2
NoMethodError: undefined method `method2' for #<Foo:0xb79f0ef4>
from (irb):8
인스턴스 메소드는 클래스의 메소드입니다 (즉, 클래스의 정의에 정의 된). 클래스 방법은 싱글 톤 방법입니다 Class
클래스의 인스턴스 - 클래스의 정의에서 정의되지 않습니다. 대신, 그들은 정의됩니다 싱글 톤 클래스 대상의.
irb(main):009:0> Foo.method_defined? :method1
=> true
irb(main):010:0> Foo.method_defined? :method2
=> false
구문으로 객체의 싱글 톤 클래스를 열어 class << obj
. 여기서, 우리는이 싱글 톤 클래스가 싱글 톤 방법이 정의되는 곳임을 알 수 있습니다.
irb(main):012:0> singleton_class = ( class << foo; self; end )
=> #<Class:#<Foo:0xb79fa724>>
irb(main):013:0> singleton_class.method_defined? :method1
=> true
irb(main):014:0> singleton_class.method_defined? :method2
=> true
irb(main):015:0> other_singleton_class = ( class << other_foo; self; end )
=> #<Class:#<Foo:0xb79f0ef4>>
irb(main):016:0> other_singleton_class.method_defined? :method1
=> true
irb(main):017:0> other_singleton_class.method_defined? :method2
=> false
따라서 싱글 톤 메소드를 물체에 추가하는 대안적인 수단은 객체의 싱글 톤 클래스를 열어 놓는 것입니다.
irb(main):018:0> class << foo; def method3; puts 3; end; end
=> nil
irb(main):019:0> foo.method3
3
=> nil
irb(main):022:0> Foo.method_defined? :method3
=> false
요약해서 말하자면:
- 메소드는 항상 클래스에 속해야합니다 (또는 일부 클래스의 인스턴스 메소드)
- 일반 방법은 그들이 정의한 클래스에 속합니다 (즉, 클래스의 인스턴스 방법입니다)
- 클래스 방법은 단지 싱글 톤 방법입니다
Class
- 객체의 싱글 톤 방법은 객체의 클래스의 인스턴스 방법이 아닙니다. 오히려, 그것들은 객체의 싱글 톤 클래스의 인스턴스 방법입니다.
다른 팁
Ruby는 특정 객체에 특정한 방법을 정의하는 방법을 제공하며 이러한 방법을 싱글 톤 방법으로 알려져 있습니다. 객체에서 싱글 톤 메소드를 선언하면 Ruby는 자동으로 싱글 톤 방법 만 보유하기 위해 클래스를 만듭니다. 새로 만든 클래스를 싱글 톤 클래스라고합니다.
foo = Array.new
def foo.size
"Hello World!"
end
foo.size # => "Hello World!"
foo.class # => Array
#Create another instance of Array Class and call size method on it
bar = Array.new
bar.size # => 0
Singleton Class는 상속 계층에 자동으로 생성되고 삽입되는 객체 별 익명 클래스입니다.
singleton_methods
객체에서 모든 싱글 톤 메소드의 이름 목록을 얻기 위해 개체에서 호출 할 수 있습니다.
foo.singleton_methods # => [:size]
bar.singleton_methods # => []
이것 기사 루비의 싱글 톤 수업을 이해하는 데 정말 도움이되었으며 좋은 코드 예제가 있습니다.
버전 1.9.2에서 @pistos 답변으로 업데이트하면서 Ruby 싱글 톤 클래스 얻기에 새로운 구문을 추가하십시오.
singleton_class = ( class << foo; self; end )
다음과 같이 대체 할 수 있습니다.
singleton_class = foo.singleton_class
가장 실용적/행동에 대한 생각을 생각하는 방법 (IMHO)은 상속 체인 또는 메소드 조회/해상도 순서입니다. 이 사진이 도움이 될 수 있습니다
http://www.klankboomklang.com/2007/11/25/modules-part-i-enter-the-includeclass/
이것은 R 1.9, 내장 및 사용자 정의 클래스를 대조합니다. 나는 여전히 이것을 소화하고 있습니다.
http://d.hatena.ne.jp/sumim/20080111/p1
또한이 용어의 혼란스러운 사용은 "싱글 톤 객체"이며, 이는 다른 개념입니다. 싱글 톤 객체는 해당 클래스 중 하나만 할당 할 수 있도록 생성자/instantiator 메소드가 재정의 된 클래스에서 나옵니다.