最近,我对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中有很大的误解,有人可以帮忙解释一下吗?感谢。
答案 0 :(得分:1)
是的,这看起来像是Jep系统中的一个错误。 clearValues()方法在Variable中设置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());
我将在下一个版本中修复评估者。