gpt4 book ai didi

java - CompiledScript 的多个实例

转载 作者:行者123 更新时间:2023-12-02 10:21:53 25 4
gpt4 key购买 nike

我正在通过 ScriptEngine 加载 Scala 脚本,并使用 CompiledScript 来评估该脚本。

我正在使用 Java 接口(interface)将 Scala 脚本映射到 Java 端,如下所示。

Java 接口(interface):

public interface SomeInterface {
void method1();
}

Scala 脚本:

class ScalaImp extends SomeInterface {
override def method1() : Unit = {
//Implementation
}

}

加载SomeInterface类型对象的代码如下。

String extension = path.getFileName().toString();
extension = extension.substring(extension.lastIndexOf(".") > 0 ? extension.lastIndexOf(".") + 1 : 0);
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension(extension);
File file = path.toFile();

if (file.exists() && file.isFile()) {
SomeInterface mappingInterface = null;
SomeInterface mappingInterface2 = null;
try(FileReader fr = new FileReader(file)) {

Compilable compilable = (Compilable)engine;
CompiledScript compiledScript = compilable.compile(fr);

mappingInterface = (SomeInterface)compiledScript.eval();
mappingInterface2 = (SomeInterface)compiledScript.eval(); //This fails. Any alternative for this?

}
catch (FileSystemException e) {
logger.error("Cannot load file");
}

return mappingInterface;
}

我想创建脚本的多个实例。但上面的代码给出了以下错误:在第二次调用 eval() 时 Failed to load '$line6.$eval': $line6.$eval 。我知道我可以使用多个 CompiledScript 实例并分别进行评估。但编译时间太长,超出了程序的性能预期。

我是否可以使用一个 CompiledScript 实例创建同一脚本的多个实例?

最佳答案

不是真的。它通过使用 REPL 来工作,它始终编译以评估 2.12 及更早版本中的代码。

您可能正在尝试:

$ scala
Welcome to Scala 2.12.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_144).
Type in expressions for evaluation. Or try :help.

scala> val s = scala.tools.nsc.interpreter.Scripted()
s: scala.tools.nsc.interpreter.Scripted = scala.tools.nsc.interpreter.Scripted@432f4626

scala> s.eval("class C")
res0: Object = null

scala> val c = s.compile("new C")
c: javax.script.CompiledScript = scala.tools.nsc.interpreter.Scripted$WrappedRequest@13346a64

scala> c.eval()
res1: Object = C@2d093067

scala> c.eval()
res2: Object = C@2693e39c

您可以观察编译工作:

scala> s.intp.settings.Xprint.value_=(List("typer"))

在第二个 eval 中,它重用包装用户代码的类,但它编译一个转发定义的新包装器。看起来有一个错误,它尝试转发值定义和类型;在这种情况下,类定义不起作用。

您可能不打算定义两个不同的类,而是返回同一类的两个实例,如图所示?

关于java - CompiledScript 的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54286358/

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