第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Ruby的迭代器

迭代意味著像循環(huán)一樣多次執(zhí)行一次事情,它一個接一個返回?cái)?shù)組或哈希里面的元素,本章中會為大家介紹 Ruby 都有哪些迭代器。

1. each

Ruby 的每個迭代器都從哈希和數(shù)組中返回每個元素,最常見的是 each 迭代器。

下面是一個數(shù)組的例子。

實(shí)例:

[1, 2, 3, 4, 5].each do |number|
  puts number
end

# ---- 輸出結(jié)果 ----
1
2
3
4
5

解釋:number 參數(shù)代表著每次迭代器循環(huán)的每個元素,一共循環(huán) 5 次,分別輸出 1,2,3,4,5。

上面的場景同樣適用于哈希:

實(shí)例:

{a: 1, b: 2, c: 3}.each do |item|
  puts "======"
  puts item
  puts item.class
  puts "======"
end

# ---- 輸出結(jié)果 ----
======
a
1
Array
======
======
b
2
Array
======
======
c
3
Array
======

解釋:通過上述例子我們可以看到,我們在每次迭代出來的元素是一個Array,第一個元素是每個鍵值對的鍵,第二個元素是每個鍵值對的值。

1.1 each_key 和 each_value

對于哈希,我們還可以只迭代其值或者鍵。這里我們有2個方法,一個是each_key,一個是each_value,它們分別迭代哈希的所有鍵和所有值:

實(shí)例:

{a: '1', b: '2', c: '3', d: '4', e: '5'}.each_key do |key|
  puts "key:#{key}"
end

# ---- 輸出結(jié)果 ----
key:a class: Symbol
key:b class: Symbol
key:c class: Symbol
key:d class: Symbol
key:e class: Symbol

實(shí)例:

{a: '1', b: '2', c: '3', d: '4', e: '5'}.each_value do |value|
  puts "value:#{value} class: #{value.class}"
end

# ---- 輸出結(jié)果 ----
value:1 class: String
value:2 class: String
value:3 class: String
value:4 class: String
value:5 class: String

2. each_with_index

each 的基礎(chǔ)上我們還需要打印出每一個元素對應(yīng)的索引,這樣我們可以使用each_with_index。

下面是一個數(shù)組的例子。

實(shí)例:

[1, 2, 3, 4, 5].each_with_index do |number, index|
  puts "index: #{index} \nnumber:#{number}"
end

# ---- 輸出結(jié)果 ----
index: 0 number:1
index: 1 number:2
index: 2 number:3
index: 3 number:4
index: 4 number:5

解釋:上述代碼我們塊中增加了一個index,它代表著每個元素的索引,從0開始依次加1。

下面是一個哈希的例子:

實(shí)例:

{a: '1', b: '2', c: '3', d: '4', e: '5'}.each_with_index do |value, index|
  puts "value:#{value} class: #{value.class} index: #{index}"
end

# ---- 輸出結(jié)果 ----
value:[:a, "1"] class: Array index: 0
value:[:b, "2"] class: Array index: 1
value:[:c, "3"] class: Array index: 2
value:[:d, "4"] class: Array index: 3
value:[:e, "5"] class: Array index: 4

3. 迭代器的返回值

上面我們講了each,在Ruby中我們類似each的迭代器還有很多,比如:map、collect、inject、reject、select等,用到這些迭代器的時候,我們主要使用它們的返回值。

讓我們以數(shù)組[1,2,3,4,5,6,7,8,9,10]舉例:

3.1 each

each 可以把數(shù)組每個元素作為參數(shù)執(zhí)行操作,但返回值仍是數(shù)組本身。

實(shí)例:

a = [1,2,3,4,5,6,7,8,9,10].each {|e| puts e.to_s + '!'}
puts a.to_s

# ---- 輸出結(jié)果 ----
1!
2!
3!
4!
5!
6!
7!
8!
9!
10!
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

3.2 map

對每個數(shù)組元素執(zhí)行操作,原始數(shù)組未修改,返回值是修改之后的數(shù)組。

實(shí)例:

a = [1,2,3,4,5,6,7,8,9,10].map{|e| e*3 }
puts a.to_s

# ---- 輸出結(jié)果 ----
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]

3.3 collect

collectmap的別名方法,用法同map。

3.4 inject

