2011-10-05 5 views
2

IRB는 시행 착오 스타일 디버깅을위한 도구로 매우 유용합니다. 여기서 문제가 어디서 발생했는지는 알 수 없지만 IRB의 REPL 특성을 활용하여 잠재적 인 방법 목록을 신속하게 반복 할 수 있습니다 문제를 재생산하고IRB에서 주변을 파고 들기/디버깅하기. 원숭이 패치 방법, 그런 다음 변경 사항을 "실행 취소", IRB를 종료하지 않고?

때때로로드 된 보석에 속한 클래스를 다시 열고 디버그 출력을 메서드에 추가하거나 메서드를 완전히 재정의하기로 결정했습니다. 일단 완료되면, IRB를 종료하고 다시 시작하지 않고 ("현재의 접근 방식") 클래스에 "un-monkey patch"라는 쉬운 방법이 있습니까?

+0

때때로 변화는 되돌아갑니다 '/ file.rb에/경로'부하를 수행하여. 하지만 보석이 이미 원숭이 패치를 한 경우에는 irb를 다시 시작해야합니다. 그렇지 않으면 원본 구현보다는 변경 사항을 Monkeypatch 할 수 있습니다. – Augusto

+0

alias_method 또는 이와 유사한 것을 사용하면 실제 메소드를 덮어 쓰는 대신에 메소드를 "unalias"하는 것만 큼 쉬운 것인지 궁금합니다. – d11wtq

+0

필자는이 기능이 루비 2에 있다고 생각한다. ** 나는 정말로 ** 반드시 커널, 모듈 및 객체에 대한 메소드를 추가/재정의하는 많은 프레임 워크가 필요하다고 생각한다. – Augusto

답변

2

메소드를 재정의하는 경우 이전 메소드에 대해 alias을 작성한 다음 새 메소드를 정의 할 수 있습니다. 작업이 끝나면 메서드를 다시 재정의하고 메서드 별칭을 호출 할 수 있습니다.

1 단계는 :

alias :old_method :method 

def method 
    # fancy new stuff 
end 

작업이 완료되면 :

def method 
    old_method 
end 
+0

하하하하. 나는 마음이 거칠게 움직이고있을 때 원래 질문에 대해이 말을 덧붙여서 정확히 똑같은 것을 보았다. 이것은 내가 생각하고 있었던 것과 똑같이 보인다. 감사! – d11wtq

+0

이 트릭은 치료법입니다! – d11wtq

+2

다시 정의하는 대신 "별칭 : 메서드 : old_method"(및 정리하려면 clean_method (: old_method))를 "다시 별칭"으로 지정할 수 있습니다. – steenslag