Skip to content

名字解析

名字解析决定表达式中的标识符指向哪个声明。 属性、回调和函数共享相同的规则。 标识符也可以通过 := 赋予元素的 id 来命名一个元素。

某些元素可以通过预定义名字访问:

  • self 指当前元素——即名字所在的绑定、回调或函数所属的元素。
  • parent 指包围当前元素的元素。 仅当当前元素在同一组件内有一个包围元素时,它才可用。
  • root 指当前组件的最外层元素。

root 是每个组件最外层元素的自动 id;显式命名为 root 的元素会构成保留 id 错误。 self、parent 和 root 是元素引用,用于限定成员,例如 self.width 或 root.some-property。

true 和 false 是两个布尔值的预定义名字,无法重新定义。

当标识符不带限定符使用时,按以下顺序尝试并取第一个匹配项来解析:

  1. 在包围块中用 let 声明的局部变量,或包围回调或函数处理程序的参数。
  2. self、parent、true 或 false。
  3. 元素 id。 id 在当前组件的元素树中搜索;当前元素的 id 以及从 root 可达的任何元素的 id 都可见,包围 for 元素的 id 以及嵌套在其中的任何元素的 id 也都可见。 root 在这里作为最外层元素的 id 解析。
  4. 作用域中已声明的属性、回调或函数。 首先尝试当前元素(self),然后是其包围元素,依此类推直到组件根。 以这种方式只能找到由源中声明引入的成员;元素或祖先的内置属性不能以非限定方式访问,必须写作 self.name 或通过 id 访问。 在 for 元素内,循环的索引和模型数据名字在这里解析。
  5. 按名字查找全局对象单例或枚举。
  6. 内置命名空间:Colors、Easing、Math、Key、FontWeight 或 MouseCursor。
  7. 期望类型的具名值:期望 color 或 brush 处的具名颜色,期望 easing 处的具名缓动曲线,或期望该枚举处的枚举值。 因此,只有在其类型已知为该枚举的位置,才能书写不带类型的枚举值。
  8. 内置自由函数,例如数学和颜色函数以及 debug。

产生匹配的第一个步骤生效,因此较早的种类会遮蔽后面同名的种类。 局部变量遮蔽作用域中的成员,当前元素上的成员遮蔽祖先上的成员,id 优先于作用域中同名的属性。

当标识符用元素限定——id、self、parent 或 root——时,成员必须定义在该元素上或从其基类型继承。 在这种情况下,解析不会回退到祖先元素。 因此,不带限定符调用成员与用 self 调用它不等价:非限定形式搜索整个作用域,而 self.name 只查看当前元素。

通过限定符到达的成员受可见性约束:另一个组件的 private 属性、回调或函数无法访问,特殊的仅绑定属性无法读取。

全局对象的成员通过其名字访问,例如 Name.property、Name.callback(...) 或 Name.function(...)。

由于已声明成员从当前元素开始向外查找,声明在内层元素上的成员会遮蔽声明在外层元素上的同名成员。 只要声明在不同的元素上,同一组件中允许存在多个同名函数;在其子树内进行的非限定调用中,内层函数会遮蔽外层函数:

export component Example {
property <int> secret_number: my-function();
public pure function my-function() -> int {
return 1;
}
VerticalLayout {
public pure function my-function() -> int {
return 2;
}
Text {
text: "The secret number is " + my-function();
public pure function my-function() -> int {
return 3;
}
}
Text {
text: "The other secret number is " + my-function();
}
}
}
slint

这里 secret_number 设为 1,第一个标签显示 “The secret number is 3”,第二个显示 “The other secret number is 2”。


© 2026 SixtyFPS GmbH