2012-02-27 21 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

あなたはprocの引数を受け取るメソッドを記述し、その後、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

あなたは達成したいことについてもっと具体的にする必要があります。ブロックを受け入れ、メソッドと同じコンテキスト内でブロックを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

申し訳ありませんが、私が望むのは、ブロックを取るメソッドで、そのブロックでは、selfはinstance_evalのように受信者に変更されます! – gaols

+0

もう一度お世話になりました! – gaols

関連する問題