2011-01-25 41 views
21

Ruby có sự khác biệt giữa các Procs được tạo thông qua Proc.newlambda (hoặc toán tử ->() trong 1,9). Có vẻ như các Procs không phải lambda sẽ tách một mảng được truyền qua các đối số khối; Procs được tạo thông qua lambda thì không.Sự khác biệt giữa Proc và Lambda

p = Proc.new { |a,b| a + b} 
p[[1,2]] # => 3 

l = lambda { |a,b| a + b } 
l[[1,2]] # => ArgumentError: wrong number of arguments (1 for 2) 

Có ai có thông tin chi tiết về động cơ đằng sau hành vi này không?

+3

Bạn có thể đã biết điều này, nhưng điều này hoạt động: 'l = lambda {| (a, b) | a + b}; l [[1,2]] # => 3' – Phrogz

Trả lời

38

Có hai khác biệt chính giữa lambdas và phi lambda Proc s:

  1. Cũng giống như phương pháp, lambdas trở về từ bản thân, trong khi phi lambda Proc s trở về từ phương pháp kèm theo, giống như các khối.
  2. Cũng giống như các phương pháp, lambdas có kiểm tra đối số chặt chẽ, trong khi non-lambda Proc s có kiểm tra đối số lỏng lẻo, giống như các khối.

Hoặc, ngắn gọn: lambdas hoạt động giống như phương pháp, non-lambda Proc hoạt động như khối.

Những gì bạn đang thấy có ví dụ về số 2. Hãy thử nó với một khối và một phương pháp ngoài một phi lambda Proc và một lambda, và bạn sẽ thấy. (Nếu không có hành vi này, Hash#each sẽ là một thực Pita để sử dụng, vì nó không năng suất một mảng với hai yếu tố, nhưng bạn khá nhiều luôn muốn đối xử với nó như hai đối số.)

+1

Cảm ơn phản ứng nhanh. Có # each/#sort là cách tôi bắt gặp điều này ngay từ đầu. Tôi đã sử dụng cú pháp sau đây để tránh tính đầy đủ của Proc.new: -> ((a, b)) {...} – Brian

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