Cách sử dụng Ranges trong Ruby
Trong bài này chúng ta sẽ tìm hiểu kiểu dữ liệu Ranges trong Ruby, đây là cách giúp bạn tạo ra một phạm vi của một dãy giá trị trong Ruby.
Ví dụ bạn cần tạo ra một dãy từ 1 đến 100 thì có thể sử dụng Ranges. Hoặc bạn muốn tạo dãy các ký tự từ A - Z thì cũng có thể sử dụng Ranges. Chi tiết thế nào thì chugns ta cùng tìm hiểu nhé.
1. Ranges là gì ?
Khi làm việc với ngôn ngữ Ruby, bạn sẽ được tiếp xúc với kiểu dữ liệu khá đặc biệt đó là Ranges. Range dịch ra có nghĩa là phạm vi, chức năng của nó cũng sẽ nôm na ngữ nghĩa của nó đó là kiểu dữ liệu này sẽ bao gồm một số giá trị nằm trong một phạm vi nhất định.
Nếu chưa rõ các bạn có thể hiểu đơn giản như: 0 đến 9, tháng 1 đến tháng 12... thì được gọi là Ranges.
Bài viết này được đăng tại [free tuts .net]
Để định nghĩa một Range chúng ta khai báo trong dấu ().
(1..10) # hoặc (1...10)
Như các bạn để ý ở trên mình có 2 ví dụ có một chút khác biệt đó là một cái bên trong chứa 2 dấu chấm và một cái bên trong 3 dấu chấm.
Nếu bên trong là 2 dấu chấm nghĩa là giá trị của Range đó sẽ bao gồm từ số 1 đến số 10 chứa cả số 10.
Nếu bên trong là 3 dấu chấm nghĩa là giá trị của Range đó sẽ bao gồm từ số 1 đến số 10 nhưng không chứa cả số 10.
Để xem được giá trị của một Range cách đơn giản nhất các bạn hãy chuyển kiểu dữ liệu này về kiểu Array bằng phương thức to_a.
(1..5).to_a #=> [1, 2, 3, 4, 5] ('a'..'e').to_a #=> ["a", "b", "c", "d", "e"] ('a'...'e').to_a #=> ["a", "b", "c", "d"]
Tất nhiên là những thứ chúng ta cho vào Range thì nó phải có 1 trật tự nhất đinh nhé các cậu, như là thứ tự số hay là chữ.
irb(main):014:0> ("baa".."bat").to_a => ["baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bak", "bal", "bam", "ban", "bao", "bap", "baq", "bar", "bas", "bat"]
Nhìn qua các ví dụ chúng ta cũng hiểu và hình dung được cách mà Range lưu trữ dữ liệu rồi, và có thể nói về một ví dụ đơn giản mà dễ dàng nhất với vòng lặp để các bạn có thể thấy được sự đơn giản nhanh gọn mà Ruby mang lại cho chúng ta.
Nếu mà trong C++ cú pháp vòng lặp từ 1 đến 10
for(int i = 1; i <= 10; i++) { // code }
Nhưng trong Ruby chỉ cần đơn giản hơn rất nhiều với Range
(1..10).each { // code }
Một đối tượng range thuộc class Range
irb(main):030:0> (1..2).class => Range irb(main):031:0> ('a'..'d').class => Range
2. Phương thức Step
Range có một method để làm vòng lặp nhanh hơn bất cứ cái nào đó chính là step phương thức
Nếu chúng ta đang muốn tạo một Range mà mỗi giá trị trong Range đó tăng lên 1 giá trị là n thì step chính là phương thức mà các bạn đang tìm kiếm.
((1..10).step(2)).to_a => [1, 3, 5, 7, 9] ((1..12).step(2)).to_a => [1, 3, 5, 7, 9, 11] ((1..12).step(3)).to_a => [1, 4, 7, 10]
Từng giá trị trong Range tăng lên theo như tham số chúng ta truyền vào
step chỉ làm việc với số dương, nếu bạn bạn truyền vào số âm kết quả sẽ trả về là một khoảng giá trị rỗng
Chúng ta có thể truyền cả số thực vào step
((1..12).step(1.1)).to_a => [1.0, 2.1, 3.2, 4.300000000000001, 5.4, 6.5, 7.6000000000000005, 8.700000000000001, 9.8, 10.9, 12.0]
3. Một vài phương thức phổ biến khi làm việc với Range
include(): Phương thức này đùng dể kiểm tra xem một giá trị có tồn tại ở trong Range hay không, nếu tìm thấy sẽ trả về true còn ngược lại trả về false
(1..10).include? 2 => true (1..10).include? 11 => false
Lưu ý nhỏ là hàm này có phân biệt cả hoa thường
('a'..'d').include? 'a' => true ('a'..'d').include? 'A' => false
min(): Phương thức này dùng để lấy giá trị nhỏ nhất trong một Range
(1..10).min() => 1 (-11..10).min() => -11
max(): Giống với min() nhưng với max() sẽ lấy giá trị lớn nhất trong Range
(-11..10).max() => 10 (-11..10).max => 10
first(): Lấy giá trị đầu tiên của một Range
(1..10).first => 1
last(): Lấy giá trị cuối cùng của một Range
(1..10).last => 10 // Đặc biệt với dấu 3 chấm kết quả vẫn là 10 (1...10).last => 10
Ngoài ra chúng ta có thể thêm tham số vào hàm này nếu như muốn lấy bao nhiêu giá trị cuối cùng bằng cách thêm số lượng muốn lấy truyền vào trong hàm last(). Nếu truyền tham số vào kết quả sẽ trả về chuẩn hơn là không truyền tham số.
(1..10).last(3) => [8, 9, 10] (1...10).last(3) => [7, 8, 9]
size(): Lấy độ dài của Range
(1..10).size => 10 (1...10).size => 9
4. Kết luận
Trong bài này mình đã giới thiệu thêm cho các bạn một kiểu dữ liệu mới trong Ruby đó chính là Range. Mình cùng đã giới thiệu với các bạn các phương thức khá phổ biến khi làm việc với Range, các bạn hãy cố gắng nắm kĩ để khi làm việc thực tế tránh những nhầm lẫn không đáng có. Kiểu dữ liệu này cũng tương đối dễ nên chỉ cần đọc qua bài này các bạn cũng đã hình dung được Range là gì và chức năng của nó làm gì.