2010-05-03 5 views
27

Я знаю, что это работает:вызов proc с экземпляром instance_eval с аргументами?

proc = Proc.new do 
    puts self.hi + ' world' 
end 

class Usa 
    def hi 
    "Hello!" 
    end 
end 
Usa.new.instance_eval &proc 

Однако я хочу, чтобы передать аргументы прок, так что я попробовал это, не работает:

proc = Proc.new do |greeting| 
    puts self.hi + greeting 
end 

class Usa 
    def hi 
    "Hello!" 
    end 
end 
Usa.new.instance_eval &proc, 'world' # does not work 
Usa.new.instance_eval &proc('world') # does not work 

Может кто-нибудь помочь мне заставить его работать?

+0

У вас есть опечатка. 'gsub! (« gretting »,« greeting »)' –

+0

исправлено. Извини за это. Спасибо, Марк. –

ответ

50

Используйте instance_exec вместо instance_eval, когда вам необходимо передать аргументы.

proc = Proc.new do |greeting| 
    puts self.hi + greeting 
end 

class Usa 
    def hi 
    "Hello, " 
    end 
end 
Usa.new.instance_exec 'world!', &proC# => "Hello, world!" 

Примечание: это новая Руби 1.8.7, поэтому обновить или require 'backports' в случае необходимости.

+2

Есть ли что-нибудь 'backports' * не может * сделать? :-) –

+0

@ Jörg :-) Жаль, что не было ... Слишком плохо, что некоторые вещи недоступны, например 'Method # source_location' или материал для кодирования. И 'instance_exec' - самый уродливый взлом в камне ... –