Java使用Aviator表达式 学习记录(七)

1,506 阅读2分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

多行表达式和 return

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 略好。