Skip to content

语句

代码块 是括在 { ... } 中的语句序列。 代码块构成函数的主体、回调连接的处理程序, 以及绑定的块形式:

clicked => {
let n = counter + 1;
counter = n;
}
slint

绑定也可以改为持有以分号结尾的单个表达式;两种形式可以互换。 两种形式都是响应式的:Slint 会跟踪求值期间读取的属性。

代码块的值是其最后一条语句的值,除非 return 语句提前退出。

下面这些语句是解析器在代码块内接受的全部语句集合。 除此之外都不是语句;任何不属于这些形式的内容都会被解析为表达式语句,无法识别的语法是解析错误。

任何后跟分号的表达式都是语句,为产生效果而求值,其值被丢弃(代码块的最后一条语句除外):

clicked => {
debug("hello");
root.some-callback();
}
slint

这是用于调用回调或函数的形式。

= 为属性赋一个新值。 自赋值运算符 +=、-=、*= 和 /= 将相应的运算符与赋值组合:

clicked => {
counter = 42;
counter += 1;
}
slint

左侧必须是一个可写的位置:属性引用、结构体类型属性的字段、数组类型属性的元素,或 for 元素内的模型值。 向其他任何内容赋值——局部变量、函数调用或任何其他表达式——都会构成编译错误。

属性必须可以从赋值出现的位置写入。 向可见性不允许的属性赋值是一个错误;向链接到只读属性的属性赋值,或向必须在编译时已知的 constexpr 属性赋值,同样是错误。

右侧必须具有该属性的类型。 += 也适用于 string 和类长度类型;-=、*= 和 /= 仅适用于类长度类型;在另一种类型上使用它们中的任何一个都是一个错误。

let 声明一个局部变量,从声明处到外层代码块末尾可见:

clicked => {
let greeting = "hello world"; // type inferred from the value
let count: int = 2; // explicit type annotation
debug(greeting, count);
}
slint

类型标注是可选的;没有它时,类型从初始化器推断,而初始化器是必需的。 局部变量是不可变的:声明后不能对其赋值,因为赋值目标必须是属性。 已在作用域中的名字——局部变量或回调/函数参数——不能被 let 重新声明,即使是在嵌套块中也不行;这样做会构成编译错误。

:= 在语句中不是赋值运算符。 书写 name := <expression>; 是一个错误,会建议改用 let name = <expression>;。

if 连同可选的 else if 和 else 分支,有条件地运行代码块:

clicked => {
if condition {
foo = 42;
} else if other-condition {
bar = 28;
} else {
foo = 4;
}
}
slint

条件是表达式;其周围的括号是可选的。 每个分支都是代码块。 else 分支要么是另一个 if,要么是最终的代码块。

语句开头的 if 仅当其后没有紧跟 .、,、;、}、] 或 ) 时才被视为 if 语句;在这些情况下,if 被读作表达式中的普通标识符。

没有 for 或 while 语句。 对模型进行重复是在元素树中用 for 元素表达的,而不是在代码块内部。

return 结束外层函数、回调处理程序或代码块绑定并产生其值:

clicked => {
if disabled {
return;
}
counter += 1;
}
slint

返回的表达式是可选的。 如果外层函数或回调声明了返回类型,不带值的 return 是一个错误,并且值的类型必须与声明的返回类型匹配。 如果没有任何 return,块会产生其最后一条语句的值。

单独的分号是空语句:

clicked => { ; }
slint

© 2026 SixtyFPS GmbH