Skip to content

求值与纯度

绑定是惰性求值的:其表达式在查询属性值时才运行,而不是在设置绑定时运行。

在求值绑定的表达式时,它读取的每个属性都会注册为该绑定的依赖项。 当其中任何属性发生变化时,该绑定会被标记为脏。 下次查询该属性时会重新求值表达式,并根据该次求值期间读取的属性重建其依赖集合。 表达式不读取任何属性的绑定永远不会被标记为脏,并且至多求值一次。

依赖集合在每次求值时都会重建,因此它始终反映最近一次运行时读取的属性。 在后续求值不会走的分支上读取的属性不是该次求值的依赖项。

一个属性至多持有一个绑定。 在属性上设置新绑定会替换任何先前的绑定;最后一个绑定生效。

仅当属性通过绑定表达式(x: other.value)或双向绑定(<=>)赋值时,绑定才处于活动状态。 命令式赋值(foo.bar = 42;)会移除绑定: 从那一刻起,属性不再对它曾绑定到的值作出反应。 该属性仍可通过后续赋值更新,但会失去其自动响应性。

被双向绑定拦截的赋值是例外:它通过链接写入,并保留该绑定。

这也适用于大多数内置的 in-out 属性,例如 TextInput 的 text 属性: 用户交互会像命令式赋值一样写入该属性,并移除对它的现有绑定。

在这种情况下,为保持响应性,请使用双向绑定, 或使用变更回调跟踪更新。

求值属性绑定不得改变除该属性本身以外的任何可观察状态。 具有这种性质的表达式是纯的;否则它就有副作用。 由于绑定是惰性求值的,副作用的顺序以及它们是否会发生都是未定义的,因此绑定必须是纯的。

编译器强制要求纯上下文中的代码没有副作用。 纯上下文包括:

  • 属性绑定表达式。
  • for 元素的模型表达式。
  • 声明为 pure 的函数或回调的主体。

在纯上下文中,以下内容会构成编译错误:

  • 对属性的赋值或自赋值(=、+=、-=、*=、/=)。
  • 调用不是 pure 的回调。
  • 调用不是纯的函数。
  • 调用有副作用的内置函数。

pure 关键字用于标注回调和函数, 以便它们可以从纯上下文中调用。 pure 回调的处理程序和 pure 函数的主体本身就是纯上下文,并会据此检查。

export component Example {
pure callback foo() -> int;
public pure function bar(x: int) -> int {
return x + foo();
}
}
slint

私有函数的纯性会被推断:当且仅当其主体不包含副作用时,编译器才将其视为纯的。 私有函数仍可声明为 pure,以便让编译器拒绝有副作用的主体。

实现接口中 pure 函数的函数本身必须是纯的;将其声明为非纯会构成编译错误。 反之则允许:纯的实现可以满足非纯的声明。

纯性在回调别名或回调双向绑定中必须匹配: 两边必须都是 pure 或都是非纯,否则会构成编译错误。


© 2026 SixtyFPS GmbH