var
Types
错误类型:
回调函数异常
pub type Callback {
Callback(err: error.Exception)
}
Constructors
-
Callback(err: error.Exception)
scope函数的错误类型
pub type ScopeError {
StartErr(err: actor.StartError)
CallbackErr(err: Callback)
}
Constructors
-
StartErr(err: actor.StartError)进程启动失败
-
CallbackErr(err: Callback)回调函数异常
错误类型:
超时
pub type Timeout {
Timeout
}
Constructors
-
Timeout
Var
opaque包含可变值的通信道
要与可变值交互需要持有此类型
pub opaque type Var(var)
Values
pub fn assign(var: Var(var), val: var) -> var
赋值
赋值后返回新的值
操作可能超时,可以使用try_assign
如果想一直等待可以使用assign_forever
Example
use val <- var.scope(5, 1000)
assert var.read(val) == 5
assert var.assign(val, 10) == 10
assert var.read(val) == 10
pub fn is_destroyed(var: Var(var)) -> Bool
检查可变值是否被销毁
Notice
不要过度相信这个结果,因为值可能前脚还存活后脚就被销毁了
Example
该函数主要用在可变值疑似出逃的情景,例如可变值被其他进程持有,那么该进程在使用时可以进行防御性检查,例如:
// 假设进程 1 创建可变值并发送给了进程 2
// 进程 2 持有可变值并在使用时先进行检查
case var.is_destroy(val) {
// 值被销毁
True -> // ...
// 值未被销毁
False -> // ...
}
pub fn proc(
var: Var(var),
f: fn(var) -> var,
) -> Result(var, Callback)
使用回调函数对值进行处理,返回处理后的新值
若回调函数异常则保持原有值不变
Notice
该函数没有超时保护,它会一直等待,直至回调函数返回或异常
若回调函数卡住则会造成阻塞,导致其它操作超时
Return
Ok:回调函数正常结束返回的新的值
Error:回调函数异常返回的错误类型
Example
use val <- var.scope(5, 1000)
assert var.proc(val, fn(v) { { v + 1 } * 2 }) == Ok(12)
var.proc(val, fn(_) { panic }) // Error(..)
assert var.read(val) == 12
pub fn read(var: Var(var)) -> var
读取值
操作可能超时,可以使用try_read
如果想一直等待可以使用read_forever
Example
use val <- var.scope(5, 1000)
assert var.read(val) == 5
pub fn scope(
init_val: var,
time_out: Int,
scope_fn: fn(Var(var)) -> reason,
) -> Result(reason, ScopeError)
创建一个进程模拟可变值
可变值只在回调函数中可用,函数结束自动销毁
Notice
如果回调函数已经结束,但仍有进程在持有可变值则有引发异常的风险
例如如果在值销毁后仍有进程在持有可变值并尝试使用try_read函数读取,虽然进程已经终止但返回的依然是Error(Timeout)
Param
init_val:初始值
time_out:作为read和assign函数的操作超时上限(毫秒)
scope_fn:一个接受Var类型作为参数的回调函数,可在该函数内使用可变值
Return
Ok:回调函数正常结束返回的结果
Error:进程启动失败或回调函数异常返回的错误类型
Example
use val <- var.scope(5, 1000)
// ...