Ruby可枚举重置?
我很难准确地理解一个ruby可枚举文件保持多少状态。 我知道一些python,所以我希望在我从一个可枚举项中获取一个项之后,它就消失了,下一个项将在获取另一个项时返回。 奇怪的是,当我使用Ruby可枚举重置?,ruby,Ruby,我很难准确地理解一个ruby可枚举文件保持多少状态。 我知道一些python,所以我希望在我从一个可枚举项中获取一个项之后,它就消失了,下一个项将在获取另一个项时返回。 奇怪的是,当我使用next时确实会发生这种情况,但当我使用takeoffirst时却不会发生这种情况。 下面是一个例子: a = [1,2,3].to_enum # => #<Enumerator: [1, 2, 3]:each> a.take(2) # => [1, 2] a.next # =>
next
时确实会发生这种情况,但当我使用take
offirst
时却不会发生这种情况。
下面是一个例子:
a = [1,2,3].to_enum
# => #<Enumerator: [1, 2, 3]:each>
a.take(2)
# => [1, 2]
a.next
# => 1
a.next
# => 2
a.take(2)
# => [1, 2]
a.next
# => 3
a.next
# StopIteration: iteration reached an end
# from (irb):58:in `next'
# from (irb):58
# from /usr/bin/irb:12:in `<main>'
a.take(2)
# => [1, 2]
a=[1,2,3]。到_enum
# => #
a、 采取(2)
# => [1, 2]
a、 下一个
# => 1
a、 下一个
# => 2
a、 采取(2)
# => [1, 2]
a、 下一个
# => 3
a、 下一个
#StopIteration:迭代已结束
#from(irb):58:in'next'
#发信人(irb):58
#from/usr/bin/irb:12:in`'
a、 采取(2)
# => [1, 2]
似乎枚举表在下一次调用之间保持状态,但在每次调用之前重置,根据文档,
enumerable#take
返回枚举器的前n个元素,而不是光标的下n个元素。只有来自的方法将在该内部游标上操作;可枚举混合只是枚举方法的集合,这些方法不一定共享游标
如果需要,您可以实现Enumerator#take来实现您期望的功能:
class Enumerator
def take(n = 1)
n.times.map { self.next }
end
end
这可能有点令人困惑,但需要注意的是,Ruby中有类和模块
枚举器
类包括可枚举
(与大多数可枚举对象一样,如数组
,哈希
,等等)
该方法被提供为<代码> Enumerator < /C> >,它确实有一个内部状态。您可以考虑<代码> Enumerator < /> >非常接近于由其他语言公开的<代码> Iterator >代码>。
实例化枚举器时,内部指针指向集合中的第一项2.1.5 :021 > a = [1,2,3].to_enum
=> #<Enumerator: [1, 2, 3]:each>
2.1.5 :022 > a.next
=> 1
2.1.5 :023 > a.next
=> 2
但正如我前面所说,枚举器
类包括枚举器
。这意味着枚举器
的每个实例都公开了设计用于处理集合的枚举器
方法。在这种情况下,枚举器
包装在集合上
是一种泛型可枚举
方法。它旨在从枚举
返回前N个元素。需要注意的是枚举
指的是包含可枚举
的任何泛型类,而不是枚举器
。因此,采用(2)
将返回集合的前两个元素,而不管指针在枚举器
实例中的位置如何
让我给你看一个实际的例子。我可以创建一个自定义类,并实现可枚举的
class Example
include Enumerable
def initialize(array)
@array = array
end
def each(*args, &block)
@array.each(*args, &block)
end
end
我可以混合可枚举
,只要我为每个提供一个实现,我就可以免费获得所有其他方法,包括take
e = Example.new([1, 2, 3])
=> #<Example:0x007fa9529be760 @array=[1, 2, 3]>
e.take(2)
=> [1, 2]
e=Example.new([1,2,3])
=> #
e、 采取(2)
=> [1, 2]
正如所料,take
返回前2个元素。take
忽略我的实现中的任何其他内容,就像在可枚举的
中一样,包括状态或指针。请再次阅读,,,有答案。请注意,+next+不会影响其他非外部枚举方法,除非底层迭代方法it self有副作用,例如IO#each_行。我明白了,我不知道enumerable上的所有内容都只依赖于每个。谢谢。小的后续:那么从enumerable中获取第一项,将其存储在变量中,然后对其余项进行操作的唯一方法是如下所示?val=enum.first;res=enum.drop(1).map{| i | i*2}
否。您可以使用范围为的切片。[1,2,3,4]。to_enum.to_a[1..-1]
仅获取所需项目的部分。
e = Example.new([1, 2, 3])
=> #<Example:0x007fa9529be760 @array=[1, 2, 3]>
e.take(2)
=> [1, 2]