代码之家  ›  专栏  ›  技术社区  ›  Dmitry Dmitriev

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

  •  2
  • Dmitry Dmitriev  · 技术社区  · 7 年前

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

    arr = [1,2,3,4,5]
    arr.partition.with_index{|_,index| index>2} 
    

    在遍历枚举时如何形式化逻辑,给出2个数组的输出。 当我们叫单身 partition with_index 这种结构对我来说很“神奇”。

    非常感谢。

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

    4 回复  |  直到 7 年前
        1
  •  1
  •   mikej heading_to_tahiti    7 年前

    你可能已经在Ruby文档中阅读了 partition :

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

    > arr = [1,2,3,4,5]
    => [1, 2, 3, 4, 5]
    > arr.partition
    => #<Enumerator: ...>
    

    您将在中的许多方法的描述中看到相同的内容 Enumerable 但是返回的枚举器没有太多细节。

    枚举器链接的关键在于 each 中的方法 Enumerator 这已经回来了。例如 枚举器 返回人 隔断 有一个 每个 方法的行为类似 隔断 . 这就是你如何通过一个街区并获得 隔断 with_index . 如果您分两步来做,可能会有所帮助:

    > 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]]
    

    另一种思考方式是 隔断 没有障碍就像传球 :partition enum_for 例如

    > another_enum = arr.enum_for(:partition)
    => #<Enumerator: ...>
    > another_enum.with_index { |_, index| index > 2 } # same result as above
    => [[4, 5], [1, 2, 3]]
    
        2
  •  1
  •   Safi Nettah    7 年前

    当索引大于;2 ruby使用其余值创建一个新数组

        3
  •  1
  •   Mikhail Katrin    7 年前

    隔断

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

    arr = [1,2,3,4,5]
    arr.partition.with_index{|_,index| index>2} 
    => [[4, 5], [1, 2, 3]]
    

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

    第二个数组将包含所有其他元素: [1,2,3]

        4
  •  0
  •   Daniel Viglione    6 年前

    您正在合并可枚举模块和枚举器类。模块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之间插入每个方法来使用方法枚举器with#index。或者,它可以在可枚举模块方法上调用with_index,因为这会返回枚举器实例:

    arr = [1,2,3,4,5]
    arr.partition.with_index{|_,index| index>2} 
    

    在上例中,分区是可枚举模块的实例方法,with_index是枚举器类的实例方法。分区返回一个枚举器实例,该实例可以采用with_索引。

    现在,为了理解该语句的作用,您可以简单地查看可枚举文档,其中解释了分区的作用:

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

    所以在你的例子中,它决定了指数是否大于2。如果是,则将其放入一个数组,否则放入另一个数组。