Iterators (Vòng lặp) là một khái niệm quan trọng trong lập trình, cho phép bạn thực hiện một tác vụ lặp đi lặp lại trên một tập hợp các phần tử. Trong Ruby, có nhiều loại iterators khác nhau, mỗi loại được sử dụng cho một mục đích cụ thể. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về các iterators phổ biến trong Ruby, bao gồm each
, collect
(hay map
), select
, reject
, reduce
, và inject
.
Ruby each Iterator
Phương thức each
là iterator cơ bản nhất trong Ruby, cho phép bạn lặp qua từng phần tử của một đối tượng dữ liệu có thể lặp (như mảng, hash, range, hoặc chuỗi). Nó thực hiện một khối lệnh cho mỗi phần tử trong đối tượng đó.
ruby
# Lặp qua một mảng
fruits = ["apple", "banana", "orange"]
fruits.each { |fruit| puts fruit }
# Output:
# apple
# banana
# orange
# Lặp qua một hash
person = { name: "Alice", age: 30, city: "New York" }
person.each { |key, value| puts "#{key}: #{value}" }
# Output:
# name: Alice
# age: 30
# city: New York
Ruby collect Iterator (hay map)
Phương thức collect
(hay map
) cũng lặp qua từng phần tử của một đối tượng dữ liệu có thể lặp, nhưng nó tạo ra một mảng mới chứa các kết quả của khối lệnh được áp dụng cho mỗi phần tử.
ruby
# Tạo một mảng mới với các phần tử nhân đôi
numbers = [1, 2, 3, 4, 5]
doubled_numbers = numbers.collect { |num| num * 2 }
puts doubled_numbers.inspect
# Output: [2, 4, 6, 8, 10]
# Tạo một mảng mới với các phần tử chuyển thành chữ hoa
names = ["alice", "bob", "charlie"]
capitalized_names = names.map { |name| name.capitalize }
puts capitalized_names.inspect
# Output: ["Alice", "Bob", "Charlie"]
Ruby select Iterator
Phương thức select
lặp qua từng phần tử của một đối tượng dữ liệu có thể lặp và tạo ra một mảng mới chứa các phần tử thỏa mãn một điều kiện nhất định.
ruby
# Tạo một mảng mới chứa các số chẵn
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = numbers.select { |num| num.even? }
puts even_numbers.inspect
# Output: [2, 4, 6, 8, 10]
# Tạo một mảng mới chứa các chuỗi có độ dài lớn hơn 5
words = ["hello", "world", "ruby", "programming", "language"]
long_words = words.select { |word| word.length > 5 }
puts long_words.inspect
# Output: ["programming", "language"]
Ruby reject Iterator
Phương thức reject
ngược lại với select
, nó tạo ra một mảng mới chứa các phần tử không thỏa mãn một điều kiện nhất định.
ruby
# Tạo một mảng mới chứa các số lẻ
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
odd_numbers = numbers.reject { |num| num.even? }
puts odd_numbers.inspect
# Output: [1, 3, 5, 7, 9]
# Tạo một mảng mới chứa các chuỗi có độ dài nhỏ hơn hoặc bằng 5
words = ["hello", "world", "ruby", "programming", "language"]
short_words = words.reject { |word| word.length > 5 }
puts short_words.inspect
# Output: ["hello", "world", "ruby"]
Ruby reduce Iterator (hay inject)
Phương thức reduce
(hay inject
) lặp qua từng phần tử của một đối tượng dữ liệu có thể lặp và áp dụng một phép toán lên các phần tử đó để thu về một giá trị duy nhất.
ruby
# Tính tổng của các phần tử trong một mảng
numbers = [1, 2, 3, 4, 5]
sum = numbers.reduce(0) { |sum, num| sum + num }
puts sum
# Output: 15
# Tính tích của các phần tử trong một mảng
numbers = [1, 2, 3, 4, 5]
product = numbers.reduce(1) { |product, num| product * num }
puts product
# Output: 120
# Nối các phần tử trong một mảng thành một chuỗi
words = ["hello", "world", "ruby"]
sentence = words.reduce("") { |sentence, word| sentence + " " + word }
puts sentence.strip
# Output: hello world ruby
Các Iterator khác
Ngoài các iterator phổ biến trên, Ruby còn cung cấp một số iterator khác như each_with_index
, each_with_object
, partition
, group_by
, flat_map
, và cycle
. Mỗi iterator này có mục đích sử dụng riêng và cung cấp các tính năng khác nhau để xử lý dữ liệu một cách hiệu quả.
Kết luận
Iterators là một công cụ mạnh mẽ trong Ruby, cho phép bạn thực hiện các tác vụ lặp đi lặp lại trên các đối tượng dữ liệu một cách dễ dàng và hiệu quả. Bằng cách sử dụng các iterator như each
, collect
, select
, reject
, reduce
, và inject
, bạn có thể viết mã Ruby ngắn gọn, dễ đọc và dễ bảo trì hơn. Hãy tiếp tục khám phá và thực hành với các iterator trong Ruby để trở thành một lập trình viên giỏi hơn.