Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么“Enumerable”有“first”而没有“last”?_Ruby_Enumerable - Fatal编程技术网

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
元素推入数组,导致无限循环


查看此代码和此代码的执行情况,以观察我想说的内容。

您必须完全枚举和反转,也许他们希望开销更明显(例如,人们想知道为什么第一个这么快,而理论上的最后一个似乎需要一段时间)@bhaid
Enumerable
没有
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
“我不同意并非所有可枚举项都有最后一个元素的观点”-那么,在这种情况下,
循环
的最后一个元素是什么?