tansci-boot/magic-script-skill/references/script-syntax.md

164 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 脚本语法详解
## for循环
### 循环集合
```javascript
var list = [1,2,3];
for(index,item in list){ //如果不需要index也可以写成for(item in list)
println(index + ":" + item);
}
// 结果0:1, 1:2, 2:3
```
### 循环指定次数
```javascript
var sum = 0;
for(value in range(0,100)){ //包括0包括100
sum = sum + value; //不支持+= -= *= /= ++ -- 这种运算
}
return sum; // 5050
```
## while循环
```javascript
var count = 100;
var sum = 0;
while(count){
sum = sum + count;
count = count - 1;
}
return sum; // 5050
```
## 循环map
```javascript
var map = {
key1 : 123,
key2 : 456
};
for(key,value in map){ //如果不需要key也可以写成for(value in map)
println(key + ":" + value);
}
// 结果key1:123, key2:456
```
## Import导入
### 导入Java类
```javascript
import 'java.lang.System' as System;
import 'javax.sql.DataSource' as ds;
import 'org.apache.commons.lang3.StringUtils' as string;
import 'java.text.*' // 此写法跟Java一致
System.out.println('调用System打印');
System.out.println(ds);
System.out.println(string.isBlank(''));
System.out.println(new SimpleDateFormat('yyyy-MM-dd').format(new Date()));
```
### 导入已定义的模块
```javascript
import log; //导入log模块并定义一个与模块名相同的变量名
//import log as logger; //导入log模块并赋值给变量 logger
log.info('Hello {}','Magic API!')
```
## new创建对象
```javascript
import 'java.util.Date' as Date;//创建之前先导包,不支持.*的操作
return new Date();
```
## 异步调用
### 异步调用方法
```javascript
var val = async db.select('.....'); // 异步调用返回Future类型
return val.get(); //调用Future的get方法
```
### 异步调用lambda
```javascript
var list = [];
for(index in range(1,10)){
list.add(async (index)=>db.selectInt('select #{index}'));
}
return list.map(item=>item.get()); // 循环获取结果
```
## exit
语法格式为 `exit expr[,expr][,expr]....`
在`magic-api`中只取前三个值,分别对应`code`、`message`、`data`
如:`exit 400,'参数填写有误'`
## assert
语法格式为 `assert expr : expr[,expr][,expr]....`
如:`assert a == 1 : 400, 'a的值应为1'` 相当于
```javascript
if(a != 1){
exit 400, 'a的值应为1'
}
```
## 类型转换
通过`::`进行类型转换,如`xxx::int`、`xxx::double`等,当前支持转换类型有`int`、`double`、`long`、`byte`、`short`、`float`、`date`
```javascript
var a = "1";
return {
v1: a::int,
v2: a::int(0), //转换失败时值为0
v3: "2020-01-01"::date('yyyy-MM-dd') //转为Date
}
```
`::sql`支持将数据转换为对应的sql类型比如
```javascript
img::sql('blob')
```
可传入的参数请参考`java.sql.Types`中定义的常量,不区分大小写。
## 嵌入其它脚本语言
```javascript
var name = "hello";
var test = ```javascript
name + ' ~ world'
```;
return test();
```
## 可选链操作符
可选链操作符(`?.`)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。
```javascript
var a = null;
var b = a?.name; // b = null;
var c = a?.getName(); // c = null;
```
## 扩展运算符
扩展运算符,又叫展开语法(Spread syntax)是用于将list或map在语法层面展开
### lambda 调用
```javascript
var sum = (a,b,c) => a + b + c;
System.out.println(sum(...[1,2,3])) // 结果6
```
### list 展开
```javascript
var arr = [3,4,5];
System.out.println([1,2,...arr,6,7]) // 结果:[1, 2, 3, 4, 5, 6, 7]
```
### map 展开
```javascript
var map = {key2:2}
System.out.println({key1:1,...map,key3:3}) // 结果:{key1=1, key2=2, key3=3}
```