65.9K
CodeProject 正在变化。 阅读更多。
Home

Ruby 中的迭代器。

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2016年3月4日

CPOL

2分钟阅读

viewsIcon

11220

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>

本文最初发表于 http://ruby.codeindepth.com/iterators-in-ruby/

© . All rights reserved.