取一個累加器(sum)并更改它的值為與數(shù)組中的元素一樣多的次數(shù)。返回累加器的最終值。

實(shí)例:

a = [1,2,3,4,5,6,7,8,9,10].inject{|sum,e| sum += e }
puts a

# ---- 輸出結(jié)果 ----
55

3.5 reduce

reduceinject的別名,使用方法一樣,不過更多用于遞減操作。

3.6 select

為每個數(shù)組元素運(yùn)行一個表達(dá)式,如果為true,則將該元素添加到返回的輸出中。在其他語言中,這稱為過濾器。

實(shí)例:

a = [1,2,3,4,5,6,7,8,9,10].select{|el| el%2 == 0 }
puts a.to_s

# ---- 輸出結(jié)果 ----
[2,4,6,8,10]

3.7 find

取得一個表達(dá)式并返回該表達(dá)式返回true的第一個元素:

實(shí)例:

a = [1,2,3,4,5,6,7,8,9,10].find{|el| el / 2 == 2 }
puts a.to_s

# ---- 輸出結(jié)果 ----
4

3.8 detect

find的別名,用法和它相同。

3.9 reject

select的相反方法:為每個數(shù)組元素運(yùn)行一個表達(dá)式,如果表達(dá)式為false,則在輸出中包含該元素。

實(shí)例:

a = [1,2,3,4,5,6,7,8,9,10].reject{|e| e==2 || e==8 }
puts a.to_s

# ---- 輸出結(jié)果 ----
[1, 3, 4, 5, 6, 7, 9, 10]

4. 次數(shù)迭代器

有的時候我們需要進(jìn)行固定迭代次數(shù)的操作,這個時候我們通常有3種方式,使用范圍(Range)、使用times方法,使用upto或者downto方法。

4.1 范圍迭代

使用范圍來固定迭代次數(shù):

實(shí)例:

(1..5).each do |i|   
   puts i   
end   

# ---- 輸出結(jié)果 ----
1
2
3
4
5

解釋:因?yàn)?1..5 代表的是從 1~5 的所有數(shù)字,所以可以遍歷 5 次。

在進(jìn)行范圍迭代的時候,我們可以使用step來選擇每次迭代的步長。

實(shí)例:

(0..50).step(5) do |n|
  puts n
end

# ---- 輸出結(jié)果 ----
0
5
10
15
20
25
30
35
40
45
50

解釋:我們正常使用范圍迭代的時候,都是每次遞增1的,而使用step,我們可以選擇每次迭代一次遞增5個。

4.2 times 迭代

times我們在英文中翻譯成次數(shù),Ruby的Integer有一個很通俗易懂的實(shí)例方法名字就叫times,可以讓我們循環(huán)固定次數(shù)。

實(shí)例:

5.times.each do |i|
  puts i
end

# ---- 輸出結(jié)果 ----
0
1
2
3
4

解釋:這里 5 調(diào)用了它的times方法,它可以簡單理解成為創(chuàng)建了一個從 0~4 的數(shù)組。

實(shí)例:

5.times.to_a

# ---- 輸出結(jié)果 ----
[0, 1, 2, 3, 4]

4.3 upto 和 downto 迭代

這兩個同樣也是 Integer 類的實(shí)例方法。

實(shí)例:

1.upto(5) do |n|   
  puts n   
end  

# ---- 輸出結(jié)果 ----
1
2
3
4
5

解釋:通俗的解釋,從1一直迭代到5,和[1, 2, 3, 4 ,5]數(shù)組同理。

實(shí)例:

1.upto(5).to_a

# ---- 輸出結(jié)果 ----
[1, 2, 3, 4, 5]

上述是一種遞增迭代的形式,另外一種是遞減的形式。

實(shí)例:

5.downto(1) do |n|
  puts n
end

# ---- 輸出結(jié)果 ----
5
4
3
2
1

**解釋:**會從5一直迭代到1,和 [5, 4, 3, 2, 1] 同理。

實(shí)例:

5.upto(1).to_a

# ---- 輸出結(jié)果 ----
[5, 4, 3, 2, 1]

5. 小結(jié)

本小節(jié)中,我們了解了迭代類似于循環(huán),學(xué)習(xí)了each迭代器,each_with_index迭代器,了解了各種迭代器的返回值,以及三種固定次數(shù)的迭代器:范圍迭代、times迭代,uptodownto迭代。