提交 129b3bdc 编写于 作者: J Jeremy Kemper

Clarify Array#in_groups_of implementation, don't dup unless needed, only require enumerator once.


git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8161 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
上级 bff21727
require 'enumerator'
module ActiveSupport #:nodoc:
module CoreExtensions #:nodoc:
module Array #:nodoc:
......@@ -21,14 +23,23 @@ module Grouping
# ["1", "2"]
# ["3"]
def in_groups_of(number, fill_with = nil, &block)
require 'enumerator'
collection = dup
collection << fill_with until collection.size.modulo(number).zero? unless fill_with == false
grouped_collection = [] unless block_given?
collection.each_slice(number) do |group|
block_given? ? yield(group) : grouped_collection << group
if fill_with == false
collection = self
else
# size % number gives how many extra we have;
# subtracting from number gives how many to add;
# modulo number ensures we don't add group of just fill.
padding = (number - size % number) % number
collection = dup.concat([fill_with] * padding)
end
if block_given?
collection.each_slice(number, &block)
else
returning [] do |groups|
collection.each_slice(number) { |group| groups << group }
end
end
grouped_collection unless block_given?
end
# Divide the array into one or more subarrays based on a delimiting +value+
......@@ -40,12 +51,14 @@ def in_groups_of(number, fill_with = nil, &block)
# (1..10).to_a.split { |i| i % 3 == 0 } # => [[1, 2], [4, 5], [7, 8], [10]]
def split(value = nil, &block)
block ||= Proc.new { |e| e == value }
inject([[]]) do |results, element|
if block.call(element)
results << []
else
results.last << element
end
results
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册