每
Ruby 有許多型別的列舉器,但第一個也是最簡單的列舉器型別是 each
。我們將為 1
和 10
之間的每個數字列印出 even
或 odd
,以顯示 each
的工作原理。
基本上有兩種方法可以通過所謂的 blocks
。block
是傳遞的一段程式碼,它將被呼叫的方法執行。each
方法接受一個 block
,它呼叫它所呼叫的物件集合的每個元素。
將塊傳遞給方法有兩種方法:
方法 1:內聯
(1..10).each { |i| puts i.even? ? 'even' : 'odd' }
這是一種非常壓縮和紅寶石的方法來解決這個問題。讓我們一塊一塊地打破這個。
-
(1..10)
的範圍從1
到10
(含)。如果我們想要它是1
到10
獨家,我們會寫(1...10)
。 -
.each
是一個列舉器,它列舉了它所作用的物件中的each
元素。在這種情況下,它作用於範圍內的each
數。 -
{ |i| puts i.even? ? 'even' : 'odd' }
是each
語句的塊,它本身可以進一步細分。|i|
這意味著範圍中的每個元素都由識別符號i
表示在塊中。puts
是 Ruby 中的一種輸出方法,每次列印後都會自動換行。 (如果我們不想要自動換行,我們可以使用print
)i.even?
檢查i
是否是偶數。我們本來可以用i % 2 == 0
; 但是,最好使用內建方法。? "even" : "odd"
這是 ruby 的三元運算子。三元運算子的構建方式是expression ? a : b
。這是短暫的
if expression a else b end
對於長度超過一行的程式碼,block
應作為 multiline block
傳遞。
方法 2:多行
(1..10).each do |i|
if i.even?
puts 'even'
else
puts 'odd'
end
end
在 multiline block
中,do
取代了開口支架,end
取代了 inline
風格的閉合支架。
Ruby 也支援 reverse_each。它會向後迭代陣列。
@arr = [1,2,3,4]
puts @arr.inspect # output is [1,2,3,4]
print "Reversed array elements["
@arr.reverse_each do |val|
print " #{val} " # output is 4 3 2 1
end
print "]\n"