迭代数组中的元素,除了前两个,但也使用“each_slice”

时间:2017-01-03 22:29:29

标签: arrays ruby

好吧,我有一个像这样的数组:

array = ["month", "value", "january", "30%", "february", "40%"] # etc etc ...

我正在打印成对的值,我的意思是:

array.each_slice(2) do |m, v|
    puts "#{m}, #{v}"
end

Outputs:
month, value
january, 30%
february, 40%

很好,但我不想要那些输出:"month, value"(前两个)

我试过这样做:(找到here

class Array
  def each_after(n)
    each_with_index do |elem, i|
      yield elem if i >= n # Warning : it doesn't work without a block
    end
  end
end

array.each_slice(2).each_after(2) do |m, v|
    puts "#{m}, #{v}"
end

并输出此错误:

<main>: undefined method each_after for ...

我认为问题出在"each_after"方法上,只有在没有"each_slice"的情况下使用它。

我的问题:

如何修改"each_after"方法以使用"each_slice"方法?

1 个答案:

答案 0 :(得分:4)

您的代码

each_slice会返回Enumerable,但您为Array定义了方法。只需为Enumerable定义:

module Enumerable
  def each_after(n)
    each_with_index do |elem, i|
      yield elem if i >= n
    end
  end
end

然后您可以使用

array.each_slice(2).each_after(1) do |m, v|
    puts "#{m}, #{v}"
end

请注意,您需要删除1个元素(2个元素的数组)。

在不更改方法的情况下,您也可以在Array方法之前使用to_a

array.each_slice(2).to_a.each_after(1) do |m, v|
    puts "#{m}, #{v}"
end

替代

drop之前使用each_slice

["month", "value", "january", "30%", "february", "40%"].drop(2).each_slice(2).to_a
#=> [["january", "30%"], ["february", "40%"]]