每
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"