Как изменить себя в блоке, как метод instance_eval? - PullRequest
8 голосов
/ 27 февраля 2012

метод instance_eval меняет self в своем блоке, например:

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

Если мы определяем метод сам (или любые другие методы (кроме instance_eval), который принимает блок), при печати self мы будемget 'main', который отличается от instance_eval method.eg:

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

Как я могу определить метод (который принимает блок), например instance_eval?Заранее спасибо.

Ответы [ 2 ]

8 голосов
/ 27 февраля 2012

Вы можете написать метод, который принимает аргумент 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>
3 голосов
/ 27 февраля 2012

Это очевидно:

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
...