Block, procs và lambdas trong Ruby là các tính năng này cho phép chuyển mã lệnh vào một method và thực thi mã đó tại một thời gian sau đó (khi method chứa mã lệnh được gọi).
Block đơn giản chỉ là tập hợp các lệnh thành một khối(method) được đặt trong dấu {...} hoặc do...end sử dụng {...} cho các block đơn(1 dòng lệnh) sử dụng do...end cho các block bội(multi-line)
Proc trong Ruby là một đối tượng đại diện cho một khối mã (block) có thể được lưu trữ trong một biến và thực thi sau đó. Proc có thể được sử dụng để gói gọn logic và truyền nó như một tham số cho các phương thức hoặc lưu trữ để sử dụng sau.
Tạo một đối tượng Proc: có thể tạo một đối tượng Proc bằng cách sử dụng Proc.new, hoặc sử dụng cú pháp -> (lambda)
vd:
my_proc = Proc.new{|x| puts "Hello #{x}"}
my_lambda = ->(x) {puts "Hello #{x}"}
Gọi một đối tượng Proc: để gọi một Proc, cần sử dụng phương thức call my_proc.call("viet") => Hello Viet my_lambda.call("viet") => Hello Viet
Sự khác biệt giữa Proc và Lambda:
- Kiểm tra số lượng tham số: Lambda kiểm tra số lượng tham số đầu vào nghiêm ngặt hơn Proc. Nếu số lượng tham số không khớp với định nghĩa, lambda sẽ ném lỗi. Trong khi Proc sẽ gán giá trị nil cho tham số thiếu hoặc bỏ qua các tham số thừa
proc:
lambda:
- Return behavior: trong Lambda, từ khóa return chỉ kết thúc Lambda đó, trong khi Proc, return sẽ kết thúc toàn bộ phương thức chứa nó.
proc:
lambda:
Ứng dụng của Proc:
- Thường được dùng để truyền 1 block mã vào phương thức
vd:
- Lưu trữ và tái sử dụng logic: Proc có thể lưu trữ logic và sử dụng lại ở nhiều nơi trong chương trình
vd: