函数与返回值
函数默认返回最后一个表达式。提前退出可以使用 `return`,这让短脚本保持简洁,也让复杂路径仍然清楚。
fn add(a: i64, b: i64) {
a + b
}
pub fn main() {
let value = add(40, 2);
if value == 42 {
return "answer";
}
"other"
}
Syntax
Zust 源文件使用 `.zs` 后缀。它支持函数、结构体、impl、泛型、闭包、导入、模式绑定、表达式控制流和动态 map/list,并允许变量直接重新赋值。
pub fn demo() {
let p = Point{x: 3.0, y: 4.0};
let scale = |value: f64| {
value * 2.0
};
scale(p.len2())
}
函数默认返回最后一个表达式。提前退出可以使用 `return`,这让短脚本保持简洁,也让复杂路径仍然清楚。
fn add(a: i64, b: i64) {
a + b
}
pub fn main() {
let value = add(40, 2);
if value == 42 {
return "answer";
}
"other"
}
数字可以带显式类型后缀;字符串支持转义和 raw string;list、map、tuple 可以直接作为脚本数据结构使用。
let i = 42i32;
let f = 3.14f32;
let raw = r#"hello "Zust""#;
let pair = (1i32, 2i32);
let list = [1, 2, 3];
let object = {name: "Zust", version: 0.9};
`let` 支持 tuple、list、标识符和通配符模式。变量、字段和索引可以直接重新赋值,复合赋值运算符也可用。
let (left, right) = (3i32, 4i32);
let [first, second] = [5i32, 6i32];
let _ = first;
let data = {items: [1i32, 2i32, 3i32]};
data.items.push(4i32);
data.items[0] = second + left + right;
`if`/`else` 可以作为表达式,`for` 支持 open range 和 inclusive range,`while` 与 `loop` 覆盖更普通的循环场景。
let label = if list.len() > 0 { "non-empty" } else { "empty" };
let total = 0i32;
for idx in 0..10 {
if idx % 2 == 0 {
continue;
}
total += idx;
}
结构体让脚本拥有可维护的数据形状,`impl` 把行为放回类型旁边。方法调用和关联调用都支持。
struct Point {
x: f64,
y: f64,
}
impl Point {
pub fn len2(self: Point) {
self.x * self.x + self.y * self.y
}
}
let p = Point{x: 3.0, y: 4.0};
p.len2() == Point::len2(p)
泛型能表达普通容器,也能表达固定数组长度和 BigFloat limb 数量这类编译期结构。
pub struct Boxed<T> {
value: T,
}
pub struct BigFloat<N> {
sign: bool,
exp: i32,
data: [u32; N],
}
闭包可以捕获外部值,适合在脚本内组织轻量变换和回调逻辑。
let base = 10i32;
let add_base = |value: i32| {
value + base
};
add_base(5i32)
`import` 让 `.zs` 文件可以拆分。单参数导入会默认补全 `.zs` 后缀,适合小脚本模块化。
import("qsort", "qsort.zs");
import("syntax_imported");
let value = syntax_imported::imported_add(5i32, 6i32);