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