好吧,我有一个像这样的数组:
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"
方法?
答案 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%"]]