Ruby 中的迭代器。
Ruby 中最常用的迭代器。
迭代器是与代码块(使用 do 和 end 创建)关联的方法,它会多次执行语句,就像一个循环一样。在 Ruby 中,迭代器经常被用来代替 while 和 for 循环。
语法:
object.iterator do # block tied to iterator statements end
如果代码块中只有一条语句,那么也可以将上述语法写成
object.iterator { statement }
这里,代码块使用花括号 {} 括起来,迭代器方法和代码块必须在同一行。因此,你不能这样做
object.iterator # ERROR { statement }
Ruby 带有许多内置迭代器,在本课中我们将重点介绍内置迭代器,稍后我们将学习如何创建自己的迭代器方法。
times 迭代器
times 允许你执行代码块内的语句一定次数。以下是如何使用 times 迭代器。
创建一个名为 p_20_1.rb 的新文件,并添加以下代码。
#p_20_1.rb =begin Program to demonstrate times iterator. This code will generate 10 random numbers =end 10.times do puts rand(10) end
预期输出
C:learn ruby>ruby p_20_1.rb 2 1 3 9 2 4 6 2 1 7 C:learn ruby>
如果代码块中只有一条语句,那么你可以将语句放在与迭代器方法相同的行。
#p_20_2.rb =begin Program to demonstrate times iterator. This code will generate 10 random numbers =end 10.times { puts rand(10) }
预期输出
C:learn ruby>ruby p_20_2.rb 6 7 2 6 2 1 5 9 6 0 C:learn ruby>
通常,迭代器在每次迭代中返回值,我们需要在管道符 (| ) 内写上变量名,作为代码块内的第一项。让我们访问这个值
#p_20_3.rb =begin times iterator returns a number from 0 to 1 less than total iteration made by the iterator =end 10.times { |i| puts i }
预期输出
C:\learn ruby>ruby p_20_3.rb 0 1 2 3 4 5 6 7 8 9 C:\learn ruby>
upto 迭代器
upto 迭代器:它从 x 到 y 递增,其中 y 必须大于 x。
#p_20_4.rb =begin upto iterator returns a number between x and y. It starts with x and ends at y. In the first iteration it returns 1. And in the last iteration it returns 10 =end 1.upto(10) { |i| puts i }
预期输出
C:\learn ruby>ruby p_20_4.rb 1 2 3 4 5 6 7 8 9 10 C:\learn ruby>
downto 迭代器
downto 迭代器:它从 x 到 y 递减,其中 x 必须大于 y。
#p_20_5.rb =begin downto iterator returns a number between x and y. It starts with x and ends at y. In the first iteration it returns 10. And in the last iteration it returns 11 =end 10.downto(1) { |i| puts i }
预期输出
C:\learn ruby>ruby p_20_5.rb 10 9 8 7 6 5 4 3 2 1 C:\learn ruby>
step 迭代器
step 迭代器允许你指定起始位置、结束位置和步长。它仅适用于数组和范围。step 迭代器与数组一起使用时,接受两个参数:上限和步长。与范围一起使用时,它仅接受一个参数:步长。
#p_20_6.rb =begin This program prints uses step iterator to print only even numbers =end puts "step iterator with array" 10.step(20, 2) { |i| puts i } puts "step iterator with range" (10..20).step(2) { |i| puts i }
预期输出
C:\learn ruby>ruby p_20_6.rb step iterator with array 10 12 14 16 18 20 step iterator with range 10 12 14 16 18 20 C:\learn ruby>
遍历集合
each 迭代器是用于遍历数组、范围和哈希元素的常用迭代器。
创建一个名为 p_20_7.rb 的新文件,并添加以下代码。
#p_20_7.rb =begin This program uses each iterator to access elements of an array, range and hash =end arr = [11,44,66,99] puts "Iterating through array" arr.each { |i| puts i } ########### r = 40..50 puts "\nIterating through range" r.each { |i| puts i } ############## h = { 'key1'=> 'val1', 'key2'=> 'val2', 'key3'=> 'val3', } puts "\nIterating through hash" # hash consist of two values key and value, so we will need two variables inside the block h.each { |k, v| puts "#{k} : #{v}" }
预期输出
C:\learn ruby>ruby p_20_7.rb 11 44 66 99 C:\learn ruby>
map 迭代器
map 迭代器遍历数组、范围或哈希的元素,并在过程中基于代码块返回的值创建一个新的数组。
创建一个名为 p_20_8.rb 的新文件,并添加以下代码。
#p_20_8.rb =begin This program uses map iterator to create a new array from the elements of array, range and hash =end # map iterator with array arr = [65,89,21,98] new_arr = arr.map { |i| i * 2 } puts "old array " + arr.inspect puts "new array " + new_arr.inspect puts ################ # map iterator with range r = 20..30 new_r = r.map { |i| i * 3 } puts "range " + r.inspect puts "array created from range " + new_r.inspect puts ################ # map iterator with hash h = { 'key1'=> 'val1', 'key2'=> 'val2', 'key3'=> 'val3', } new_h = h.map { |k, v| "#{k} : #{v}" } puts "hash " + r.inspect puts "array created from hash " + new_h.inspect
预期输出
C:\learn ruby>ruby p_20_8.rb old array [65, 89, 21, 98] new array [130, 178, 42, 196] range 20..30 array created from range [60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90] hash 20..30 array created from hash ["key1 : val1", "key2 : val2", "key3 : val3"] C:\learn ruby>
如果你想永久更改原始数组,请使用 map!(记住,名称以感叹号 (!) 结尾的方法会永久更改所应用的对象)。
each_pair 迭代器
我们已经了解到 each 迭代器可以与哈希一起使用,但 Ruby 提供了一种更有效的方法来使用 each_pair 迭代器遍历哈希。
#p_20_9.rb =begin This program uses each_pair iterator to access elements of a hash =end h = { 'key1'=> 'val1', 'key2'=> 'val2', 'key3'=> 'val3', } h.each_pair { |k, v| puts "#{k} : #{v}" }
预期输出
C:\learn ruby>ruby p_20_9.rb key1 : val1 key2 : val2 key3 : val3 C:\learn ruby>
select 迭代器
select 迭代器返回代码块返回 true 的值的数组。它可以与数组、范围和哈希一起使用
#p_20_10.rb =begin This program demonstrate the use of select iterator =end arr = [34, 98, 56, 100, 89, 37, 11, 52] new_arr = arr.select { |i| i % 2 == 0 } puts new_arr.inspect
预期输出
C:\learn ruby>ruby p_20_10.rb [34, 98, 56, 100, 52] C:\learn ruby>
count 迭代器
count 迭代器用于计算代码块返回 true 的元素数量。它可以与数组、范围和哈希一起使用
#p_20_11.rb =begin This program demonstrate the use of count iterator =end arr = [34, 98, 56, 100, 89, 37, 11, 52] n = arr.count { |i| i % 2 == 0 } puts n
预期输出
C:\learn ruby>ruby p_20_11.rb 5 C:\learn ruby>
delete_if 迭代器
delete_if 迭代器删除数组中代码块返回 true 的元素。
#p_20_12.rb =begin Following program demonstrate use of delete_if iterator. =end arr = [34, 98, 56, 100, 89, 37, 11, 52] arr.delete_if { |i| i % 2 == 0 } puts arr.inspect
预期输出
C:\learn ruby>ruby p_20_11.rb [89, 37, 11] C:\learn ruby>