と呼ぶ操作が必要shake_tree
です。基本的なRuby-Fortranのみを使用して再帰アルゴリズムを使用して実装しましたが(「 Fortranコードを任意の言語で記述できます」という古い引用を参照)、はるかに簡潔で慣用的なRubyの方法があると思います。
この操作の通称がわからないので、簡単に説明します。次の例のようなハッシュのハッシュがあります。
{
"-cutoff:" =>
{
:flag => {:set_ie1 => [:useCutoff, true]},
:arg => {:vector_ie1 => :double}
},
"-depth:" =>
{
:flag => {:set_ie2 => [:useInconsistent, true]},
:arg => :double,
:default => 2.0
},
"-maxclust:" =>
{
:flag => {:set_ie3 => [:useCutoff, false]},
:arg => {:vector_ie2 => :index}
},
:fn => "arrayTypeOptions"
}
のようなユニークなシンボルがあり、ツリーの構造内に埋め込まれています:vector_ie1
。:set_ie3
ルートからシンボルを残すまでのパス以外のツリーのすべてのブランチを削除する必要があります。上記の例を考えると:
shake_tree(specs, :vector_ie1)
戻ります:
{
"-cutoff:" =>
{
:flag => {:set_ie1 => [:useCutoff, true]},
:arg => {:vector_ie1 => :double}
}
}
と
shake_tree(specs, :set_ie2)
戻ります:
{
"-depth:" =>
{
:flag => {:set_ie2 => [:useInconsistent, true]},
:arg => :double,
:default => 2.0
}
}
より経験豊富なRubyコーダーは、このタスクにどのようにアプローチしますか?