我有一个在“完成”的各个阶段都有哈希的课程。这是为了优化,以便我不必继续使用我已经知道的根数据重新创建哈希值。例如,这是一个名为@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的情况下动态执行此操作?
答案 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
方法中处理特殊情况。