Proc và Lambda trong Ruby: Sự Khác Biệt và Cách Sử Dụng

Trong ngôn ngữ lập trình Ruby, Proc và Lambda đóng vai trò quan trọng, mang lại sự linh hoạt cho việc xử lý hàm và thực hiện các tác vụ khác nhau. Trong bài viết này, chúng ta sẽ khám phá sự khác biệt giữa Proc và Lambda, cách chúng được tích hợp có thể làm cho mã nguồn của bạn trở nên mạnh mẽ, linh hoạt, và dễ đọc hơn. Cùng đi sâu vào thế giới của Proc và Lambda để hiểu rõ hơn và nâng cao kĩ năng lập trình của bạn!

1. Proc

1.1 Khái niệm

  • Proc là một class trong Ruby
  • Đối tượng Proc là sự đóng gói của một khối mã, có thể được lưu trữ trong một biến, được truyền vào một method hoặc Proc khác và được gọi khi cần dùng

1.2 Khai báo và sử dụng Proc

  • Proc có 2 cách khai báo và nhiều cách gọi
Ruby
# Lambda-like syntax
sample_proc = Proc.new {|x| puts x}
# Or short syntax
sample_proc = proc {|x| puts x}

# Call proc (Output: 10)
sample_proc.call(10) 
# Or
sample_proc[10]
# Or
sample_proc.10
# Or
sample_proc.yield(10)

2. Lambda

2.1 Khái niệm

  • Lambda là một đối tượng đặc biệt của Proc, mang lại cú pháp đơn giản hơn cho việc định nghĩa hàm

2.2 Khai báo và sử dụng Lambda

  • Lambda có 2 cách khai báo. Cách gọi Lambda cũng giống như gọi Proc
Ruby
sample_lambda = lambda {|x| puts x}
# Or
sample_lambda = ->(x) {puts x}

3. Sự khác biệt

Ngoài syntax khai báo thì Proc và Lambda còn có những điểm khác biệt sau

3.1 Parameters

This image has an empty alt attribute; its file name is Screen-Shot-2023-11-15-at-9.42.33-AM-1024x393.png
  • Proc không cần truyền đúng số lượng arguments vẫn hoạt động tốt
  • Lambda bắt buộc truyền đúng số lượng arguments nếu không sẽ raise errors
  • Proc có khả năng giải cấu trúc mảng để tương ứng với arguments
  • Lambda thì không

3.2 Return

  • Khi gặp lệnh return trong method
    • Proc lập tức thoát hàm và không xử lý gì thêm
    • Lambda vẫn xử lý như một method thông thường
  • Khi return hiện diện trực tiếp trong block
    • Proc sẽ báo lỗi khi gọi
    • Lambda vẫn hoạt động tốt
Đây là lý do vì sao trong Rails, bạn sẽ hiếm khi thấy ai dùng Proc để viết scope, vì Proc kém linh hoạt hơn Lambda ở cú pháp return này

4. Một vài method khác

4.1 lambda?

Để kiểm tra một đối tượng Proc có phải là lambda hay không

4.2 source_location

Trả về tên file và số dòng chứa đối tượng Proc này

This image has an empty alt attribute; its file name is Screen-Shot-2023-11-15-at-11.13.57-AM.png

4.3 Others

Còn rất nhiều method hữu ích dành cho proclambda, bạn có thể tham khảo trực tiếp trên docs của Ruby

https://ruby-doc.org/3.1.2/Proc.html

5. Lời kết

  • Chúng ta đã khám phá xong sự khác biệt giữa ProcLambda trong Ruby
  • Dù cả hai đều là đối tượng của Proc nhưng Lambda mang lại sự linh hoạt hơn với cú pháp khai báo, xử lý tham số nghiêm túc, và kiểm soát lệnh return
  • ProcLambda đều có vai trò quan trọng trong việc làm cho mã nguồn Ruby trở nên mạnh mẽ và dễ đọc hơn, tùy thuộc vào ngữ cảnh sử dụng
0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like
Cài đặt Rails 7 với Vite + Stimulus + Tailwind
Read More

Cài đặt Rails 7 với Vite + Stimulus + Tailwind

Nếu bạn đang tìm kiếm một giải pháp phát triển web hiệu suất cao và tiện lợi, Vite sẽ là lựa chọn đáng xem xét. Còn với Rails 7, bạn sẽ phải cân nhắc xem tính năng importmap có đủ thuyết phục để bạn chuyển đổi không.