Ruby 有許多型別的列舉器,但第一個也是最簡單的列舉器型別是 each。我們將為 110 之間的每個數字列印出 evenodd,以顯示 each 的工作原理。

基本上有兩種方法可以通過所謂的 blocksblock 是傳遞的一段程式碼,它將被呼叫的方法執行。each 方法接受一個 block,它呼叫它所呼叫的物件集合的每個元素。

將塊傳遞給方法有兩種方法:

方法 1:內聯

(1..10).each { |i| puts i.even? ? 'even' : 'odd' }

這是一種非常壓縮和紅寶石的方法來解決這個問題。讓我們一塊一塊地打破這個。

  1. (1..10) 的範圍從 110(含)。如果我們想要它是 110 獨家,我們會寫 (1...10)

  2. .each 是一個列舉器,它列舉了它所作用的物件中的 each 元素。在這種情況下,它作用於範圍內的 each 數。

  3. { |i| puts i.even? ? 'even' : 'odd' }each 語句的塊,它本身可以進一步細分。

    1. |i|這意味著範圍中的每個元素都由識別符號 i 表示在塊中。
    2. puts 是 Ruby 中的一種輸出方法,每次列印後都會自動換行。 (如果我們不想要自動換行,我們可以使用 print
    3. i.even? 檢查 i 是否是偶數。我們本來可以用 i % 2 == 0; 但是,最好使用內建方法。
    4. ? "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"