Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.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可枚举重置?_Ruby - Fatal编程技术网

Ruby可枚举重置?

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 # =>

我很难准确地理解一个ruby可枚举文件保持多少状态。 我知道一些python,所以我希望在我从一个可枚举项中获取一个项之后,它就消失了,下一个项将在获取另一个项时返回。 奇怪的是,当我使用
next
时确实会发生这种情况,但当我使用
take
of
first
时却不会发生这种情况。 下面是一个例子:

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]