Skip to content

函数

函数 为一组接收参数并返回值的 Slint 逻辑命名。 它使用 function 关键字在组件内部或组件的元素内部声明:

export component Example {
function my-function(parameter: int) -> string {
return "result";
}
}
slint

函数可以在组件的根元素上、其内部任何元素上或全局对象中声明。 它不能声明在文件的顶层、结构体或枚举内部,也不能嵌套在另一个函数内部;每一种都会构成编译错误。

声明是可选的修饰符序列、function 关键字、一个名字、带括号的参数列表以及可选的返回类型:

public pure function name(a: int, b: string) -> int { return a; }
slint
  • 每个参数写作 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 { }
}
slint

在组件子元素上声明的 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;
}
}
}
}
slint

由于同名函数可以声明在不同的元素上,不带元素名的调用解析到的函数可能与用 self 限定的调用不同。

函数和回调都以相同的方式触发、都接受参数和返回值,并且都可以是 pure。 它们的区别如下:

  • 回调的处理程序可以从原生代码设置并用原生语言编写;函数完全用 Slint 定义。
  • 回调可以没有主体地声明;函数必须有主体。
  • 回调可以用 <=> 运算符声明别名;函数不能。
  • 回调始终像 public 函数一样可访问;函数默认是私有的。

© 2026 SixtyFPS GmbH