Phân biệt Block, Proc và Lambda trong ruby

Những người dùng mới bắt đầu Ruby thường gặp vấn đề trong việc hiểu và phân biệt giữa các khái niệm block, proc và lambda bởi vì chúng xử lý khá giống nhau và mới so với những ngôn ngữ lập trình trước. Bài viết này cung cấp một số ví dụ đơn giản để bạn có thể phân biệt và biết cách sử dụng trong từng trường hợp cụ thể.

    1. Block

Block được sử dụng rất nhiều trong Ruby, chỉ đơn giản là tập hợp các lệnh thành một khối duy nhất. Thông thường block được dùng để thực hiện một chức năng nào đó đối với từng phần tử trong một array hoặc hash.

Block phải được định nghĩa trong khối {…} (hoặc cũng có thể là do…end). Ở ví dụ trên, block chỉ thực hiện nhiệm vụ đơn giản là nhận 1 tham số và hiển thị giá trị của tham số đó.

                 2.   Proc

Sử dụng block có một hạn chế, trong ví dụ trên, nếu bạn có một array khác và cũng muốn hiển thị giá trị của array đó thì bạn phải viết lại toàn bộ block, sẽ là cực hình nếu block dài. Một ý tưởng để giải quyết vấn đề trên là “đặt” cho block một cái tên và khi nào cần sử dụng block, ta chỉ cần gọi tên block đó, việc này có thể làm được bằng Proc trong Ruby

Trong đoạn code trên, ta định nghĩa một biến p là “tên” của block cần sử dụng. Như vậy, bất cứ khi nào cần sử dụng block ta chỉ cần gọi tên như trong hàm (lưu ý phải có kí tự & để hiểu tham số được truyền vào là Proc).

Proc cũng có thể được gọi trực tiếp

             3.    Lambda

Lambda khá giống với Proc, tuy nhiên vẫn có một số điểm khác nhau đáng lưu ý sau đây.

  • Lamda cũng thuộc class Proc
  •  Lamda check số lượng tham số truyền vào, proc thì không
  • Cách xử lý từ khóa return là khác nhau giữa proc và lambda, cụ thể với return trong proc, hàm gọi bên ngoài cũng sẽ kết thúc ngay lập tức, trong khi đó lambda vẫn sẽ tiếp tục thưc hiện các câu lệnh tiếp theo của hàm gọi cho đến khi dừng hẳn

Bài viết chỉ cung cấp những ví dụ đơn giản nhằm giúp bạn hiểu thêm về block, proc và lambda trong ruby, hi vọng sẽ có ích cho các bạn. Chúc các bạn vui vẻ

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s