2008-09-19 24 views
5

Tôi thường cắm lambdas được cấu hình sẵn vào các phương pháp có thể đếm được như 'bản đồ', 'chọn', v.v. nhưng hành vi của 'tiêm' có vẻ khác. ví dụ: vớiHiểu hành vi của tiêm được sử dụng với lambda trong Ruby

mult4 = lambda {|item| item * 4 } 

sau đó

(5..10).map &mult4 

mang lại cho tôi

[20, 24, 28, 32, 36, 40] 

Tuy nhiên, nếu tôi thực hiện một lambda 2 thông số để sử dụng với một bơm như vậy,

multL = lambda {|product, n| product * n } 

Tôi muốn có thể nói

(5..10).inject(2) &multL 

từ 'bơm' có một tùy chọn đơn tham số cho giá trị ban đầu, nhưng điều đó mang lại cho tôi ...

irb(main):027:0> (5..10).inject(2) &multL 
LocalJumpError: no block given 
     from (irb):27:in `inject' 
     from (irb):27 

Tuy nhiên, nếu tôi nhồi '& multL' thành một thông số thứ hai để tiêm, sau đó nó hoạt động.

irb(main):028:0> (5..10).inject(2, &multL) 
=> 302400 

Câu hỏi của tôi là "tại sao điều đó hoạt động chứ không phải nỗ lực trước đó?"

Trả lời

10

Vì vậy, lý do mà

(5..10).map &mult4 

công trình và

(5..10).inject(2) &multL 

không là Parens ruby ​​là tiềm ẩn trong trường hợp đầu tiên, vì vậy nó thực sự có nghĩa

(5..10).map(&mult4) 

nếu bạn muốn, đối với trường hợp thứ hai, bạn có thể sử dụng

(5..10).inject 2, &multL 

Bí quyết lừa đảo bên ngoài chỉ hoạt động để truyền khối tới phương thức chứ không phải đối tượng lambda.

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