Cả hai đều là object Proc, khác ở 2 điểm then chốt:
1. Kiểm tra arity:
- lambda: sai số arg → ArgumentError.
- proc: thiếu → nil, thừa → bỏ qua.
2. Semantics của return:
- lambda: return chỉ thoát khỏi lambda.
- proc: return thoát khỏi method chứa nó (có thể gây LocalJumpError nếu không trong method).
ruby
lam = lambda { |x| x * 2 }
lam.call(3) # => 6
lam.call(3, 99) # => ArgumentError
pr = proc { |x| x * 2 }
pr.call(3, 99) # => 6 (99 bị bỏ)
# Phân biệt return
def test_lambda
lam = lambda { return 10 }
lam.call
"after lambda" # luôn chạy đến đây
end
def test_proc
pr = proc { return 10 }
pr.call
"after proc" # KHÔNG bao giờ chạy
endHình dung: lambda hành xử như method thật; proc như đoạn code dán thẳng vào chỗ gọi.