define_method는 다음과 같은 동작 전시 :루비 - define_method 및 폐쇄
class TestClass
def exec_block(&block) ; yield ; end
end
TestClass.new.send(:exec_block) do ; puts self ; end
# -> main
TestClass.send(:define_method, :bing) do ; puts self ; end
TestClass.new.bing
# -> <TestClass:...>
는 내가 이해하지 못하는 것은이 define_method에 전달 된 블록이 폐쇄되어있을 가능성이다. 따라서 적어도 의 값을 main
으로 캡처해야합니다 (내 이해에 따라) exec_block
으로 전화 할 때 표시해야합니다.
블록이 메서드의 본문이된다는 것을 알고 있지만 동작의 이유를 이해하지 못합니다. 블록이 다른 방법으로 사용될 때 블록이 다른 것으로 평가되는 이유는 무엇입니까?
다른 방법으로 define_method
의 블록 동작을 어떻게 재현 할 수 있습니까? 즉 exec_block
으로`main '대신에 <TestClass:...>
을 어떻게 출력 할 수 있습니까?
그러면 exec_block의 동작을 어떻게 설명 할 수 있습니까? 'self'가 포착되지 않았다면'main'을 출력해야합니다. 또는 나는 무엇인가 놓치 느냐? – Norswap
죄송합니다, 나는 tought의 반대를 썼습니다. 사실'print'는'main'을 출력하고 캡처되지 않았다면'TestClass : ...>'를 출력해야합니다. – Norswap
니스! 그러나 만약 자신이 동적으로 바인드되어 있다면,'TestClass'는'exec_block'의 경우를 출력하지 않아야합니까? 블록은'yield whitin'TestClass'에 의해 호출되기 때문에. 사실 Ruby가 블록의 정의를 읽을 때 어떤 일이 발생하는지에 대해서는 명확하지 않습니다. 예를 들어'self'에 관해 저장된 정보가 저장되어 있습니까? (또한 답안에 귀하의 의견을 요약한다면, 나는 그것을 받아 들일 것입니다.) – Norswap