gpt4 book ai didi

java - arity.jar 算术库如何计算字符串操作?

转载 作者:太空宇宙 更新时间:2023-11-04 06:43:58 25 4
gpt4 key购买 nike

大家好,我最近遇到了 Arity 库 -> source can be found here并发现它使用 .eval() 方法将字符串评估为算术运算,查看源代码我发现了 Symbols 对象的此方法:

/**
Evaluates a simple expression (such as "1+1") and returns its value.
@throws SyntaxException in these cases:
<ul>
<li> the expression is not well-formed
<li> the expression is a definition (such as "a=1+1")
<li> the expression is an implicit function (such as "x+1")
</ul>
*/
public synchronized double eval(String expression) throws SyntaxException {
return compiler.compileSimple(this, expression).eval();
}

该方法调用Compiler编译对象的.compileSimple:

Function compileSimple(Symbols symbols, String expression) throws SyntaxException {
rpn.setConsumer(simpleCodeGen.setSymbols(symbols));
lexer.scan(expression, rpn);
return simpleCodeGen.getFun();
}

它返回一个 Function 对象,然后调用该对象的 eval() 方法。查看 Function.eval() 方法,我看到了这个:

/**
Evaluates an arity-0 function (a function with no arguments).
@return the value of the function
*/
public double eval() {
throw new ArityException(0);
}

方法 eval 必须返回 double 类型,并且实现会抛出 ArityException,其实现如下:

public class ArityException extends RuntimeException {
public ArityException(String mes) {
super(mes);
}

public ArityException(int nArgs) {
this("Didn't expect " + nArgs + " arguments");
}
}

但是当抛出 ArityException 时,它会调用 RuntimeException 的 super() 构造函数,这是一个异常,并且没有应有的 double 返回,也许我弄乱了一些段落,但我不明白 Function.eval() 实现中最后一个 throw new ArityException of 0 。

那么它到底是如何运作的呢?

最佳答案

您错过了 simpleCodeGen 的声明:

private final SimpleCodeGen simpleCodeGen = new SimpleCodeGen(exception);

这意味着 compileSimple(...) 实际上返回一个 CompiledFunction,它扩展了 ContextFunction 和这样的 Function

CompiledFunction getFun() {
return new CompiledFunction(0, code.toArray(), consts.getRe(), consts.getIm(), funcs.toArray());
}

所以实际上是调用了 ContextFunction 中的 eval(...) 函数。那个有一个真正的实现。

在没有 IDE 的情况下进行代码分析并仅观察代码可能会很棘手。使用调试器并逐步执行可以轻松地向您展示程序流程。

关于java - arity.jar 算术库如何计算字符串操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24286965/

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