var
Types
属于scope函数的错误类型
pub type ScopeError {
StartErr(err: actor.StartError)
ScopeErr(err: error.Exception)
}
Constructors
-
StartErr(err: actor.StartError)进程启动失败
-
ScopeErr(err: error.Exception)回调函数异常
subscribe函数返回的用于取消订阅的函数的返回值
pub opaque type Unsubscribed
属于update函数的错误类型
pub type UpdateError {
UpdateErr(err: error.Exception)
}
Constructors
-
UpdateErr(err: error.Exception)回调函数异常
Values
pub fn get(var: Var(var), timeout: Int) -> var
pub fn is_alive(var: Var(var)) -> Bool
检查可变值是否存活
Notice
同进程内scope回调结束进程已关闭,该值必然为False,scope回调内进程未关闭,该值必然为True
跨进程该值才有参考价值,但也仅供参考
pub fn scope(
val: var,
scope: fn(Var(var)) -> return,
) -> Result(return, ScopeError)
创建一个进程模拟可变值
可变值在回调函数中可用,回调结束自动关闭可变值进程
关闭是同步的,会等待所有消息处理完毕,回调函数结束后进程必然已关闭
Notice
如果回调已经结束,但仍有进程在持有可变值则有引发异常的风险
对于可变值出逃后的行为不作保障
let sub = process.new_subject()
// 将Var传到回调外部
// 随后回调结束,进程关闭
var.scope(5, fn(val) { process.send(sub, val) })
let val = process.receive_forever(sub)
// 进程已关闭,这里会产生异常
var.get(val, 1000)
Param
val:初始值
scope:一个接受可变值(Var)作为参数的函数
pub fn set(var: Var(var), timeout: Int, new_val: var) -> var
pub fn set_forever(var: Var(var), new_val: var) -> var
设置值并一直等待直至成功,随后返回新的值
Panic
进程关闭后使用该函数会导致异常
pub fn subscribe(
var: Var(var),
subscribe: fn(var, var) -> discard,
) -> fn() -> Unsubscribed
订阅函数发生异常一般不会有后果
该函数会为每个订阅spawn一个进程,如果订阅函数执行的较慢则会导致消息堆积
Notice
订阅函数只接收订阅后的值,不补发当前值
use val <- var.scope(5)
var.subscribe(val, fn(old, new) {
io.println(int.to_string(old) <> " -> " <> int.to_string(new))
var.set(val, 1000, new + 1)
})
var.set(val, 1000, 6)
Param
subscribe: 接收旧值和新值的订阅函数(subscribe(old_val, new_val))
Return
返回一个用于取消订阅的函数
pub fn try_set(
var: Var(var),
timeout: Int,
new_val: var,
) -> Result(var, Timeout)
尝试在指定时间内(毫秒)设置值,随后返回新的值
pub fn update(
var: Var(var),
update: fn(var) -> var,
) -> Result(var, UpdateError)
使用函数更新值,随后返回更新后的值
若函数异常则保持原有值不变
Notice
该函数没有超时保护,会一直等待直至回调函数返回或异常
如果回调函数卡住则会造成阻塞,导致其他操作超时
这么做会卡死
pub fn main() {
use val <- var.scope(5)
var.update(val, func(val, _))
}
fn func(val, v) {
var.update(val, func(val, _))
v + 1
}
Panic
进程关闭后使用该函数会导致异常