【问题标题】:replacing 'eval' with a better solution用更好的解决方案替换“eval”
【发布时间】:2010-11-12 23:18:29
【问题描述】:

这种方法有效,但效果很慢。我认为问题之一可能是add_by 方法中的“eval”语句。

一些解释:每个Node对象都有三个相关的属性,:x、:y和:neighbors。 :x和:y是表示平面坐标的整数,:neighbors是一个数组,节点存储在@nodes数组中。目标是为@nodes 中的每个节点k 找到在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

我的问题是,如果不为 x 和 y 重复 add_by 例程或使用 eval,您将如何做到这一点?

【问题讨论】:

    标签: ruby eval computational-geometry


    【解决方案1】:

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

    我不确定你的代码到底在做什么,但也许有一些指针:

    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
    

    【讨论】:

    • 我应该提一下,这里不使用 .select 的原因是因为节点的数量非常非常多,而平面距离内的数量很少。所以排序后从索引向上计数是有意义的......那里也应该有一个按 y 排序的。
    • 您提供的代码实际上没有排序。 sort_by 不进行就地排序,而是返回一个排序后的数组。
    • 这是真的,但实现的代码是:nods = @nodes.sort_by{|k| k.send(dim)}
    【解决方案2】:

    我会怎么做呢?我会通过 neo4j gem (source) 使用Neo4J 图形数据库。如果您担心性能,这已针对图形距离计算进行了优化。 API 也很不错。

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

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2014-07-20
      • 2011-11-21
      相关资源
      最近更新 更多