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"