Skip to content

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>