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
Đăng ký theo dõi ủng hộ kênh