2013-07-25 3 views
1

Я следующий кодРубин передать аргументы, чтобы блокировать

class SomeClass 
    #define method, which take block and save it into class variable 
    def self.test(&block) 
    @@block = block 
    end 
    #pass block to method 
    test do |z| 
    p self 
    p z 
    end 
    #call block with argument and change context 
    def call_block(arg) 
    block = @@block 
    instance_eval &block.call(arg) 
    end 
end 

s = SomeClass.new 
s.call_block("test") 

Я получил выход

SomeClass # Why not instance? 
"test" 
4.rb:14:in `call_block': wrong argument type String (expected Proc) (TypeError) 
from test.rb:20:in `<main>' 

Почему результат? Как изменить область действия с экземпляра SomeClass на SomeClass?

UPD:

Ошибка, потому что блок возврата строки, но должен быть обратный блок или лямбда или процедурный.

+0

возможно дубликат [Обеспечить ценность для себя при использовании ProC# вызов] (http://stackoverflow.com/questions/1728900/provide-value-for-self-when-using-proccall) – sawa

+0

это не дубликат – mike

ответ

3
... 
    #call block with argument and change context 
    def call_block(arg) 
    block = @@block 
    instance_exec(arg, &block) 
    end 
end 

s = SomeClass.new 
s.call_block("test") 

#<SomeClass:0x10308ad28> 
"test" 
+0

простой и мощный. благодаря – mike