2013-07-10 7 views
2

코드 스 니펫에 다음 구문을 사용하고 있습니다.Ruby 클래스 << Klass = Module :: new

class << PushableModule = Module::new 
def new *args, &blk 
    m = Module::new(*args, &blk) 
    m.extend Pushable 
    m 
end 
end 

먼저 떨어져, 클래스 또는 모듈 PushableModule 파일/프로그램에 존재하지 않으며, 둘째로 어떤 일이 일어나고있는 것으로 보인다 내가 이전에 정의에 Module::new에 동일한을 설정 한 후 그 eigenclass을 검색하고있어 것입니다 내가 이해하지 못하는 블록. 누군가 제게 이것을 설명해 주시겠습니까? (코드 스 니펫이 실제로하는 것뿐만 아니라)?

답변

3

조작자 우선 순위를 잘못 지정했습니다. 그것은 그것이 PushableModule로서 다음 <<하여 eigenclass를 개방 한 다음, Module::new으로 이름을 생성하는 모듈

class << (PushableModule = Module::new) 
    ... 
end 

의미한다.

PushableModule의 생성자를 덮어 씁니다. new은 인스턴스 메서드가 아닌 PushableModule.new으로 정의해야하므로 정의는 고유 클래스 내에서 수행됩니다.

일반적으로 new을 덮어 쓰지 않고 인스턴스 메서드 initialize을 정의하지만 특별한 경우에는 new 생성자를 다시 쓸 수 있습니다.

+0

+1 감사합니다. 지금은 훨씬 더 의미가 있습니다. – DesAdams

관련 문제