Lambda và Proc trong Ruby

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 4 tháng 2, 2025

Trong Ruby, LambdaProc đề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 ProcLambda sẽ giúp bạn viết code Ruby hiệu quả hơn

Website Logo

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.

Bình luận

Website Logo

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

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