Các khối là một phần quan trọng của Ruby, thật khó để tưởng tượng ngôn ngữ mà không có chúng. Nhưng lambdas? Ai yêu lambdas? Bạn có thể mất nhiều năm mà không cần sử dụng một. Chúng gần như giống như một di tích của một thời đại đã qua.
... Nhưng điều đó không hoàn toàn đúng. Lambdas có một số thủ thuật thú vị khi bạn điều tra một chút về chúng.
Trong bài viết này, chúng ta sẽ bắt đầu với những kiến thức cơ bản về cách sử dụng lambda, sau đó chuyển sang một số cách sử dụng nâng cao thú vị hơn. Vì vậy, nếu bạn sử dụng lambdas hàng ngày và biết tất cả về chúng, chỉ cần cuộn xuống.
Điều chính cần nhớ về Lambdas là chúng hoạt động giống như các hàm. Các khối và Procs có công dụng của chúng. Nhưng cả hai đều không hoạt động 100% giống như một chức năng trong cuộc sống thực. Lambdas làm. Hãy đi xuống danh sách.
Lambdas thực thi số lượng đối số chính xác
Không giống như Procs, lambdas thực thi số lượng đối số chính xác
Lambdas hỗ trợ các đối số mặc định
Trong ví dụ dưới đây, chúng tôi tạo một hàm lambda với giá trị đối số mặc định là "hello world"
Lambdas hỗ trợ các đối số mặc định
return
từ khóa hoạt động chính xác như bạn mong đợi.
Có thể điều này nghe có vẻ là một điều nhỏ nhặt, nhưng nếu bạn đã từng cố gắng sử dụng return bên trong một proc, bạn biết nó không phải.
Ví dụ dưới đây sẽ cho bạn thấy ý tôi muốn nói. Tôi đã xác định một phương thức có tên là something
gọi một Proc
. Proc
có một câu lệnh trả về. Nhưng tuyên bố trả lại đó là khó. Thay vì chỉ trả về từ proc, nó trả về từ phương thức nào đó.
Nhưng khi tôi làm điều gì đó tương tự với lambda
, return
câu lệnh chỉ trả về từ lambda. Nó giống như bất kỳ chức năng nào khác.
Khi bạn sử dụng từ khóa return bên trong lambda, từ khóa trả về từ lambda
Lambdas đang đóng cửa
Để trích dẫn một bài đăng tuyệt vời về tràn ngăn xếp:
Cách đơn giản nhất để nghĩ về một bao đóng là một hàm ** có thể được lưu trữ dưới dạng một biến ** (được gọi là "hàm hạng nhất"), có khả năng đặc biệt để truy cập các biến cục bộ khác phạm vi nó được tạo.
Có nghĩa là gì khi có thể truy cập các biến cục bộ khác vào phạm vi mà lambda được tạo? Chúng ta hãy xem xét. Trong ví dụ dưới đây, tôi đã tạo một biến cục bộ có tên là marco
. Tôi có thể sử dụng biến đó bên trong lambda của mình. Và nếu tôi thay đổi giá trị trong biến đó, lambda sẽ thấy giá trị mới.
Ruby lambdas đang đóng
Lambdas là tắc kè hoa
Một trong những điều thực sự kỳ lạ về lambdas là chúng ta có thể gọi chúng theo nhiều cách khác nhau. Ví dụ dưới đây cho thấy ba cách để gọi lambda. Tất cả chúng đều tương đương.
Có ít nhất ba cách để gọi lambda trong Ruby
Có lẽ điều này có vẻ hơi kỳ lạ đối với bạn. Nó đã làm với tôi lúc đầu. Và thành thật mà nói, l.(arg)
cú pháp vẫn làm tôi bối rối. Nhưng l[arg]
cú pháp khá thú vị. Điều đó có nghĩa là ở một mức độ hạn chế, bạn có thể sử dụng lambdas ở những nơi mà bạn thường sử dụng một mảng hoặc một hàm băm.
Sử dụng lambdas làm mảng và băm được tính toán
Hãy tưởng tượng rằng bạn có một bộ thử nghiệm. Là một phần của quá trình khởi tạo, bạn cần tạo bản ghi Người giả. Nó đơn giản. Bạn chỉ cần tạo một bản ghi FakePerson mới và nhập họ và tên.
Nhưng điều gì sẽ xảy ra nếu bạn muốn "kiểm tra mờ" hệ thống bằng cách sử dụng họ và tên khác nhau mỗi khi chạy thử nghiệm?
Một cách để làm điều này có thể là chuyển vào hàm lambda thay vì hàm băm . Trong ví dụ này, tôi sử dụng hàm lambda để tạo tên giả thông qua viên ngọc Faker tuyệt vời.
Ở đây, lambda giả vờ là một hàm băm.
Lambdas đã cài sẵn cà ri
Currying là một kỹ thuật hay được sử dụng rất nhiều trong lập trình hàm. Đó là một cách cho phép bạn tạo các chức năng mới từ các chức năng hiện có. Thật dễ hiểu khi bạn nhìn thấy nó trong thực tế.
Trong đoạn mã dưới đây, tôi có một hàm lambda thêm hai số. Thuận tiện, nó được gọi là thêm. Sau đó, tôi sử dụng currying để tạo ra một chức năng chuyên biệt hơn được gọi là tăng dần. Nó chỉ cần thêm một vào bất kỳ số nhất định nào.
Bạn có thể cà ri bất kỳ proc nào trong Ruby
Lambdas là một loại Proc đặc biệt
Bạn có thể nhận thấy rằng trong tất cả các mẫu mã, bất cứ khi nào tôi xác định một hàm lambda, thì đổi lại tôi sẽ nhận được một Proc. Đó là bởi vì Ruby cài đặt lambdas như một loại Proc. Vì vậy, rất nhiều điều tôi đã chỉ cho bạn trong bài viết này có thể được thực hiện với Procs cũng như lambdas.
Stabby Lambdas
Trong bài viết này, tôi đã sử dụng từ khóa lambda để rõ ràng hơn. Nhưng có một cú pháp ngắn gọn hơn để định nghĩa lambdas được giới thiệu trong Ruby 1.9 và được biết đến với tên gọi là "sterby lambda". Đây là cách nó hoạt động:
Cú pháp lambda của Ruby đã được giới thiệu trong phiên bản 1.9