用更好的解决方案取代'eval'

时间:2010-11-12 13:50:45

标签: ruby eval computational-geometry

此方法有效,但效果非常慢。我认为其中一个问题可能是add_by方法中的'eval'语句。

一些解释:每个节点对象都有三个相关属性,:x:y:neighbors:x:y是表示平面坐标的整数,:neighbors是一个数组,节点存储在@nodes数组中。目标是为k中的每个节点@nodes找到距离d k距离@neighbors的节点,并将它们添加到k数组中 def set_neighbors d def add_by dim, d dict = {} @nodes.each{|k| dict[k] = []} @nodes.each_index do |k| up = k+1 down = k-1 while up < @nodes.length and ((eval '@nodes[k].'+ dim) - (eval '@nodes[up].'+dim)).abs <= d dict[@nodes[k]].push(@nodes[up]) up += 1 end while down >= 0 and ((eval '@nodes[k].'+ dim) - (eval '@nodes[down].'+dim)).abs <= d dict[@nodes[k]].push(@nodes[down]) down -= 1 end end return dict end @nodes.sort_by{|k| k.x} exis = add_by('x', d) whys = add_by('y', d) @nodes.each do |k| neighbors = exis[k]&whys[k] k.neighbors = neighbors.select{|j| planar_distance(j,k) <= d} end end

add_by

我的问题是,如果不重复xy的{​​{1}}例程或使用eval,您将如何做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用@nodes[k].send dim.to_sym来避免使用。

我不确定你的代码究竟在做什么,但也许有一些指示:

def set_neighbors d
  @nodes.each do |node|
    node.neighbors = @nodes.select do |n| 
      (node.x - n.x).abs <= d && 
      (node.x - n.x).abs <= d &&
      planar_distance(n,node) <= d
    end - node
  end
end

答案 1 :(得分:2)

怎么做?我通过neo4j gem(Neo4J)使用source图形数据库。如果您关注性能,则会针对图形距离计算进行优化。 API也非常好。

话虽如此,你真的根本不需要评估。您可以使用send在对象上调用计算出的方法名称。因此,您可以使用@nodes[k].send(dim)@nodes[up].send(dim)等替换上述内容