Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Làm Chủ Module Enumerable Ruby: Hướng Dẫn Thực Hành + Phương Thức Yêu Thích

Enumerable là gì?

Enumerable là tập hợp phương thức lặp, một module Ruby, và phần lớn khiến Ruby trở thành ngôn ngữ lập trình tuyệt vời.

Enumerable bao gồm phương thức hữu ích như:

  • map
  • select
  • inject

Phương thức Enumerable hoạt động bằng cách đưa cho chúng một block.

Trong block bạn nói muốn làm gì với mỗi phần tử.

Ví dụ:

[1,2,3].map { |n| n * 2 }

Cho mảng mới mỗi số nhân đôi.

Điều xảy ra tùy thuộc vào phương thức dùng, map giúp biến đổi tất cả giá trị, select lọc danh sách và inject cộng tổng giá trị trong mảng.

Có hơn 20 phương thức Enumerable Ruby.

Hãy nghiên cứu kỹ một phương thức.

Phương Thức Each_Cons

Phương thức Enumerable mới yêu thích của mình là each_cons!

Tại sao:

Phương thức này rất hữu ích, dùng tìm n-gram hoặc kiểm tra dãy số liên tục khi kết hợp với all?, phương thức Enumerable khác.

Làm Chủ Module Enumerable Ruby: Hướng Dẫn Thực Hành + Phương Thức Yêu Thích

each_cons cho mảng con kích thước n, nên nếu có [1,2,3], thì each_cons(2) cho [[1,2], [2,3]].

Xem ví dụ:

numbers = [3,5,4,2]
numbers.sort.each_cons(2).all? { |x,y| x == y - 1 }

Code sắp xếp số, gọi each_cons(2) trả về đối tượng Enumerator, rồi gọi all? kiểm tra tất cả phần tử thỏa điều kiện.

Ví dụ khác, dùng each_cons kiểm tra ký tự bị bao quanh bởi cùng ký tự, như xyx.

str = 'abcxyx'
str.chars.each_cons(3).any? { |a,b,c| a == c }

Còn nhiều hơn!

Nếu muốn biết pattern xuất hiện bao nhiêu lần thay vì true/false, chỉ cần đổi any? thành count.

Thậm chí thú vị hơn là triển khai phương thức each_cons.

array = []
each do |element|
  array << element
  array.shift if array.size > n
  yield array.dup if array.size == n
end

Lưu ý: Đây từ triển khai Enumerable của Rubinius. Tìm source gốc tại đây.

Triển khai bắt đầu với mảng rỗng, lặp qua phần tử dùng each.

Mọi thứ bình thường cho đến đây. Nhưng rồi thêm phần tử vào mảng và cắt mảng (dùng Array#shift) nếu kích thước lớn hơn mong muốn.

Kích thước là đối số của each_cons.

Rồi yield bản dup của mảng nếu mảng có kích thước yêu cầu.

Mình thấy đây là thiên tài, vì nó giữ hiệu ứng "cửa sổ trượt" (sliding window) vào đối tượng enumerable, thay vì loay hoay với chỉ số mảng.

Các Phương Thức Thú Vị Khác

Phương thứcMô tả
countĐếm thứ evaluate thành true trong block
group_byNhóm phần tử enumerable theo giá trị trả về block. Trả về hash
partitionChia thành hai nhóm. Trả về mảng hai chiều
any?Trả về true nếu block trả true cho BẤT KỲ phần tử nào
all?Trả về true nếu block trả true cho TẤT CẢ phần tử
none?Ngược lại của all?
cycle(n)Lặp lại TẤT CẢ phần tử n lần, [1,2].cycle(2) cho [1,2,1,2]
findGiống select nhưng trả về phần tử đầu tìm thấy
injectTích lũy kết quả giá trị block trước và truyền vào cái sau. Hữu ích cộng tổng
zipGắn hai đối tượng enumerable, làm việc song song. Hữu ích so sánh và tạo hash
mapBiến đổi mỗi phần tử enumerable và trả về phiên bản mới dạng mảng

Tổng Kết

Như bạn thấy, Enumerable là module đáng để làm chủ, hãy sang tài liệu xem nó làm gì cho bạn!

Đừng quên chia sẻ & đăng ký bản tin ở form dưới nếu thích bài viết. Giúp mình rất nhiều! 🙂