Lambda và Proc trong Ruby
Trong Ruby, Lambda và Proc đều là các đối tượng có thể lưu trữ một khối code để thực thi sau. Tuy nhiên, chúng có những điểm khác biệt quan trọng.

1. Proc là gì?
Proc là một đối tượng trong Ruby có thể lưu trữ một khối code và thực thi nhiều lần khi cần.
Khai báo Proc
Có nhiều cách để tạo một Proc
trong Ruby:
say_hello = Proc.new { puts "Xin chào!" }
say_hello.call # Output: Xin chào!
say_hello = proc { puts "Xin chào!" }
say_hello.call # Output: Xin chào!
Truyền Tham Số vào Proc
tong = Proc.new { |a, b| puts a + b }
tong.call(5, 10) # Output: 15
Nếu truyền ít tham số hơn số lượng yêu cầu, Proc
sẽ không báo lỗi mà chỉ gán nil
cho tham số thiếu.
tong.call(5) # Output: Lỗi vì b = nil và phép cộng không thể thực hiện
2. Lambda là gì?
Lambda là một đối tượng tương tự như Proc
nhưng có một số khác biệt quan trọng.
Khai báo Lambda
Có hai cách để khai báo một lambda:
say_hello = lambda { puts "Xin chào từ Lambda!" }
say_hello.call # Output: Xin chào từ Lambda!
say_hello = -> { puts "Xin chào từ Lambda!" }
say_hello.call # Output: Xin chào từ Lambda!
Truyền Tham Số vào Lambda
tong = ->(a, b) { puts a + b }
tong.call(5, 10) # Output: 15
Không giống như Proc
, nếu thiếu tham số, Lambda sẽ báo lỗi:
tong.call(5) # ArgumentError: wrong number of arguments (given 1, expected 2)
3. Khác Biệt Giữa Proc và Lambda
Đặc điểm | Proc | Lambda |
---|---|---|
Khai báo | Proc.new { ... } hoặc proc { ... } |
lambda { ... } hoặc -> { ... } |
Kiểm tra số lượng tham số | Không kiểm tra, nếu thiếu sẽ gán nil |
Bắt buộc đúng số lượng tham số |
Hành vi khi return |
Kết thúc luôn method chứa nó | Chỉ thoát khỏi lambda, tiếp tục chạy code sau đó |
Sự khác biệt khi sử dụng return
Proc dừng toàn bộ method
def test_proc
my_proc = Proc.new { return "Dừng method!" }
my_proc.call
puts "Dòng này không bao giờ chạy!"
end
puts test_proc # Output: Dừng method!
return
trong Proc
sẽ dừng toàn bộ method chứa nó.
Lambda chỉ thoát khỏi chính nó
def test_lambda
my_lambda = -> { return "Thoát khỏi lambda!" }
puts my_lambda.call
puts "Dòng này vẫn chạy!"
end
test_lambda
# Output:
# Thoát khỏi lambda!
# Dòng này vẫn chạy!
return
trong Lambda chỉ thoát khỏi lambda, không dừng toàn bộ method.
4. Khi Nào Nên Dùng Proc hoặc Lambda?
Dùng Lambda khi:
- Cần kiểm tra chặt chẽ số lượng tham số.
- Muốn
return
chỉ thoát khỏi Lambda, không ảnh hưởng đến method chứa nó.
Dùng Proc khi:
- Cần linh hoạt với tham số (có thể nhận ít hơn số lượng quy định).
- Muốn
return
dừng toàn bộ method.
5. Ví dụ Ứng Dụng
Dùng Lambda để kiểm tra điều kiện trước khi thực thi:
kiem_tra_tuoi = ->(tuoi) { puts tuoi >= 18 ? "Đủ tuổi" : "Chưa đủ tuổi" }
kiem_tra_tuoi.call(20) # Output: Đủ tuổi
kiem_tra_tuoi.call(16) # Output: Chưa đủ tuổi
Dùng Proc để thực thi một logic nhiều lần:
tinh_gia_tri = Proc.new { |n| n * 2 }
puts tinh_gia_tri.call(10) # Output: 20
puts tinh_gia_tri.call(5) # Output: 10
Tóm Tắt
Tiêu chí | Proc | Lambda |
---|---|---|
Khai báo | Proc.new {} hoặc proc {} |
lambda {} hoặc -> {} |
Kiểm tra số tham số | Không kiểm tra | Kiểm tra chặt chẽ |
Hành vi return |
Dừng luôn method chứa nó | Chỉ thoát khỏi Lambda |
Tính linh hoạt | Linh hoạt với số lượng tham số | Chặt chẽ với tham số |
Hiểu rõ sự khác nhau giữa Proc và Lambda sẽ giúp bạn viết code Ruby hiệu quả hơn

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.
Xem thêm

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.
Liên hệ công việc qua email dưới đây.
lhvuctu@gmail.com