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

Dãy Ruby:Chúng hoạt động như thế nào?

Phạm vi trong Ruby là gì và nó hoạt động như thế nào?

Dải ô là một đối tượng có giá trị bắt đầu và giá trị kết thúc, chúng giúp bạn tạo chuỗi kéo dài toàn bộ dải ô giữa hai giá trị này.

Bạn có thể đi từ 1 thành 20 hoặc từ "a" thành "z" .

Trong bài viết này, bạn sẽ khám phá :

  • Cách tạo một phạm vi Ruby
  • Cách sử dụng step &include? các phương thức trong Ruby
  • Cách thức hoạt động của các phạm vi

Hãy làm điều này!

Hiểu phạm vi

Xin lưu ý rằng đây là cú pháp của phạm vi Ruby:

 (1..20) 

Dấu ngoặc đơn không cần thiết để xác định Range .

Nhưng nếu bạn muốn gọi các phương thức trong phạm vi của mình, bạn sẽ cần chúng. Nếu không, bạn đang gọi phương thức trên phần tử thứ 2 của dải ô, thay vì chính dải ô đó.

Range class bao gồm Enumerable, vì vậy bạn có được tất cả các phương thức lặp lại mạnh mẽ mà không cần phải chuyển đổi phạm vi thành mảng.

Phương pháp bước Ruby

Range có một số phương pháp hữu ích, chẳng hạn như step phương pháp.

Ví dụ :

 (10..20) .step (2) .to_a # [10, 12, 14, 16, 18, 20] 

Sử dụng phương pháp này, bạn có thể lặp lại phạm vi với gia số n , ở đâu n là đối số được chuyển đến step .

Làm thế nào để tìm ra một số nằm trong một dãy số

Range khác các phương pháp cần lưu ý là:cover? &include? .

Sẽ là sai lầm nếu nghĩ rằng họ làm điều tương tự, bởi vì họ không làm vậy.

include? phương pháp chỉ thực hiện những gì bạn mong đợi, kiểm tra xem có bao gồm bên trong phạm vi hay không. Vì vậy, nó sẽ tương đương với việc mở rộng Range vào một Array và kiểm tra xem có thứ gì trong đó không.

Nhưng cover? thì khác, tất cả những gì nó làm là kiểm tra các giá trị đầu và cuối của dải ô (begin <= obj <= end ), có thể mang lại kết quả không mong đợi.

Ví dụ :

 ('a' .. 'z'). bao gồm? "cc" # false ('a' .. 'z'). cover? "cc" # true 

Bìa cover? ví dụ tương đương với:

 "a" <="cc" &&"cc" <="z" 

Lý do điều này trả về true chuỗi được so sánh từng ký tự . Vì "a" đứng trước "c", các ký tự đứng sau "c" đầu tiên không quan trọng.

Phạm vi được triển khai như thế nào trong Ruby

Phạm vi không giới hạn ở số và chữ cái, bạn có thể sử dụng bất kỳ đối tượng nào miễn là chúng triển khai các phương pháp sau:<=>succ .

Ví dụ:đây là phạm vi DateTime:

 request 'time't1 =DateTime.newt2 =DateTime.new + 30next_30_days =t1..t2 # Ví dụ usenext_30_days.select (&:Friday?). map (&:day) 

Vì vậy, làm thế nào để điều này hoạt động? Hãy xem cách triển khai này:

 def range (a, b) # nếu phần tử đầu tiên lớn hơn # thứ hai thì đây không phải là phạm vi tuần tự trả về [] if a> b out =[] # trước cho đến khi phần tử thứ 2 bằng # là phần tử đầu tiên trong khi a! =b out < 

Tôi đã thêm một số nhận xét để giúp bạn hiểu chuyện gì đang xảy ra.

Ý tưởng là chúng ta tiếp tục gọi phương thức tiếp theo trên đối tượng đầu tiên cho đến khi nó bằng phương thức thứ hai, giả định là cuối cùng chúng sẽ gặp nhau.

Phạm vi lớp tùy chỉnh

Hầu hết thời gian, bạn sẽ sử dụng phạm vi số và ký tự, nhưng vẫn tốt để biết cách bạn có thể sử dụng phạm vi trong một lớp tùy chỉnh.

Ví dụ :

 class LetterMultiplier attr_reader:count bao gồm Khởi tạo def có thể so sánh được (letter, count) @letter =letter @count =count end def succ self.class.new (@letter, @count + 1) end def <=> (other) count <=> other.count endenda =LetterMultiplier.new ('w', 2) b =LetterMultiplier.new ('w', 8) # In mảng với tất cả các mục trong Rangep Array (a..b)  

Chìa khóa ở đây là đảm bảo rằng bạn triển khai <=> &succ đúng phương pháp.

Nếu bạn muốn sử dụng include? phương pháp bạn cần bao gồm Comparable mô-đun, bổ sung các phương thức như == , <> (tất cả đều dựa trên kết quả của <=> phương pháp).

Kết luận

Trong bài viết này, bạn đã biết cách hoạt động của phạm vi trong Ruby để bạn có thể hiểu chúng tốt hơn và triển khai các đối tượng của riêng bạn hỗ trợ hoạt động phạm vi.

Đừng quên đăng ký nhận bản tin bên dưới để không bỏ lỡ những bài viết tiếp theo nhé 🙂