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

Tạo điều tra viên Ruby một cách nhanh chóng

Khi bạn coi bộ sưu tập của mình như một điều tra viên, bạn có thể sử dụng tất cả các chức năng yêu thích của mình như #map và #reduce mà không cần phải viết thêm bất kỳ mã nào. Nó khá tuyệt vời.

Ngày xưa, việc xác định điều tra viên hơi rườm rà. Bạn phải tạo một lớp mới, bao gồm mô-đun Enumerable và xác định một hàm #each.

Tuy nhiên, kể từ Ruby 1.9, chúng ta đã có một cách nhẹ nhàng hơn nhiều để xác định các điều tra viên một cách nhanh chóng. Hãy cùng xem.

Giới thiệu lớp Enumerator

Lớp Enumerator cho phép bạn xác định một điều tra viên một lần, bằng cách sử dụng cú pháp khối. Trong ví dụ dưới đây, chúng tôi tạo một điều tra viên trả về một chuỗi số ngẫu nhiên vô hạn.

e = Enumerator.new do |y|
  loop do
    y << rand(10) # The << operator "yields" a value.
  end
end

# Make the enumerator "yield" 10 values, then stop
puts e.first(10).inspect # => [6, 6, 7, 2, 2, 9, 6, 8, 2, 1]

Bạn có thể nhận thấy rằng chúng tôi đang sử dụng toán tử shift << theo một cách lạ. Đây là một phím tắt cho y.yield phương pháp. Bạn sẽ gọi nó cho từng mục trong bảng điều tra. Nếu tất cả điều này có vẻ hơi kỳ diệu đối với bạn, đừng lo lắng. Đó là.

Kích thước bộ sưu tập

Việc tìm ra kích thước của một bộ sưu tập đặt ra một vấn đề cho những người điều tra lười biếng của Ruby. Để đếm các mục trong một bộ sưu tập, bạn phải tải toàn bộ bộ sưu tập - điều này chống lại toàn bộ quan điểm của việc sử dụng bộ liệt kê lười biếng.

Có một công việc xung quanh, loại. Nếu bạn tình cờ biết kích thước của tập hợp tại thời điểm tạo Điều tra viên, bạn có thể cung cấp.

# You can pass the length as an argument to the constructor, if you have it
e = Enumerator.new(10) do |y|
  10.times { y << rand }
end

Ví dụ trong thế giới thực của tôi

Mới hôm qua tôi đã làm việc trên trang web tài liệu mới của Honeybadger. Nó được xây dựng bằng Jekyll và tôi đang viết một plugin để tạo mục lục dựa trên <h2><h3> trong tài liệu.

Thật khó hiểu khi tìm ra <h3> nào thẻ thuộc về một phần được xác định bởi <h2> các thẻ. Bạn phải phân tích cú pháp HTML bằng nokogiri, sau đó quét tài liệu kết quả. Vì vậy, tôi đã tóm tắt đoạn mã đó ra và biến nó thành một Enumerator. Đây là những gì nó trông như thế nào.

def subheadings(el)
  Enumerator.new do |y|
    next_el = el.next_sibling
    while next_el && next_el.name != "h2"
      if next_el.name == "h3"
        y << next_el
      end
      next_el = next_el.next_sibling
    end
  end
end