为什么`Enumerable`有'first`而不是`last`?

saw*_*awa 12 ruby enumerable

Enumerablefirst:

(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)

即使枚举器元素是有限的,也没有简单的方法来获取最后一个元素而不是迭代它到最后,这将是非常低效的.

  • 似乎不是一个很好的理由。无限元素破坏了许多流行的“Enumable”方法,例如“#to_a”、“#min”、“#all?”和“#reduce”。 (3认同)
  • 不解释为什么`Enumerable`定义例如`map`或`max`,也不适用于`[1] .cycle`.为什么`last`很特别? (2认同)

Ari*_*iao 6

因为并非所有Enumerable元素都具有最后一个元素,这可能会也可能不会,因为它不Enumerable包含任何元素.

请考虑以下事项Enumerable:

a = Enumerator.new do |yielder|
  while true
    yielder << 1
  end
end
Run Code Online (Sandbox Code Playgroud)

这是无限的Enumerable.

Enumerable是一种迭代元素序列的机制.对于某些迭代过程,这可能只执行一次.为了获得最后一个元素(如果实际存在一个元素),它必须评估整个迭代过程并获得最后一个元素.之后,Enumerable无效.