如何在像instance_eval方法的块中更改self?

时间:2012-02-27 06:09:51

标签: ruby metaprogramming self

instance_eval方法在其块中更改self,例如:

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

如果我们定义一个方法selfelf(或任何其他方法(除了instance_eval)接受一个块),当print self时,我们将获得'main',这与instance_eval方法不同.eg:

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

如何定义像instance_eval这样的方法(采用块)? 提前谢谢。

2 个答案:

答案 0 :(得分:8)

您可以编写一个接受proc参数的方法,然后将其作为proc参数传递给instance_eval。

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>

答案 1 :(得分: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