2013-05-14 30 views
5

Để được rõ ràng - mã này đang chạy một cách hoàn hảo - code with prockhi gọi instance_eval (& lambda) để vượt qua bối cảnh hiện nay đã nhận lỗi 'sai số lập luận'

nhưng nếu thay vào đó tôi thay đổi Proc.new để lambda, tôi gặp lỗi

ArgumentError: wrong number of arguments (1 for 0) 

Có thể điều này là do instance_eval muốn chuyển cho mình như một tham số và lambda coi như một phương thức và không chấp nhận thông số không xác định?

Có hai ví dụ - lần đầu tiên được làm việc:

class Rule 
    def get_rule 
    Proc.new { puts name } 
    end 
end 

class Person 
    attr_accessor :name 

    def init_rule 
    @name = "ruby" 
    instance_eval(&Rule.new.get_rule) 
    end 
end 

thứ hai không phải là:

class Rule 
    def get_rule 
    lambda { puts name } 
    end 
end 

class Person 
    attr_accessor :name 

    def init_rule 
    @name = "ruby" 
    instance_eval(&Rule.new.get_rule) 
    end 
end 

Cảm ơn

Trả lời

4

Bạn đang thực sự chính xác trong giả định của bạn. Tự đang được chuyển đến Proc và đến lambda vì nó đang được instance_eval 'ed. Một sự khác biệt lớn giữa Procs và lambdas là lambdas kiểm tra tính chất của khối đang được truyền cho chúng.

Vì vậy:

class Rule 
    def get_rule 
    lambda { |s| puts s.inspect; puts name; } 
    end 
end 

p = Person.new 
p.get_rule 

#<Person:0x007fd1099f53d0 @name="ruby"> 
ruby 

Ở đây tôi nói với lambda để mong đợi một khối với arity 1 và như bạn thấy trong công tác kiểm tra đối số, đối số thực sự là self thể hiện của lớp Person.

+0

Không phải là 'p.get_rule' thay vì 'p.init_rule'? – artificis

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