문제

루비의 싱글 톤 클래스는 그 자체로 수업입니까? 모든 개체가 "클래스"에 속하는 이유입니까? 개념은입니다 흐린, 그러나 나는 그것이 클래스 메소드를 전혀 정의 할 수있는 이유와 관련이 있다고 생각합니다.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

https://apidock.com/ruby/object/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 메소드가 재정의 된 클래스에서 나옵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top