Ruby 为什么“Enumerable”有“first”而没有“last”?
Ruby 为什么“Enumerable”有“first”而没有“last”?,ruby,enumerable,Ruby,Enumerable,可枚举具有第一个: (3..5).to_enum.first # => 3 (3..5).to_enum.last # => NoMethodError: undefined method `last' for #<Enumerator: 3..5:each> 但它没有last: (3..5).to_enum.first # => 3 (3..5).to_enum.last # => NoMethodError: undefined method `la
可枚举
具有第一个
:
(3..5).to_enum.first
# => 3
(3..5).to_enum.last
# => NoMethodError: undefined method `last' for #<Enumerator: 3..5:each>
但它没有last
:
(3..5).to_enum.first
# => 3
(3..5).to_enum.last
# => NoMethodError: undefined method `last' for #<Enumerator: 3..5:each>
(3..5).到最后一个枚举
#=>NoMethodError:未定义的方法“last”#
这是为什么?我能想到的唯一原因是可枚举的可能是无限的流
infinity = Float::INFINITY
range = 1..infinity
range.to_enum.first
# => 1
range.to_a.last # will never finish
这是因为并非所有可枚举对象都具有最后一个元素 最简单的例子是:
[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]
即使枚举数元素是有限的,也没有简单的方法来获取最后一个元素,只需将其迭代到底,这将是非常低效的。因为并非所有可枚举的
都有最后一个元素,这可能是因为可枚举的不包含任何元素
考虑以下可枚举的:
a = Enumerator.new do |yielder|
while true
yielder << 1
end
end
a=Enumerator.new do | yielder|
虽然是真的
Yield我不同意并非所有可枚举的都有最后一个元素的观点。我认为很少有枚举器
方法在对方法进行响应时无法结束循环
。这就是为什么Enumerable
肯定知道第一个元素,但不能确定它的最后一个元素
Enumerator#each
each_enum = (0..1).each
#=> #<Enumerator: 0..1:each>
each_enum.to_a
#=> [0, 1]
枚举器#每个
每个枚举=(0..1)。每个
#=> #
每个枚举到
#=> [0, 1]
鉴于
Enumerator#cycle
cycle_enum = (0..1).cycle
#=> #<Enumerator: 0..1:cycle>
cycle_enum.to_a
枚举器#循环
循环枚举=(0..1)。循环
#=> #
循环_enum.to _a
不断将next
元素推入数组,导致无限循环
查看此代码和此代码的执行情况,以观察我想说的内容。您必须完全枚举和反转,也许他们希望开销更明显(例如,人们想知道为什么第一个这么快,而理论上的最后一个似乎需要一段时间)@bhaidEnumerable
没有last
either@VictorMoroz这个问题指的是内核#to_enum
,它生成一个枚举数
,而不是一个可枚举数
。@bhaid问题模棱两可,但第一行说的是可枚举数
。我不认为这是原因,因为Float::INFINITY
可以显示为起始元素,在这种情况下,first
将引发错误,而不是未定义:(Float::INFINITY..5)。to_enum=>
。但是(Float::INFINITY..5).对于_enum.first#=>类型错误:无法从Float迭代@sawa,这是我用来说明我的观点的范围的问题,而不是无限流的概念。没有解释为什么可枚举的定义例如map
或max
,不能与[1]一起工作。循环。为什么last
是特殊的?@VictorMoroz-它是特殊的,因为它在大多数情况下都能工作,但它效率低下,在某些情况下可能会破坏枚举数(例如遍历IO对象)。ruby的创建者似乎考虑过添加这个方法,但认为它会被广泛误用。最简单的例子实际上是循环
。这似乎不是一个很好的理由。无限元素打破了许多流行的可枚举
方法,如#to#u a
、#min
、#all?
、和#reduce
“我不同意并非所有可枚举项都有最后一个元素的观点”-那么,在这种情况下,循环
的最后一个元素是什么?