【发布时间】:2013-04-26 01:26:27
【问题描述】:
我需要一个我称之为shake_tree 的操作。我已经使用递归算法实现了它,只使用基本的 ruby-Fortran (引用旧报价“你可以用 any 语言编写 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 编码员将如何处理这项任务?
【问题讨论】:
-
为什么不使用像RubyTree 这样的树形库?它有一个
parentage方法可以为您提供这个。 -
@MarkThomas:感谢您的链接,但乍一看,它看起来有点矫枉过正。 ruby DSL 的整个想法是让 ruby 完成大部分工作……现在我的 DSL 的“解析器”包括在“源”上调用
vMATCodeMonkey#instance_eval“ 细绳! :-)
标签: ruby recursion hashmap recursive-datastructures