2014-09-07 3 views
4

Ruby Koans Ruby Koans을 거치고 있으며 "about_class_methods.rb"의 클래스 메소드 설정에 대한 논의가 있으며 Koans는 세 가지 방법에 대해 설명합니다. ,루비 클래스 메서드 설정

class << self 
    def class_methods 
    end 
    end 

화두는 또한 세 번째 방법에 대해 얘기를 나는 본 적이 :

class Demo (define/open class) 
    def self.method 
end 

2 :

1 : 클래스 메소드를 작성하는

두 가지 주요 방법이 있습니다 (내가 기억하는) :

def Demo.class_method_third_way 
end 

Q1이 세 번째 방법은 실제로 다른 어떤 것보다 나에게 더 분명합니다. 왜 아무도 그것을 사용하지 않는 이유에 대해 이해하지 못하는 이유가 있습니까?

질문 2 내가 2의 구문을 "자기 < < def name end"이어야한다고 잘못 생각하는 이유는 무엇입니까? 그것이 "왜 문법입니까?"입니다. 클래스 Object가 모든 클래스에 대한 참조를 보유하고 있으며 자체 클래스에 대한 메서드에서이 막대기를 사용합니까?

언제나처럼, 당신의 도움과 인내심에 감사드립니다!

답변

3

클래스 본문에서 self은 정확히 정의 된 클래스 개체를 참조합니다. 그래서 def self.some_methoddef Demo.some_method과 동일하게 작동합니다.

class Demo 
    puts self.object_id == Demo.object_id 
end 
#=> true 

class << some_obj

some_obj의 싱글 클래스 액세스하는 구문이다. Ruby doc 참조 :

싱글 톤 클래스 (또한 메타 클래스라고도 또는 eigenclass) 오브젝트의 인스턴스 메소드를 보유하는 클래스이다. 통찰력 Person가 (하지 성장함에 따라

(초기) 개발 클래스에서
class C 
    class << self 
    # ... 
    end 
    # or 
    class << C 
    end 
end 
+0

감사합니다. Arie. 나는 그 링크를 읽었다. 나는 너무 많은 도움이되는 멍청아이다. 나는 또한 이것을 발견했다 : 같은 땅의 일부를 다루는 http://www.devalot.com/articles/2008/09/ruby-singleton. 내 1 분기에 대한 대답으로, (괜찮 았던) 의견을 말하지 않고 있다고 생각하며, 2 분기에 대한 답변으로, 나는 당신이 싱글 톤 개념을 확장하고 있다고 생각합니다. 그렇다면 Demo.class_method가 더 자주 사용되는 이유는 무엇입니까? 내가 빠진 것이 있습니까? – codenoob

+0

@codenoob'class << self;를 사용한다면; end'를 사용하면 클래스 이름을 리팩터링 할 때이 명령문 블록에서 이름을 수정할 필요가 없습니다. –

5

이름이 변경 얻을 : 당신은 class << object를 사용하여 객체의 단일 클래스에 액세스 할 수 있습니다 ... 대부분의 자주는 다음과 같이 액세스 할 수있는 싱글 톤 클래스를 볼 수 있습니다 그러나 Employee이 아니라 Job이 아니라 하나 이상 Roles 등) 클래스 이름이 클래스 자체에 하드 코딩 된 경우이 이름 변경은 오류가 발생하기 쉽습니다.

+0

와우, 흥미로운 통찰력 Steenslag! – codenoob

+0

이 답변은 OP가 루비 코인에 관해 묻는다면 특히 좋습니다. :) 그것은 매우 선 (zen) 같은 대답입니다. –

관련 문제