04 Statements¶
此文档介绍 YIAN 中函数体以及方法体中可以使用的语句类型
基本语句¶
Variable Declaration¶
YIAN 中的变量声明的格式为:
<type> <name> = <expression>
<type>: 变量的类型, 可以是任何有效的类型<name>: 变量的名称, 必须是一个有效的标识符<expression>: 变量的初始值, 必须是一个类型为<type>的表达式, 关于表达式的详细信息请参见表达式章节- 初始值是可选的
下面的代码片段展示了变量声明的示例:
i32 a = 10
f64 b = 3.14
bool flag = true
char ch = 'A'
str name // 未初始化的变量
Assignment¶
YIAN 中的赋值语句的格式为:
<lvalue> = <expression>
<lvalue>: 赋值语句左侧的表达式, 必须是一个可赋值的左值表达式, 关于左值的详细信息请参见表达式章节<expression>: 赋值语句右侧的表达式, 必须是一个类型与<lvalue>的类型兼容的表达式
下面的代码片段展示了赋值语句的示例:
a = 20
*ptr = 30
arr[0] = 1
Call¶
YIAN 支持多种形式的调用, 总的格式为两种:
<callable><type_arguments>(<arguments>)
<receiver>.<method_name><type_arguments>(<arguments>)
<callable>: 可调用对象, 可以是一个函数名, 函数指针, 内置指令<receiver>: 方法调用者, 可以是一个表达式(对应于实例方法), 也可以是一个类型(对应于静态方法), 详见方法章节<method_name>: 方法名称<type_arguments>: 可选的类型参数列表, 仅在调用泛型函数或方法时使用, 详见泛型章节<arguments>: 实际参数列表, 包含零个或多个逗号分隔的表达式, 每个表达式的类型必须与对应的参数类型兼容
Struct Construction¶
使用以下语法构造一个结构体实例:
<struct_name>(<element1>, <element2>, ..., <elementN>)
<struct_name>(<field1>=<value1>, <field2>=<value2>, ..., <fieldN>=<valueN>)
<struct_name>: 结构体的名称<element1>, <element2>, ..., <elementN>: 位置构造的元素列表, 每个元素的类型必须与结构体定义中对应字段的类型兼容<field1>=<value1>, <field2>=<value2>, ..., <fieldN>=<valueN>: 命名构造的字段列表, 每个字段名称必须与结构体定义中的字段名称匹配, 每个字段值的类型必须与结构体定义中对应字段的类型兼容- 使用这种语法构造结构体实例时, 等效于为结构体的每个字段进行赋值, 会受到访问控制的限制, 详见模块章节
Enum Variant Construction¶
一个枚举变量必须属于一个合法的变体, 根据变体有无 payload, 枚举变量的构造语法有两种:
<enum_name>.<variant_name>
<enum_name>.<variant_name>(<element1>, <element2>, ..., <elementN>)
<enum_name>: 枚举的名称<variant_name>: 枚举变体的名称<element1>, <element2>, ..., <elementN>: 位置构造的元素列表, 每个元素的类型必须与枚举定义中对应变体的字段类型兼容- 构造有 payload 的枚举变体时, 必须提供字段的值
Type Cast¶
YIAN 仅支持预先规定好的, 基本类型之间的类型转换, 语法为:
<target_type>(<expression>)
<target_type>: 目标类型<expression>: 被转换的表达式, 必须是一个能够转换为<target_type>的表达式, 详见类型章节
Dyn¶
YIAN 中的 dyn 语句用于在堆内存中分配值, 包括以下用法:
dyn <type>
dyn <expression>
dyn <type>[<size>]
<type>: 要分配的值的类型, 可以是任何有效的类型<expression>: 在堆内存中分配一个值, 其类型由<expression>的类型决定, 同时<expression>的值将被复制到堆内存中<size>: 分配一个数组, 数组元素的类型由<type>决定, 数组的长度由<size>决定,<size>必须是一个兼容u64的表达式- 使用 dyn 语句分配的值必须使用 delete 语句释放, 否则会导致内存泄漏
Delete¶
用于释放指针所指向的内存, 语法为:
del <pointer_expression>
<pointer_expression>: 指针表达式, 必须是一个类型为指针的表达式
控制流语句¶
If¶
YIAN 中的 if 语句的格式为:
if <condition> {
<statements>
} elif <condition> {
<statements>
} else {
<statements>
}
<condition>: 条件表达式, 必须是一个类型为bool的表达式<statements>: 语句块- if 语句可以有零个或多个 elif 分支, 以及一个可选的 else 分支
For¶
YIAN 中的 for 语句的格式为:
for <initializer>; <condition>; <updater> {
<statements>
}
<initializer>: 初始化语句, 在循环开始前执行一次<condition>: 循环条件, 在每次循环迭代开始时评估, 必须是一个类型为bool的表达式, 当条件为 false 时循环结束<updater>: 更新语句, 在每次循环迭代结束时执行<statements>: 循环体, 在每次循环迭代中执行
While¶
YIAN 中的 while 语句的格式为:
while <condition> {
<statements>
}
<condition>: 循环条件, 在每次循环迭代开始时评估, 必须是一个类型为bool的表达式, 当条件为 false 时循环结束<statements>: 循环体, 在每次循环迭代中执行
Loop¶
YIAN 中的 loop 语句的格式为:
loop {
<statements>
}
<statements>: 循环体, 无限循环执行
Match¶
类似于 switch 语句, 但是与 enum 结合使用具有更强的表达能力, 格式为:
match <expression> {
<pattern1> {
<statements>
}
<pattern2> as <binding> {
<statements>
}
...
<patternN> {
<statements>
}
_ {
<statements>
}
}
<expression>: 被匹配的表达式, 可以是整数类型, 字符类型和枚举类型<pattern>: 根据被匹配表达式的类型不同, 模式的格式也不同, 分别为:- 对于整数类型和字符类型, 模式可以是一个字面值或者一个字面值列表, 例如
1,'A',1, 2, 3 - 对于枚举类型, 模式可以是一个枚举变体的名字或者变体名字列表, 例如
Red,Red, Green, Blue - 如果模式是一个带有 payload 的枚举变体, 可以选择性地绑定 payload 的值在
<binding>中使用, 例如Some as x - 使用
_模式可以匹配所有未被前面模式匹配到的情况 - match 会进行穷尽性检查,
<expression>的所有可能值必须被某个模式匹配到, 否则会导致编译错误
下面是一个 match 语句的示例:
enum Color {
Red
Green
Blue
Rgb {
u8 r
u8 g
u8 b
}
}
// 一个包含 match 语句的函数示例
match_color(Color color) {
match color {
Red { print("Red") }
Green { print("Green") }
Blue { print("Blue") }
Rgb as rgb {
// 访问绑定的 rgb 变量, 其类型为一个包含 r, g, b 字段的结构体
u8 sum = rgb.r + rgb.g + rgb.b
print("Rgb")
}
}
}
Break¶
用于跳出循环的语句, 语法为:
break
- 只能在循环体内使用, 用于立即终止当前循环
Continue¶
用于跳过当前循环迭代的剩余部分, 直接进入下一次循环迭代的语句, 语法为:
continue
- 只能在循环体内使用, 用于跳过当前循环迭代的剩余部分
Assert¶
用于在运行时检查一个条件是否为真, 如果条件为假则触发一个运行时错误, 语法为:
assert <condition>: <message>
<condition>: 断言条件, 必须是一个类型为bool的表达式<message>: 断言失败时的错误消息, 必须是一个str类型的表达式- assert 语句通常用于调试和测试
Return¶
从函数或方法返回一个值的语句, 语法为:
return <expression>
<expression>: 返回值的表达式, 必须是一个类型与函数或方法的返回类型兼容的表达式- 如果函数或方法的返回类型是
void, 则不需要<expression>