我正在 Nashorn 中尝试多线程脚本加载和评估,并得到了令人震惊的行为:
// having some object o loaded in another thread
print(o.constructor === o.constructor); // false
print(o.constructor === Object); // false as well
print(o.foo === o.foo); // true - OK
这怎么可能在单个脚本引擎中实现呢?o
上面只是使用对象文字符号(在另一个线程中)创建的对象。印刷o.constructor
给平常function Object() { [native code] };
.
同时:
print({}.constructor === {}.constructor); // true
有任何想法吗?
Update
事实证明这与多线程根本无关。详情请参阅下面我的回答。
事实证明这与多线程根本无关。这是一个简单的 Scala 程序,可以重现该问题:
object Test extends App {
val engine = new ScriptEngineManager().getEngineByName("nashorn")
var o = engine.eval("({ foo: 'bar' })")
var result = engine.eval("(o.constructor === o.constructor)", new SimpleBindings() {
put("o", o)
})
print(result) // false
}
我正在使用bindings
参数错误。相反,我应该采取现有的bindings
并就地更新它们。我仍然不相信这会导致o.constructor === o.constructor
虽然是假的,但至少现在有效。更正版本:
object Test extends App {
val engine = new ScriptEngineManager().getEngineByName("nashorn")
var o = engine.eval("({ foo: 'bar' })")
val bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE)
bindings.put("o", o)
var result = engine.eval("(o.constructor === o.constructor)", bindings)
print(result) // true
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)