Enumerable là gì?
Enumerable là tập hợp các phương pháp lặp , một mô-đun Ruby, và một phần quan trọng trong số đó làm cho Ruby trở thành một ngôn ngữ lập trình tuyệt vời.
Enumerable bao gồm các phương pháp hữu ích như :
-
map
-
select
-
inject
Nhiều phương thức hoạt động bằng cách tạo cho chúng một khối.
Trong khối đó, bạn cho họ biết bạn muốn làm gì với mọi phần tử.
Ví dụ :
[1,2,3].map { |n| n * 2 }
Cung cấp cho bạn một mảng mới trong đó mọi số đều được nhân đôi.
Chính xác những gì sẽ xảy ra phụ thuộc vào phương pháp bạn sử dụng, map
giúp bạn chuyển đổi tất cả các giá trị, select
cho phép bạn lọc danh sách &inject
có thể được sử dụng để cộng tất cả các giá trị bên trong một mảng.
Có hơn 20 phương thức Ruby Enumerable.
Hãy nghiên cứu một cách chi tiết.
Phương pháp Each_Cons
Yêu thích mới của tôi Enumerable
phương thức là each_cons
!
Đây là lý do tại sao :
Phương pháp này thực sự hữu ích, bạn có thể sử dụng nó để tìm n-gram hoặc để kiểm tra xem một dãy số có liền nhau khi kết hợp với all?
, một Enumerable
khác phương pháp.
each_cons
cung cấp cho bạn các mảng con có kích thước n
, vì vậy nếu bạn có [1,2,3]
, rồi đến each_cons(2)
sẽ cung cấp cho bạn [[1,2], [2,3]]
.
Hãy xem một ví dụ :
numbers = [3,5,4,2] numbers.sort.each_cons(2).all? { |x,y| x == y - 1 }
Mã này bắt đầu bằng cách sắp xếp các số, sau đó gọi each_cons(2)
, trả về một Enumerator
và sau đó nó gọi all?
để kiểm tra xem tất cả các phần tử có khớp với điều kiện hay không.
Đây là một ví dụ khác, nơi tôi sử dụng each_cons
để kiểm tra xem một ký tự có được bao quanh bởi cùng một ký tự hay không, như sau:xyx
.
str = 'abcxyx' str.chars.each_cons(3).any? { |a,b,c| a == c }
Còn nữa!
Nếu bạn muốn biết mẫu này xảy ra bao nhiêu lần, thay vì nhận true
/ false
kết quả là bạn chỉ có thể thay đổi any?
thành count
.
Điều tôi thấy thú vị hơn nữa là việc triển khai each_cons
phương pháp.
array = [] each do |element| array << element array.shift if array.size > n yield array.dup if array.size == n end
Lưu ý :Điều này đến từ việc triển khai
Enumerable
của Rubinius . Bạn có thể tìm thấy mã nguồn ban đầu tại đây.
Việc triển khai bắt đầu với một mảng Ruby trống, sau đó nó lặp lại qua các phần tử bằng cách sử dụng each
.
Tất cả mọi thứ là khá tiêu chuẩn cho đến khi ở đây. Nhưng sau đó nó thêm phần tử vào mảng và nó cắt mảng (sử dụng Array # shift) nếu kích thước lớn hơn những gì chúng ta muốn.
Kích thước là đối số của each_cons
.
Sau đó, nó tạo ra một dup
của mảng nếu mảng có kích thước được yêu cầu.
Tôi nghĩ đây là một thiên tài, bởi vì nó giữ một loại hiệu ứng ‘cửa sổ trượt’ vào đối tượng có thể liệt kê của chúng ta, thay vì phải lộn xộn với các chỉ mục mảng.
Các phương pháp hấp dẫn khác
Phương pháp | Mô tả |
---|---|
số lượng | Chính xác những gì tên nói, đếm những thứ được đánh giá là đúng bên trong một khối |
group_by | Nhóm các phần tử có thể liệt kê bằng giá trị trả về của khối. Trả về một băm |
phân vùng | Phân chia thành hai nhóm. Trả về mảng hai chiều |
bất kỳ? | Trả về true nếu khối trả về true đối với BẤT KỲ yếu tố nào mang lại cho nó |
tất cả? | Trả về true nếu khối trả về true cho TẤT CẢ các yếu tố mang lại cho nó |
không có? | Đối lập với all? |
cycle (n) | Lặp lại TẤT CẢ các phần tử n lần, vì vậy nếu bạn thực hiện [1,2].cycle(2) bạn sẽ có [1,2,1,2] |
tìm | Thích select , nhưng nó trả về thứ đầu tiên nó tìm thấy |
tiêm | Tích lũy kết quả của giá trị khối trước và chuyển nó vào giá trị tiếp theo. Hữu ích để cộng tổng số |
zip | Dán hai đối tượng có thể liệt kê lại với nhau, vì vậy bạn có thể làm việc với chúng song song. Hữu ích cho việc so sánh các phần tử và tạo hàm băm |
bản đồ | Biến đổi mọi phần tử của đối tượng có thể liệt kê và trả về phiên bản mới dưới dạng một mảng |
Kết thúc
Như bạn đã thấy, Enumerable
là một mô-đun đáng để làm chủ, vì vậy hãy xem qua tài liệu và xem nó có thể giúp gì cho bạn!
Đừng quên chia sẻ và đăng ký nhận bản tin của tôi ở biểu mẫu bên dưới nếu bạn thích bài viết này. Nó sẽ giúp tôi rất nhiều! 🙂