2016-04-29 197 views
0

最近,我做了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()。clearVal的UE(),

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"); 
     } 
    } 

我可以看到,在variableTable變量值是空時I> 2,但輸出仍然是,

2.0 4.0 4.0 4.0 4.0 

我可以具有JEP或variableTable一個很大的誤解,有誰能請幫忙給一些解釋嗎?謝謝。

+1

將'crearValues()'更改爲'clear()'。 – saka1029

+0

@ saka1029也不起作用 – morven

回答

1

是的,這看起來像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()); 

我會在下一個版本中修復評估程序。