2013-03-08 38 views

Trả lời

13

instance_eval có hiệu suất self (User) cho lambda. Lambdas đặc biệt về các tham số của chúng - theo cùng cách thức - và sẽ tăng ArgumentError nếu có quá ít/nhiều.

class User 
    code1 = Proc.new { |x| x == User } # true 
    code2 = lambda { |x| x == User } # true 

    define_method :test do 
    self.class.instance_eval &code1 
    self.class.instance_eval &code2 
    end 
end 

liên quan: What's the difference between a proc and a lambda in Ruby?

+1

Cũng liên quan: http://stackoverflow.com/questions/12648157/instance-evals-block-arguments-documented-purpose – rampion

+0

Trong phiên bản lambda của tôi không tham gia bất kỳ đối số nào. Và tôi không đi qua bất kỳ lúc nào của instance_eval. Vì vậy, tại sao vấn đề này của số đối số không khớp. –

+0

'instance_eval' là tự cung cấp cho proc/lambda. – pdoherty926

4

Nếu bạn vẫn muốn sử dụng lambda, mã này sẽ làm việc:

block = lambda { "Hello" } # or -> { "Hello" } 
some_obj.instance_exec(&block) 

instance_exec trái với instance_eval sẽ không cung cấp self như một cuộc tranh cãi với khối nhất định, vì vậy wrong number of arguments (1 for 0) sẽ không bị ném.

Nhìn here để biết thêm thông tin.

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