语句
代码块 是括在 { ... } 中的语句序列。
代码块构成函数的主体、回调连接的处理程序,
以及绑定的块形式:
clicked => { let n = counter + 1; counter = n;}绑定也可以改为持有以分号结尾的单个表达式;两种形式可以互换。 两种形式都是响应式的:Slint 会跟踪求值期间读取的属性。
代码块的值是其最后一条语句的值,除非 return 语句提前退出。
下面这些语句是解析器在代码块内接受的全部语句集合。 除此之外都不是语句;任何不属于这些形式的内容都会被解析为表达式语句,无法识别的语法是解析错误。
任何后跟分号的表达式都是语句,为产生效果而求值,其值被丢弃(代码块的最后一条语句除外):
clicked => { debug("hello"); root.some-callback();}= 为属性赋一个新值。
自赋值运算符 +=、-=、*= 和 /= 将相应的运算符与赋值组合:
clicked => { counter = 42; counter += 1;}左侧必须是一个可写的位置:属性引用、结构体类型属性的字段、数组类型属性的元素,或 for 元素内的模型值。
向其他任何内容赋值——局部变量、函数调用或任何其他表达式——都会构成编译错误。
属性必须可以从赋值出现的位置写入。
向可见性不允许的属性赋值是一个错误;向链接到只读属性的属性赋值,或向必须在编译时已知的 constexpr 属性赋值,同样是错误。
右侧必须具有该属性的类型。
+= 也适用于 string 和类长度类型;-=、*= 和 /= 仅适用于类长度类型;在另一种类型上使用它们中的任何一个都是一个错误。
Let 语句
Section titled “Let 语句”let 声明一个局部变量,从声明处到外层代码块末尾可见:
clicked => { let greeting = "hello world"; // type inferred from the value let count: int = 2; // explicit type annotation debug(greeting, count);}类型标注是可选的;没有它时,类型从初始化器推断,而初始化器是必需的。
局部变量是不可变的:声明后不能对其赋值,因为赋值目标必须是属性。
已在作用域中的名字——局部变量或回调/函数参数——不能被 let 重新声明,即使是在嵌套块中也不行;这样做会构成编译错误。
:= 在语句中不是赋值运算符。
书写 name := <expression>; 是一个错误,会建议改用 let name = <expression>;。
if 连同可选的 else if 和 else 分支,有条件地运行代码块:
clicked => { if condition { foo = 42; } else if other-condition { bar = 28; } else { foo = 4; }}条件是表达式;其周围的括号是可选的。
每个分支都是代码块。
else 分支要么是另一个 if,要么是最终的代码块。
语句开头的 if 仅当其后没有紧跟 .、,、;、}、] 或 ) 时才被视为 if 语句;在这些情况下,if 被读作表达式中的普通标识符。
没有 for 或 while 语句。
对模型进行重复是在元素树中用 for 元素表达的,而不是在代码块内部。
Return
Section titled “Return”return 结束外层函数、回调处理程序或代码块绑定并产生其值:
clicked => { if disabled { return; } counter += 1;}返回的表达式是可选的。
如果外层函数或回调声明了返回类型,不带值的 return 是一个错误,并且值的类型必须与声明的返回类型匹配。
如果没有任何 return,块会产生其最后一条语句的值。
单独的分号是空语句:
clicked => { ; }© 2026 SixtyFPS GmbH