2011-05-01 8 views
2

서브 클래스가 메소드 블록을 저장하여 나중에 실행되도록 클래스를 구현하려고했습니다. 그것은 작동하지만, 내가 잘못된 길을 택한 것 같습니다. 나는이 코드 조각하는 방법-없는 오류가있는 블록 결과에 child_method에 대한 호출을 실행하려고하면블록 내에서 인스턴스 메소드 호출하기

class SuperKlass 
    def self.exec_later(&block) 
    @@block_for_later = block 
    end 

    def exec_now 
    return unless @@block_for_later 
    @@block_for_later.call 
    end 
end 

class ChildKlass < SuperKlass 
    exec_later do 
    child_method 
    end 

    def child_method 
    puts "Child method called" 
    end 
end 

test_klass = ChildKlass.new 
test_klass.exec_now 

: 이것 좀 보라. 누군가 내가 뭘 잘못하고 있는지 알고 있고, 이와 같은 기능을 추가하는 올바른 방법은 무엇입니까?

답변

4

블록 exec_laterChildKlass의 컨텍스트에서 실행되고 test_klass 인스턴스는 실행되지 않습니다. child_method은 인스턴스 메소드이므로 ChildKlass에는 없습니다.

UPDATE :

def exec_now 
    return unless @@block_for_later 
    instance_eval &@@block_for_later 
    end 
+0

좋아,이 작품 : 나는 해결책을 발견했다. 나는 instance_eval에 대해 알고 있었지만 앰퍼샌드가있는 블록을 실행하는 데 사용할 수 있는지는 몰랐습니다. 답장을 보내 주셔서 감사합니다. – dhoelzgen

+2

나는 지금 메타 프로그래밍을 배우고 있기 때문에 당신을 도울 수있어서 기쁘다. 그리고 나는 새로운 지식을 성공과 함께 사용할 수있다. :) 앰퍼샌드의 사용에 관해서, 나는 많은 메소드/proc 호출 세부 사항을 배웠다. [http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls#The_ampersand_.28.26.29]. 나는 그것이 당신에게도 유용 할 수 있기를 바랍니다. –

+0

이 링크는 정말 도움이됩니다. 다시 감사드립니다. :) 블록 (링크)에 대한 인수를 전달하는 데 도움이 될만한 다른 링크 [여기] (http://www.ruby-forum.com/topic/54096#32642)를 발견했습니다. 이 방법이라고합니다. – dhoelzgen

관련 문제