方法关闭似乎在 ruby​​racer 中不起作用

Posted

技术标签:

【中文标题】方法关闭似乎在 ruby​​racer 中不起作用【英文标题】:Method closure not seeming to work in therubyracer 【发布时间】:2013-05-26 16:35:58 【问题描述】:

一旦我将一个方法存储在 V8::Context 中,该方法的所有后续实例都以任何名称存储在任何上下文中,其行为与初始实例一样(即,就好像再次存储了原始实例一样)。

我尝试通过以下方式隔离/证明问题:

require 'V8'

class TestClass
  def test_method
    self.inspect
  end
end

(1..2).each do |cxt_i|
  cxt = V8::Context.new
  [:test_method, :test_method2].each_with_index do |method_name, method_i|
    method = TestClass.new.method(:test_method)
    cxt[method_name.to_s] = method
    script = method_name.to_s+'()'
    puts "Context #cxt_i, method #method_i+1 result is #method.call, V8 returns #cxt.eval(script)"
  end
end

产生以下输出:

Context 1, method 1 result is #<TestClass:0x007fce2419cdb0>, V8 returns #<TestClass:0x007fce2419cdb0>
Context 1, method 2 result is #<TestClass:0x007fce2419b780>, V8 returns #<TestClass:0x007fce2419cdb0>
Context 2, method 1 result is #<TestClass:0x007fce2419abc8>, V8 returns #<TestClass:0x007fce2419cdb0>
Context 2, method 2 result is #<TestClass:0x007fce24199a98>, V8 returns #<TestClass:0x007fce2419cdb0>

【问题讨论】:

我不明白,我的“V8 返回”在上下文 1 和 2 中不同(但在上下文中相同)。 @mu 太短:我不明白你的评论。如果你的意思是你得到的结果与我不同,你能分享你的代码和输出吗? 与您的代码相同。我得到 V8 返回值,如 AABB,而你的值类似于 AAAA。仍然不完全符合您的预期,但更接近。 @mu 太短:感谢您的回复。介意分享您的版本信息吗?我的是:libv8(3.11.8.17 x86_64-darwin-12),ruby 1.9.3p194(2012-04-20 修订版 35410)[x86_64-darwin12.0.0](抱歉无法在此评论中缩进。) 我刚刚再次尝试使用 Ruby 2.0.0 和 libv8-3.11.8.17,得到了与您相同的结果。我做的第一个是 1.9.2 和 libv8-3.3.10.4。啊,升级的乐趣。 【参考方案1】:

这是一个弱参考问题。通过在内部循环中插入GC.start,我们强制 V8 上下文中的弱引用被垃圾回收。不过会大大减慢速度。

require 'v8'

class TestClass
  def test_method
    self.inspect
  end
end

(1..2).each do |cxt_i|
  cxt = V8::Context.new
  [:test_method, :test_method2].each_with_index do |method_name, method_i|
    method = TestClass.new.method(:test_method)
    cxt[method_name.to_s] = method
    script = method_name.to_s+'()'
    puts "Context #cxt_i, method #method_i+1 result is #method.call, V8 returns #cxt.eval(script)"
    GC.start # <<<<=========
  end
end

输出:

Context 1, method 1 result is #<TestClass:0x007f8f13a26cd8>, V8 returns #<TestClass:0x007f8f13a26cd8>
Context 1, method 2 result is #<TestClass:0x007f8f135cca48>, V8 returns #<TestClass:0x007f8f135cca48>
Context 2, method 1 result is #<TestClass:0x007f8f135ceac8>, V8 returns #<TestClass:0x007f8f135ceac8>
Context 2, method 2 result is #<TestClass:0x007f8f135cdbf0>, V8 returns #<TestClass:0x007f8f135cdbf0>

ruby -v 是ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-linux],libv8 是3.11.8.17 x86_64-linux

【讨论】:

谢谢,马蒂。不知道如何处理这些信息,但我很欣赏调查工作。我将奖励你赏金,因为我可以随时转移它,以防出现更好的情况。这是我的第一个赏金奖,我的理解是我“使用它或失去它”。 ;-) 刚刚在元数据上就赏金奖励进行了长时间的交流。事实证明,一旦分配赏金,我就无法移动赏金,但在 7 天结束后有 24 小时的宽限期。鉴于此,我将暂时不发放悬赏,但会确保我在宽限期内处理它,假设在那之前它没有真正解决。 如果出现更好的答案/解决方法,我们都会受益。 GitHub 上的这个问题 (#260) 刚刚作为 github.com/cowboyd/therubyracer/issues/176 的副本关闭,假设这确实是 WeakRef 问题。建议升级到 2.0 糟糕,刚刚发现你们在 2.0 上复制了它。在 github 上对此效果发表了评论。

以上是关于方法关闭似乎在 ruby​​racer 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 to_proc 在 Ruby 改进中不起作用?

尺寸检查器的自动调整大小掩码中的支柱和弹簧似乎在 iOS5 模拟器中不起作用 [关闭]

MeteorJs“loginWIthPassword”似乎在方法中不起作用

页面在 Firefox 和 IE 中不起作用 [关闭]

cron作业中的Rails类方法在弹性beantalk中不起作用

Ruby Racer,RuntimeError - SyntaxError:意外缩进