AviatorScript 支持多行表达式,表达式之间必须以分号 ;
隔开,支持换行,我们前面已经见了很多例子了:
## examples/statements.av
let 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.av
let a = 1;
let b = 2;
c = a + b
这时候再执行 execute
将返回表达式 c = a +b
的值,赋值语句的结果即为右值,也就是 3。
在 AviatorScript 中任何表达式都有一个值,加上分号后就是丢弃该值固定为 nil。
除了不加分号来返回之外,你也可以用 return 语句来指定返回:
## examples/statements_return.av
let a = 1;
let b = 2;
c = a + b;
return c;
注意, return 语句就必须加上分号才是完整的一条语句,否则将报语法错误。
return 也用于提前返回,结合条件语句可以做更复杂的逻辑判断:
## examples/if_return.av
if 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: 8
result: a is less than b.
注意到,这里我们用 Expression#newEnv(key1, value1, key2, value2 ...)
的方式来创建执行的的 context 环境,这是推荐的方式,性能会比直接构造一个 HashMap 略好。