AviatorScript 支持多行表达式,表达式之间必须以分号 ; 隔开,支持换行,我们前面已经见了很多例子了:

    1. ## examples/statements.av
    2. let a = 1;
    3. let b = 2;
    4. c = a + b;

    整个脚本的返回结果默认是最后一个表达式的结果。但是这里需要注意的是,加上分号后,整个表达式的结果将固定为 nil,因此如果你执行上面的脚本,并打印结果,一定是 null,而不是 c 的值:

    1. package com.googlecode.aviator.example;
    2. import com.googlecode.aviator.AviatorEvaluator;
    3. import com.googlecode.aviator.Expression;
    4. import com.googlecode.aviator.Options;
    5. /**
    6. * Run a script under examples folder.
    7. *
    8. * @author dennis(killme2008@gmail.com)
    9. *
    10. */
    11. public class RunScriptExample {
    12. public static void main(final String[] args) throws Exception {
    13. // You can try to test every script in examples folder by changing the file name.
    14. Expression exp = AviatorEvaluator.getInstance().compileScript("examples/statements.av");
    15. Object result = exp.execute();
    16. System.out.println(result);
    17. }
    18. }

    其中 exp.execute 返回的 result 打印出来就是 null:

    1. result: null

    如果你想返回表达式的值,而不是为 nil,最后一个表达式不加分号即可:

    1. ## examples/statements_result.av
    2. let a = 1;
    3. let b = 2;
    4. c = a + b

    这时候再执行 execute 将返回表达式 c = a +b 的值,赋值语句的结果即为右值,也就是 3。

    在 AviatorScript 中任何表达式都有一个值,加上分号后就是丢弃该值固定为 nil。

    除了不加分号来返回之外,你也可以用 return 语句来指定返回:

    1. ## examples/statements_return.av
    2. let a = 1;
    3. let b = 2;
    4. c = a + b;
    5. return c;

    注意, return 语句就必须加上分号才是完整的一条语句,否则将报语法错误。

    return 也用于提前返回,结合条件语句可以做更复杂的逻辑判断:

    1. ## examples/if_return.av
    2. if a < b {
    3. return "a is less than b.";
    4. }
    5. return a - b;

    然后我们传入变量 a 和 b 分别来测试下:

    1. package com.googlecode.aviator.example;
    2. import com.googlecode.aviator.AviatorEvaluator;
    3. import com.googlecode.aviator.Expression;
    4. import com.googlecode.aviator.Options;
    5. /**
    6. * Run a script under examples folder.
    7. *
    8. * @author dennis(killme2008@gmail.com)
    9. *
    10. */
    11. public class RunScriptExample {
    12. public static void main(final String[] args) throws Exception {
    13. // You can try to test every script in examples folder by changing the file name.
    14. Expression exp = AviatorEvaluator.getInstance().compileScript("examples/if_return.av");
    15. Object result = exp.execute(exp.newEnv("a", 9, "b", 1));
    16. System.out.println("result: " + result);
    17. result = exp.execute(exp.newEnv("a", 1, "b", 9));
    18. System.out.println("result: " + result);
    19. }
    20. }

    分别执行不同的返回语句:

    1. result: 8
    2. result: a is less than b.

    注意到,这里我们用 Expression#newEnv(key1, value1, key2, value2 ...) 的方式来创建执行的的 context 环境,这是推荐的方式,性能会比直接构造一个 HashMap 略好。