2012-04-18 68 views
8

Tôi đọc cùng trong cuốc 1.9 và tác giả sử dụng lambda như thế này:Sự khác nhau giữa lambda và def method_name trong Ruby

bo = lambda {|param| puts "You called me with #{param}"} 
bo.call 99  => 'You called me with 99' 
bo.call "cat" => 'You called me with cat' 

Câu hỏi của tôi là: Làm thế nào là này bất kỳ tốt hơn/xấu/khác nhau hơn là chỉ xác định một phương pháp làm điều tương tự? Giống như vậy:

def bo(param) 
    puts "You called me with #{param}" 
end 

bo("hello") => 'You called me with hello' 

Với tôi cú pháp lambda có vẻ khó hiểu hơn và giống như mì spaghetti.

+0

Thêm tính năng động – texasbruce

+1

Ngoài ra lambda là một Proc đặc biệt. Nó không phải là một phương pháp. – texasbruce

Trả lời

13

Lambdas:

  • là biến thể của Procs,
  • có thể được chuyển đổi sang/từ blocks,
  • không bắt đầu một mới closure scope (nghĩa là bạn có thể truy cập các biến định nghĩa bên ngoài phạm vi của lambda của bạn, không giống như def),
  • có thể được truyền xung quanh dưới dạng biến.

Tôi khuyên bạn nên xem this article giải thích procs, blocks và lambdas.

Chỉnh sửa: Liên kết này đã lỗi thời. Để tham khảo trong tương lai, hãy thử this article

+0

Câu trả lời đơn giản tuyệt vời! Đây là tất cả những gì tôi đang tìm kiếm –

3

Lợi thế xác định lambda cho bạn là bạn có thể chuyển đối tượng lambda đó làm thuộc tính cho phương thức khác.

def method1 &b 
    #... some code 
    b.call 
end 

def method2 &b 
    #... some more code... 
    b.call 
end 

def method3 &b 
    b.call 
    #even more code here 
end 

myCallback = lambda { "this is a callback that can be called from several methods"} 

Sau đó bạn có thể sử dụng nó như thế này:

method1 &myCallback 
method2 &myCallback 
method3 &myCallback 

Và vẻ đẹp của này, là bạn chỉ viết mã của callback một lần, nhưng sử dụng nó 3 lần ....

tôi sẽ khuyên bạn hãy nhìn vào link này để đọc thêm :)

+1

trong trường hợp khối, bạn cũng có thể sử dụng 'yield' thay vì' block.call'. Điều này thực tế được ưa thích vì nó nhanh hơn một chút. –

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