这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战
# use 语句引用 Java 类
从 5.2 开始,aviatorscript 支持 use 语句,类似 java 里的 import 语句,可以导入 java 类到当前命名空间,减少在 new 或者 try...catch 等语句里写完整报名的累赘方式。 use
语句的使用方式多种,最简单的情况是导入单个 Java 类:
## examples/new.av
use java.util.Date;
let d = new Date();
p(type(d));
p(d);
use 包名.类名
就可以导入任意一个类到当前上下文。
如果要导入某个包下面的任意类,可以用通配符 *
:
## examples/use.av
use java.util.*;
let list = new ArrayList(10);
seq.add(list, 1);
seq.add(list, 2);
p("list[0]=#{list[0]}");
p("list[1]=#{list[1]}");
let set = new HashSet();
seq.add(set, "a");
seq.add(set, "a");
p("set type is: " + type(set));
p("set is: #{set}");
我们把 java.util
包下的类都导入,因此可以直接 new
一个 ArrayList 或者 HashSet,并使用:
list[0]=1
list[1]=2
set type is: java.util.HashSet
set is: [a]
如果你只是想引入包下的数个类,而不是全部,可以通过 use 包名.{类1, 类2...}
的方式,看一个更复杂的例子
use java.util.concurrent.locks.{ReentrantLock, ReentrantReadWriteLock};
use java.util.concurrent.CountDownLatch;
let x = 0;
let n = 10;
let lk = new ReentrantLock();
let latch = new CountDownLatch(n);
for i in range(0, n) {
let t = new Thread(lambda() ->
lock(lk);
x = x + 1;
unlock(lk);
countDown(latch);
p("thread #{i} done");
end);
start(t);
}
await(latch);
p("x=#{x}");
let lk = new ReentrantReadWriteLock();
let wlk = writeLock(lk);
lock(wlk);
x = x + 1;
unlock(wlk);
p("x=#{x}");
我们使用 ReentranLock
来保护变量 x
,并且使用 CountDownLatch
来同步所有线程执行完成。接下来我们用 ReentrantReadWriteLock
读写锁来保护 x
。可以看到 use java.util.concurrent.locks.{ReentrantLock, ReentrantReadWriteLock};
这一行代码导入了两个 Lock 类。
执行输出:
thread 4 done
thread 5 done
thread 2 done
thread 0 done
thread 3 done
thread 1 done
thread 6 done
thread 7 done
thread 8 done
thread 9 done
x=10
x=11
null
条件语句
AviatorScript 中的条件语句和其他语言没有太大区别:
if(true) {
println("in if body");
}
上面的代码执行,将打印 in if body
。 if 接受一个布尔表达式,如果其值为 true
就执行后续的代码块。如果为 false
,可以带上 else
语句执行其中的代码块,代码块都是以大括号包起来:
if(false) {
println("in if body");
} else {
println("in else body");
}
``
**请注意,代码块都必须用大括号包起来,哪怕是单行语句,这跟 java 是不一样的**。
`if` 后面连着的表达式的括号是可以忽略,上面的例子可以改写成:
if false { println("in if body"); } else { println("in else body"); }
连续的条件判断可以用复杂的
if test1 { ... } else { if test2 { ... } else { if test3 { ... } else ... } }
嵌套结构,但是更应该直接使用 `elsif` 语句,类似 Java 中的 `else if` ,比如我们写一个猜数字的例子:
examples/if.av
let a = rand(1100);
if a > 1000 { println("a is greater than 1000."); } elsif a > 100 { println("a is greater than 100."); } elsif a > 10 { println("a is greater than 10."); } else { println("a is less than 10 "); }
println("a is " + a + ".");
比如上面的代码写生成一个 `[0, 1100)` 内的整数,然后通过一系列条件语句,判断 `a` 的范围,并打印相应的字符串,最后打印 `a` 的值是多少。同样 `elsif` 对应的判断语句的括号也是可以忽略的。