最近,我在singularsys 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()方法在变量中设置有效值标志。确实,评估者应该在返回值之前测试此标志。 (请参见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());
我将在下一个版本中修复评估程序。