跳转到内容

调用参数和返回值

调用使用 CallArgsCallOptions。参数可以是 positional、named、 脚本拥有的值、runtime-managed VelaValue、serde snapshot,或调用作用域的 host handle。

普通复制值使用 with_value,直接宿主对象绑定使用 with_host_mutwith_host_ref

let output = runtime.call(
"main",
CallArgs::new()
.with_value("amount", 5_i64)
.with_host_mut("player", &mut player),
CallOptions::new(10_000, 1024 * 1024, 64),
)?;
fn main(player: Player, amount) {
player.level += amount;
return player.level;
}

with_host_ref 是只读 handle。with_host_mut 允许写入,但脚本在 VM 内拿到 的仍然只是 HostRef,不是 Rust &mut T

Runtime::call 返回 VelaValue,也就是 runtime-managed handle。宿主需要 脱离 runtime 的 Rust 值时再转换。

let value = runtime.call("score", CallArgs::new(), CallOptions::unbounded())?;
let score: i64 = runtime.from_value(&value)?;
let owned = runtime.value_to_owned(&value)?;

VelaValue 重新传回同一个 runtime,可以避免 materialize 成 OwnedValue

let snapshot = runtime.call("snapshot_state", CallArgs::new(), CallOptions::unbounded())?;
let projected = runtime.call(
"projected_score",
CallArgs::new().with_vela_value(snapshot).with(4_i64),
CallOptions::unbounded(),
)?;

使用 named arguments 时,参数名必须和入口签名匹配。Runtime-managed value 属于创建它的 runtime。Host object 必须先注册 schema,脚本代码才能 type-check 并访问它。