-2

我需要一个我称之为的操作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​​ 编码员将如何处理这项任务?

4

1 回答 1

1

这是我的递归实现。我决定调用它是shake_tree为了让RubyMine的拼写检查器开心(并且因为我喜欢 的声音shake_tree specs key):

def shake_tree(specs, key)
  parent = find_parent(specs, key)
  parent ? { parent => specs[parent] } : nil
end

def find_parent(specs, key, keypath = [])
  specs.each do |k, v|
    if k == key
      return (keypath + [k])[0]
    elsif v.is_a?(Hash)
      branch = find_parent(v, key, keypath + [k])
      if !branch.nil?
        return branch
      end
    end
  end
  nil
end

这将完全返回上面指定的输出。

我仍然很想知道这是否有一个通用名称。

于 2013-04-26T02:28:20.607 回答