在 ruby 中编写带有突变的迭代代码时,我经常发现自己遵循以下模式:
def build_x some_data
x = [] # or x = {}
some_data.each do |data|
x.some_in_place_update! (... data ...)
end
x
end
(x
通常与 不具有相同的形状some_data
,因此简单的map
行不通。)
有没有更惯用或更好的方法来编写遵循这种模式的代码?
[编辑] 一个真实的例子:
def to_hierarchy stuff
h = {}
stuff.each do |thing|
path = thing.uri.split("/").drop(4)
sub_h = h
path.each do |segment|
sub_h[segment] ||= {}
sub_h = sub_h[segment]
end
sub_h.merge!(
data: thing.data,
)
end
h
end
这从 s 的平面列表开始thing
,这些 s 具有相关但不同uri
的 s。它将这个平面列表转换为层次结构,将thing
共享相同segment
s 的相关 s 分组uri
。这遵循我描述的模式:初始化h
,循环一些数据并h
沿途变异,然后h
在最后吐出。
[edit2] 另一个相关示例
def count_data obj
i = if obj[:data] then 1 else 0
obj.each do |k, v|
i += count_statements v unless :data == k
end
i
end