2012-02-27 5 views
7

instance_eval 방법 변경 자체, 예를 들면 :instance_eval 메서드와 같은 블록에서 자기를 변경하는 방법은 무엇입니까? 그 블록의

class D; end 
d = D.new 
d.instance_eval do 
    puts self # print something like #<D:0x8a6d9f4>, not 'main'! 
end 

우리는 인쇄 자체가, 우리의 주요 얻을 것이다 때, (블록 소요 instance_eval 이상 또는 다른 방법 (기타)) 해결할 방법을 정의하는 경우 'instance_eval method.eg 상이한 이는 :

[1].each do |e| 
    puts self # print 'main' 
end 

어떻게 instance_eval 같이 (블럭 소요) 방법을 정의 할 수 있을까? 미리 감사드립니다.

+0

당신이 달성 할 무엇을 위해? – megas

+0

나는 당신이 원하는 것을 할 수 있다고 생각하지 않는다. 아마 너 혼자 스스로를 바꿀 수 있다면 너무 혼란 스러울거야. –

답변

7

당신은 instance_eval하는 PROC 인수로 되었 다음 시저 인수를 받아들이는 방법을 쓸 수 있습니다.

class Foo 
    def bar(&b) 
    # Do something here first. 
    instance_eval &b 
    # Do something else here afterward, call it again, etc. 
    end 
end 

Foo.new.bar {두고 자기}

수익률

#<Foo:0x100329f00> 
+0

무슨 뜻인지 알지만 내 문제는 해결하지 못했습니다. instance_eval 대신에 instance_eval과 같은 메소드를 정의하고 싶습니다. 래퍼가 아닌 구현을 원합니다. 모두 똑같아요! – gaols

+1

달성하고자하는 것에 대해보다 구체적으로 설명해야합니다. 블록을 받아 들일 수있는 메소드를 원한다면 메소드와 동일한 컨텍스트 내에서 한 번 이상 실행하면됩니다. 추측을해야한다면 아마도 블록에 인수를 전달하기를 원할 것입니다. RSpec이 그것을 수행 할 수 있기 때문에 이것이 가능하다는 것을 알고 있습니다. 그리고이 예제는 그렇지 않습니다. 나는 RSpec 코드를 살펴보고 그들이 어떻게하는지 알아보아야한다. –

+0

사실, RSpec은 params를 차단하지 않고 instance_eval을 사용하여 블록을 호출합니다. http://rubydoc.info/gems/rspec-core/RSpec/Core/Example#run-instance_method를보고 "소스보기"를 클릭하십시오. –

3

그것은 명백하다 :

class Object 
    def your_method(*args, &block) 
    instance_eval &block 
    end 
end 

receiver = Object.new 

receiver.your_method do 
    puts self #=> it will print the self of receiver 
end 
+0

미안, 내가 원하는 건 블록을 취하는 방법이고 그 블록 자체는 receiver_eval처럼 수신기로 바뀐다! – gaols

+0

다시 도움 주셔서 감사합니다. – gaols

관련 문제