函数
函数 为一组接收参数并返回值的 Slint 逻辑命名。
它使用 function 关键字在组件内部或组件的元素内部声明:
export component Example { function my-function(parameter: int) -> string { return "result"; }}函数可以在组件的根元素上、其内部任何元素上或全局对象中声明。 它不能声明在文件的顶层、结构体或枚举内部,也不能嵌套在另一个函数内部;每一种都会构成编译错误。
声明是可选的修饰符序列、function 关键字、一个名字、带括号的参数列表以及可选的返回类型:
public pure function name(a: int, b: string) -> int { return a; }- 每个参数写作
name: type。 参数按值传递,并在主体内按名字引用。 同一函数的两个参数不得同名。 - 返回类型跟在
->之后。 没有->时,返回类型为void。 return语句返回返回类型的表达式。 没有显式return的函数返回其最后一条语句的值。
函数必须有主体。
没有 { } 块的声明会构成编译错误。
修饰符前可以带有 @deprecated 注解,
它会将该函数标记为已废弃,并指引用户使用其替代者。
函数名字不得与同一元素的属性冲突,也不得覆盖从基元素继承的不可遮蔽成员;两者都会构成编译错误。
函数默认是私有的。
public 和 protected 修饰符会扩大其可见性:
- 私有函数只能从其自身组件内部访问。 从另一个组件引用它会构成编译错误。
- 公共函数可以从任何将声明组件作为元素持有的组件访问,并且在组件被导出时也可以从原生代码访问。
- 受保护函数只能从直接继承声明组件的组件访问,并且只能通过该组件自身的根(
self或root)访问。 它不能通过作为子元素持有的继承实例访问,也不能跨多于一层继承访问。
访问另一个组件的函数总是需要一个目标:调用者将该组件声明为其元素之一,并在其上调用该函数。
export component HasFunction { public pure function double(x: int) -> int { return x * 2; }}
export component CallsFunction { property <int> test: my-friend.double(1); my-friend := HasFunction { }}在组件子元素上声明的 public 函数无法从另一个组件访问:只有组件本身才能充当目标,因此不存在通向该子元素函数的路径。
相同的可见性规则适用于在全局对象中声明、通过全局对象名字访问的函数。
导出组件中标记为 public 的函数可以从原生代码(Rust、C++、JavaScript、Python)调用。
有关生成的代码,请参见各语言的文档。
pure 修饰符将函数标记为没有副作用,以便它可以从绑定等纯上下文中调用。
对于 public 或 protected 函数,必须显式说明纯性;没有 pure 时,函数被视为非纯。
对于私有函数,在未标记时其纯性由主体推断。
pure 函数若赋值属性或调用非纯函数或回调,会构成编译错误。
参见求值与纯度。
函数调用可以带或不带元素名。
名字按照共享的查找规则解析:
不带元素名时,它在 self 上查找,然后依次在每个外层元素上查找,直到组件根;带元素名时,它必须定义在该元素上。
import { Button, VerticalBox } from "std-widgets.slint";
export component Example { // without an element name property <string> a: my-function(); // with an element name property <int> b: my_button.my-other-function();
pure function my-function() -> string { return "result"; }
VerticalBox { my_button := Button { text: "Click me"; pure function my-other-function() -> int { return 42; } } }}由于同名函数可以声明在不同的元素上,不带元素名的调用解析到的函数可能与用 self 限定的调用不同。
函数和回调都以相同的方式触发、都接受参数和返回值,并且都可以是 pure。
它们的区别如下:
- 回调的处理程序可以从原生代码设置并用原生语言编写;函数完全用 Slint 定义。
- 回调可以没有主体地声明;函数必须有主体。
- 回调可以用
<=>运算符声明别名;函数不能。 - 回调始终像
public函数一样可访问;函数默认是私有的。
© 2026 SixtyFPS GmbH