Computer >> Máy Tính >  >> Lập trình >> Ruby

Hướng dẫn cơ bản về mô-đun có thể đếm được của Ruby (+ phương pháp yêu thích của tôi)

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.

Hướng dẫn cơ bản về mô-đun có thể đếm được của Ruby (+ phương pháp yêu thích của tôi)

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! 🙂