如何动态决定向哪个哈希添加值?

时间:2011-06-16 18:06:21

标签: ruby

我有一个在“完成”的各个阶段都有哈希的课程。这是为了优化,以便我不必继续使用我已经知道的根数据重新创建哈希值。例如,这是一个名为@root的计数器,它将作为起点。

{3=>4, 4=>1, 10=>3, 12=>5, 17=>1}

并创建了@root,它使用了键+键+键+键+键的迭代次数。但现在我将[x,y]的所有组合添加到计数器并单独评估。所以我可以这样做:

a = (1..52)
a.combination{|x,y|
  evaluate(x,y)
}

但我不愿意这样做:

a.each{|x| 
  evaluate(x, "foo")
  a.each {|y| evaluate(y, "bar")}
}

我有一个像这样的方法来跟踪每个状态的哈希值:

def evaluate index, hsh
    case hsh
    when "root"
        @root.key?(index) ? @root[index] += 1 : @root[index] = 1
    when "foo"
        @foo = @root.clone
        @foo.key?(index) ? @foo[index] += 1 : @foo[index] = 1
    when "bar"
        @bar = @foo.clone
        @bar.key?(index) ? @bar[index] += 1 : @bar[index] = 1
    end
end

但这种方法有很多重复。有没有办法可以在不使用eval的情况下动态执行此操作?

1 个答案:

答案 0 :(得分:1)

您可以直接将hsh对象作为参数传递给方法hash,而不是将evaluate用作字符串描述符?例如。而不是你写的evaluate(x, "foo")

@foo = @root.clone
evaluate(x, @foo)

另请注意,代码中的@root.clone会在循环内多次覆盖该字段。

此外,如果您为哈希使用默认初始值设定项,则会在代码中保存一些逻辑。例如。代码行

h = Hash.new{0}
...
h[index] += 1
如果为index设置了non,则

会将默认值设置为零。因此,您无需在evaluate方法中处理特殊情况。