gpt4 book ai didi

java - singlesys Jep 中的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 09:59:27 26 4
gpt4 key购买 nike

最近,我对 singlesys Jep 做了一些测试,我有以下代码片段,

    Jep jep = new Jep();
jep.parse("x*2");

for (int i = 1; i <= 5; i++) {
if (i <= 2) {
jep.addVariable("x", i);
}
try {
System.out.println(jep.evaluate());
} catch (Exception ex) {
System.out.println("N/A");
}
}

我期望的是,

2.0  4.0  N/A  N/A  N/A

虽然真实的结果是,

2.0  4.0  4.0  4.0  4.0

然后我意识到 jep 保留了上次使用的变量值,因此我更新代码以调用 jep.getVariableTable().clearValues(),

    Jep jep = new Jep();
jep.parse("x*2");

for (int i = 1; i <= 5; i++) {
jep.getVariableTable().clearValues();
if (i <= 2) {
jep.addVariable("x", i);
}
try {
System.out.println(jep.evaluate());
} catch (Exception ex) {
System.out.println("N/A");
}
}

当i>2时我可以看到variableTable中的变量值为null,但输出仍然是,

2.0  4.0  4.0  4.0  4.0

我对Jep或variableTable可能有很大的误解,有人可以帮忙解释一下吗?谢谢。

最佳答案

是的,这看起来像是 Jep 系统中的一个错误。 clearValues() 方法在变量中设置 validValue 标志。实际上,评估者应该在返回值之前测试此标志。 (参见Variable API)

解决方法是使用

for(Variable var:jep.getVariableTable().getVariables()) {
var.setValue(null);
}

更好的解决方案是重写 FastEvaluator

static class MyEvaluator extends FastEvaluator {
private static final long serialVersionUID = 1L;

@Override
public Object visit(ASTVarNode node, Object data) throws EvaluationException {
Variable var = node.getVar();
if(!var.hasValidValue())
throw new EvaluationException("Value not set");
return super.visit(node, data);
}
}

然后可以在 Jep 构造函数中使用它

Jep jep = new Jep(new MyEvaluator());

我将在下一个版本中修复评估器。

关于java - singlesys Jep 中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928755/

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