Enumerable有first:
(3..5).to_enum.first
# => 3
Run Code Online (Sandbox Code Playgroud)
但它没有last:
(3..5).to_enum.last
# => NoMethodError: undefined method `last' for #<Enumerator: 3..5:each>
Run Code Online (Sandbox Code Playgroud)
这是为什么?
Bro*_*tse 13
这是因为并非所有可枚举对象都具有最后一个元素.
最简单的例子是:
[1, 2, 3].cycle
# (an example of what cycle does)
[1,2,3].cycle.first(9) #=> [1, 2, 3, 1, 2, 3, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
即使枚举器元素是有限的,也没有简单的方法来获取最后一个元素而不是迭代它到最后,这将是非常低效的.
因为并非所有Enumerable元素都具有最后一个元素,这可能会也可能不会,因为它不Enumerable包含任何元素.
请考虑以下事项Enumerable:
a = Enumerator.new do |yielder|
while true
yielder << 1
end
end
Run Code Online (Sandbox Code Playgroud)
这是无限的Enumerable.
Enumerable是一种迭代元素序列的机制.对于某些迭代过程,这可能只执行一次.为了获得最后一个元素(如果实际存在一个元素),它必须评估整个迭代过程并获得最后一个元素.之后,Enumerable无效.