2009-02-08 3 views
26

Возможно ли выполнить proc в контексте другого объекта?Binding of Procs

Я знаю, что обычно вы делаете proc.call (foo), а затем блок должен определять параметр. Мне было интересно, могу ли я заставить «я» привязать к foo, так что нет необходимости иметь параметр блока.

proc = Proc.new { self.hello } 

class Foo 
    def hello 
    puts "Hello!" 
    end 
end 

foo = Foo.new 

# How can proc be executed within the context of foo 
# such that it outputs the string "Hello"? 

proc.call 

ответ

41
foo.instance_eval &proc 

instance_eval может принимать блок вместо строки, а оператор & превращает прок в блок для использования с вызовом метода.

+0

'foo.instance_eval (& POC)' –

+0

Может кто-нибудь дать мне ссылку документации для этого? Это, безусловно, работает (и это действительно потрясающе), но я бы хотел прочитать документы. :) –

+1

@Josh Glover: http://www.ruby-doc.org/core-1.8.7/classes/Object.html#M000005 – Chuck

0

Это рубин 1.9:

class MyCat 
    def initialize(start, &block) 
    @elsewhere = start 
    define_singleton_method(:run_elsewhere, block) if block_given? 
    end 
end 
MyCat.new('Hello'){ @elsewehere << ' world' }.run_elsewhere