效果系统
通过 `with IO`、`with Panic`、`with Async` 以及自定义效果,让副作用显式化。
效果系统
Sounio 通过函数签名中的显式 with ... 子句跟踪 副作用。
纯函数 vs 有效果
fn double(x: i32) -> i32 {
x * 2
}
fn greet() with IO {
println("Hello")
}
常见内建效果
IO: 控制台 + 文件系统 + 外部 I/OPanic: 可能 trap/abort 的操作(例如除以零、越界索引)Async: async/await 与并发原语Alloc: 堆分配Mut: 可变状态(在适用时)GPU: GPU kernel / 设备操作(依赖特性开关)
效果错误
如果你在纯函数中调用了带效果的函数,编译器会报错,直到你:
- 在调用者的签名中加入所需效果,或
- 重构代码,把效果限制在边界处(推荐)。
规范 vs 实现
规范的目标是“效果在任何地方都显式”。不过,部分内建操作在当前实现中可能比用户自定义的效果函数更宽松,这取决于编译器模式与特性开关。