2010-05-03 21 views
27

Tôi biết điều này:gọi proc với instance_eval bằng các đối số?

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

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

Tuy nhiên tôi muốn vượt qua đối số cho proc, vì vậy tôi cố gắng này mà không làm việc:

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 

bất cứ ai có thể giúp tôi làm cho nó hoạt động?

+0

Bạn có lỗi đánh máy. 'gsub! (" gretting "," greeting ")' –

+0

đã được sửa. Xin lỗi vì điều đó. Cảm ơn Marc. –

Trả lời

50

Sử dụng instance_exec thay vì instance_eval khi bạn cần chuyển đối số.

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!" 

Lưu ý: nó mới với Ruby 1.8.7, vì vậy hãy nâng cấp hoặc require 'backports' nếu cần.

+2

Có bất cứ điều gì 'backports' * không thể * làm gì? :-) –

+0

@ Jörg :-) Tôi ước rằng không có ... Quá xấu một số thứ ngoài tầm với, như 'Phương pháp # source_location' hoặc công cụ mã hóa. Và 'instance_exec' là hack xấu nhất trong gem ... –

Các vấn đề liên quan