2012-07-20 61 views
1

我意識到,你可以使用instance_eval更改塊綁定沒有評估?

class Foo 
    def bar &block 
    instance_eval &block 
    end 
end 

Foo.new.bar { self } # returns the instance 

但一些內置的方法接受塊,而在這種情況下,它似乎並不可能改變模塊的結合,而不與搞亂改變塊的結合內置方法的內部。

class Foo 
    def enum &block 
    Enumerator.new &block 
    end 
end 

Foo.new.enum { self }.each {} # returns main!!! 

有沒有辦法解決這個問題?

+0

我很確定你不能在1.8或1.9中做到這一點。 Rubinius肯定會有辦法,但不是標準的Ruby。至少不是沒有任何C代碼。 – 2012-07-20 21:33:36

回答

1

您可以解決這樣說:

class Foo 
    def enum &block 
    Enumerator.new do |*args| 
     instance_exec *args, &block 
    end 
    end 
end 

但我相信,你不能改變現有的Proc短的instance_eval/instance_exec -ing它的約束力。