Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays 具有分区和索引的两个Ruby分割数组_Arrays_Ruby_Enumerable_Enumerator - Fatal编程技术网

Arrays 具有分区和索引的两个Ruby分割数组

Arrays 具有分区和索引的两个Ruby分割数组,arrays,ruby,enumerable,enumerator,Arrays,Ruby,Enumerable,Enumerator,你能解释一下这种结构的ruby行为的逻辑或算法吗: arr = [1,2,3,4,5] arr.partition.with_index{|_,index| index>2} 如何在遍历可枚举数组时形式化逻辑,并给出2个数组的输出。 当我们只调用单个分区它的clear-just方法行为时,但是当它通过和_index跟踪时,这种构造对我来说变得“神奇” 多谢各位 UPD:条件不在分区的块中,它在单独的“可枚举”对象方法块中。此方法是带有索引的这第二层次的互动对我来说很有趣。为什么带有索引

你能解释一下这种结构的ruby行为的逻辑或算法吗:

arr = [1,2,3,4,5]
arr.partition.with_index{|_,index| index>2} 
如何在遍历可枚举数组时形式化逻辑,并给出2个数组的输出。 当我们只调用单个
分区
它的clear-just方法行为时,但是当它通过
和_index
跟踪时,这种构造对我来说变得“神奇”

多谢各位


UPD:条件不在
分区的块中,它在单独的“可枚举”对象方法块中。此方法是带有索引的
这第二层次的互动对我来说很有趣。为什么带有索引的
条件对分区结果有影响这是
分区
文档中不清楚的行为。

当索引为>2时,使用剩余的值创建一个新数组

分区

返回两个数组,第一个数组包含块计算为true的enum元素,第二个数组包含其余元素。 如果没有给出块,则返回枚举数

第一个数组将包含
[4,5]
,因为它满足条件
索引>2


第二个数组将包含所有其他元素:
[1,2,3]
您可能已经在Ruby文档中阅读了
分区的

如果没有给出块,则返回枚举数

考虑它的另一种方式是,没有给定块的
partition
就像将
:partition
传递给例如

(:分区)的另一个枚举=arr.enum => # >另一个_enum.with_index{| |,index | index>2}的结果与上面相同 => [[4, 5], [1, 2, 3]]
您正在合并可枚举模块和枚举器类。模块Enumerable中的所有方法都是实例方法,要求其接收方是枚举器(类枚举器的实例)

在自定义类中使用“include Enumerable”,并实现返回枚举数的each方法:

def each
  return enum_for(:each) unless block_given?

  @apples.each { |apple| yield apple }
end
当Enumerable中包含的方法在包含Enumerable的类的实例上执行时,Ruby会在实例和Enumerable方法之间隐式插入每个方法

with_索引不是可枚举模块的方法。它是枚举器类的实例方法。现在记得我说过,当您在自定义类中包含可枚举模块并实现each方法时,每个方法都可以用来返回枚举器实例。因此,具有每个返回枚举数的方法的类可以通过(显式地)在类的实例和具有#索引之间插入每个方法来使用方法枚举数#with#index。或者,它可以使用可枚举模块方法上的_索引进行调用,因为该方法返回枚举器实例:

arr = [1,2,3,4,5]
arr.partition.with_index{|_,index| index>2} 
在上面的示例中,分区是可枚举模块的实例方法,with_index是枚举器类的实例方法。分区返回一个枚举数实例,该实例可以与_索引一起使用

现在,为了理解此语句的作用,您只需查看可枚举文档,其中解释了分区的作用:

返回两个数组,第一个数组包含块计算为true的enum元素,第二个数组包含其余元素


因此,在您的例子中,它正在确定索引是否大于2。如果是,它会被放入一个数组,否则会放入另一个数组。

这里有什么神奇之处?返回两个数组,第一个数组包含块的元素,计算结果为true,第二个数组包含其余的元素(from)。Alex Golubenko如果您告诉我关于单个分区的情况,我会问关于分区之间和与_index的通信的问题。条件不在分区块中,而是在单独的方法块中。此方法为“带索引”。第二层次的互动对我来说很有趣。为什么“With_指数”的条件对划分结果有影响?这是分区文档中不清楚的行为。Great@DmitryDmitriev-很高兴它帮助了“模块可枚举中的所有方法都是实例方法,要求它们的接收者是枚举器”不。Enumerable只要求包含类实现一个
#each
实例方法……并且
#each
可以在没有给出块的情况下返回一个枚举数,但这不是严格要求的。@mwp如果不返回枚举数,您可以引用一个实例吗?考虑一下模块Enumerable中的那些方法是做什么的。例如:reduce调用each方法,并希望每个方法都允许它枚举值,以便构建累加。如果每个方法都不是一个枚举器,那么像reduce这样的方法怎么能完成它们的工作呢?
> enumerator = arr.partition
=> #<Enumerator: ...>
> enumerator.each { |n| n < 3 } # just to demonstrate `each` performing a partition
=> [[1, 2], [3, 4, 5]]
> enumerator.with_index { |_, index| index > 2 }
=> [[4, 5], [1, 2, 3]]
> another_enum = arr.enum_for(:partition)
=> #<Enumerator: ...>
> another_enum.with_index { |_, index| index > 2 } # same result as above
=> [[4, 5], [1, 2, 3]]
def each
  return enum_for(:each) unless block_given?

  @apples.each { |apple| yield apple }
end
arr = [1,2,3,4,5]
arr.partition.with_index{|_,index| index>2}