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
thing
これは、関連しているが異なる を持っている のフラットなリストから始まりますuri
。このフラット リストを階層に変換しthing
、 の同じ を共有する関連する をグループ化segment
しuri
ます。これは私が説明したパターンに従います: initialize 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