gpt4 book ai didi

ruby - Ruby 中 Kernel::eval 的风险和注意事项?

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:32 26 4
gpt4 key购买 nike

我正在使用 Ruby 1.9.2 p180。

我正在为 Rubyvis(成为 SciRuby 的一部分)编写持续评估工具。基本上,您在输入文件(例如,test.rb)中设置了 Rubyvis::Panel,并且此 SciRuby 类 (Plotter) 监视 test.rb 进行修改。当发生变化时,SciRuby 通过 eval 运行脚本。

如果我从命令行运行该脚本,它会工作,但是当通过 eval 执行时,绘图是错误的——一条直线,好像所有数据都消失了,而不是 what you see here注意:以前,这里说 SVG 不同——但事实证明这是加载 REXML 而不是 nokogiri 的结果。

Here are the test scripts and eval code. 大多数生成直线(下面的编辑部分中描述的异常(exception)情况)。

我一点也不知道这是怎么回事。

对于为什么它可能会发生,我有一些想法,但对于机制没有任何线索。

假设:

  1. eval 不允许进行深拷贝。从 eval 中获取的对象在某些上下文中缺失部分,尤其是当使用 lambda 将数据处理为绘图的正确格式时。
  2. 出于某种原因,调用 require 时,eval 不支持捆绑的 dep 列表——也许我的绑定(bind)中使用了错误版本的 nokogiri?<
  3. 一些其他必需的库(也许是 RSVG?)已经重载了 Rubyvis 使用的一些方法。

有没有人见过这样的事情?我有点摸不着头脑——完全不知道从哪里开始进行故障排除。

编辑 2011 年 9 月 15 日:新信息

似乎是对 OpenStruct.new 的调用导致了问题。

如果我将数据定义为列表的列表,data = pv.range(0,10,0.1).map { |d| [d,Math.sin(d)+2+rand()] },效果不错。

但是当数据被定义为 OpenStructs 列表时,下面的代码会给出错误的输出:

data = pv.range(0, 10, 0.1).map {|x|
o = OpenStruct.new({:x=> x, :y=> Math.sin(x) + 2+rand()})
STDERR.puts o.inspect # Output is correct.
o
}
STDERR.puts "size of data: #{data.size}"
STDERR.puts "first x = #{data.first.x}" # Output is first x = 0.0
STDERR.puts "first y = #{data.first.y}" # Output is first y = (WRONG)

如果我在分配数据时使用 collect,我什至会引发错误,例如,

vis.add(pv.Line).data(data.collect { |d| [d.x,d.y] }

plotter.rb:88:in `block in <main>': undefined method `x' for [0.0, nil]:Array (NoMethodError)

相对于 vis.add(pv.Line).data(data) 没有错误。该错误似乎源于在我的应用程序源代码中调用 eval("vis.render()", bind)(而不是在绘图脚本中)。

事实证明,如果我只使用散列,例如 {:x => x, :y => Math.sin(x)},效果很好。但是当我明确地说 Hash.new({:x => x, :y => Math.sin(x)}) 时,不管我如何调用 vis.data 都会出错:

rubyvis/lib/rubyvis/internals.rb:184:in `each': comparison of Hash with Hash failed (ArgumentError)

所以区别在于我的数据是如何分配的。问题是:为什么?

输入的副本在 original gist 中可用。感谢您的帮助。

最佳答案

It turns out that if I just use a hash, e.g., {:x => x, :y => Math.sin(x)}, that works fine. But when I explicitly say Hash.new({:x => x, :y => Math.sin(x)}), that gives an error regardless of how I call vis.data:

首先,您对 Hash.new 的调用是错误的。 Hash.new 采用一个参数,该参数是散列的默认值。

关于ruby - Ruby 中 Kernel::eval 的风险和注意事项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423585/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com