Procs trong Ruby
Ruby cung cấp khả năng tạo ra một khối lệnh gom nó trở thành một đối tượng - đối tượng này gọi là proc
, nó chứa trong nó biến, các tác vụ và như vậy thông qua đối tượng proc bạn chạy khối lệnh bất kỳ khi nào muốn
xinchao = Proc.new do |name| puts "Xin chào #{name}" end xinchao.call "XuanThuLab" # Welcome XuanThuLab
Thấy rằng Proc khá giống với phương thức, trong Proc các nhận các tham
số khai báo trong |thamso1, thamso2 ...|
, khi gọi thì thực hiện
object.call ...
Tuy nhiên Proc là một đối tượng chứ không phải phương thức, nên có thể làm tham số cho các phương thức ...
tong = Proc.new do |a, b| a + b end hieu = Proc.new do |a, b| a - b end def tinhtoan(pheptinh, a, b) puts "Kết quả tính #{pheptinh.call(a, b)}" end # Sử dụng Proc làm tham số của phương thức tinhtoan(tong, 1, 2) tinhtoan(hieu, 1, 2) # Kết quả tính 3 # Kết quả tính -1
Biểu thức Lambda Ruby
Biểu thức Lambda rất giống với Proc, tạo Lambda bằng từ khóa lambda
talk = lambda {puts "Hi"}
Hoặc ngắn ngọn hơn tạo biểu thức lambda talk ở trên bằng ký hiệu ->
talk = ->() {puts "Hi"}
Để gọi lambda thực hiện phương thức call: talk.call
Lambda còn gọi là phương thức vô danh, nó có điểm khác với Proc là kiểm tra chính xác tham số ngay khi gọi
xinchao = -> (name) { puts "Xin chào #{name}" } xinchao.call("XTL") # Xin chào XTL
Nhưng nếu gọi lambda thiếu tham số sẽ lỗi, ví dụ : xinchao.call, còn đối với Proc thì không kiểm tra tham số khi gọi
xinchao = Proc.new do |name| puts "Xin chào #{name}" end xinchao.call("XTL") # Xin chào XTL xinchao.call # gọi Proc không tham số, xinchao vẫn chạy bình thường # Xin chào