AviatorScript 支持多行表达式,表达式之间必须以分号 ; 隔开,支持换行,我们前面已经见了很多例子了:
## examples/statements.avlet a = 1;let b = 2;c = a + b;
整个脚本的返回结果默认是最后一个表达式的结果。但是这里需要注意的是,加上分号后,整个表达式的结果将固定为 nil,因此如果你执行上面的脚本,并打印结果,一定是 null,而不是 c 的值:
package com.googlecode.aviator.example;import com.googlecode.aviator.AviatorEvaluator;import com.googlecode.aviator.Expression;import com.googlecode.aviator.Options;/*** Run a script under examples folder.** @author dennis(killme2008@gmail.com)**/public class RunScriptExample {public static void main(final String[] args) throws Exception {// You can try to test every script in examples folder by changing the file name.Expression exp = AviatorEvaluator.getInstance().compileScript("examples/statements.av");Object result = exp.execute();System.out.println(result);}}
其中 exp.execute 返回的 result 打印出来就是 null:
result: null
如果你想返回表达式的值,而不是为 nil,最后一个表达式不加分号即可:
## examples/statements_result.avlet a = 1;let b = 2;c = a + b
这时候再执行 execute 将返回表达式 c = a +b 的值,赋值语句的结果即为右值,也就是 3。
在 AviatorScript 中任何表达式都有一个值,加上分号后就是丢弃该值固定为 nil。
除了不加分号来返回之外,你也可以用 return 语句来指定返回:
## examples/statements_return.avlet a = 1;let b = 2;c = a + b;return c;
注意, return 语句就必须加上分号才是完整的一条语句,否则将报语法错误。
return 也用于提前返回,结合条件语句可以做更复杂的逻辑判断:
## examples/if_return.avif a < b {return "a is less than b.";}return a - b;
然后我们传入变量 a 和 b 分别来测试下:
package com.googlecode.aviator.example;import com.googlecode.aviator.AviatorEvaluator;import com.googlecode.aviator.Expression;import com.googlecode.aviator.Options;/*** Run a script under examples folder.** @author dennis(killme2008@gmail.com)**/public class RunScriptExample {public static void main(final String[] args) throws Exception {// You can try to test every script in examples folder by changing the file name.Expression exp = AviatorEvaluator.getInstance().compileScript("examples/if_return.av");Object result = exp.execute(exp.newEnv("a", 9, "b", 1));System.out.println("result: " + result);result = exp.execute(exp.newEnv("a", 1, "b", 9));System.out.println("result: " + result);}}
分别执行不同的返回语句:
result: 8result: a is less than b.
注意到,这里我们用 Expression#newEnv(key1, value1, key2, value2 ...) 的方式来创建执行的的 context 环境,这是推荐的方式,性能会比直接构造一个 HashMap 略好。
