You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rhai中Scope仅对直接调用函数可见?间接调用如何访问变量

Rhai中间接调用函数无法访问Scope变量的问题解决

你的理解存在部分偏差,同时大概率是调用方式的问题导致报错。

问题原因

Rhai中函数内部调用其他函数时,被调用函数的执行Scope会继承当前函数的Scope。也就是说:如果indirect能访问外部传入的Scope变量,那么direct在indirect内部被调用时,也应该能通过继承的Scope访问到该变量。报错的核心原因通常是你调用indirect时没有传入包含目标变量的Scope(比如用了engine.run而不是engine.call_fn传递Scope)。

解决办法

1. 统一使用带Scope的调用方式

确保调用indirect时,和调用direct一样,通过engine.call_fn传入包含变量的Scope。这样indirect的执行会基于传入的Scope,direct被间接调用时也能继承到该Scope的变量。

示例代码:
Rhai脚本

fn direct() {
    print("direct获取到var: " + var);
}

fn indirect() {
    print("indirect获取到var: " + var);
    direct();
}

Rust调用代码

use rhai::{Engine, Scope};

fn main() {
    let mut engine = Engine::new();
    let mut scope = Scope::new();
    // 向Scope中添加变量
    scope.push("var", "测试值");

    // 直接调用direct,正常访问
    engine.call_fn(&mut scope, "direct", ()).unwrap();

    // 调用indirect时传入同一个Scope,direct可间接访问变量
    engine.call_fn(&mut scope, "indirect", ()).unwrap();
}

2. 使用全局变量(适合无隔离需求的场景)

如果不需要对变量做Scope隔离,可以将变量设置为全局变量,这样无论直接还是间接调用函数,都能访问到:

// 在Rust中设置全局变量
engine.set_global_var("var", "全局测试值");

// 此时直接用engine.run调用也能正常执行
engine.run("indirect()").unwrap();

3. 显式传递变量(妥协方案)

如果不想依赖Scope继承,可以在indirect内部显式将变量传递给direct,这种方式更可控,也能满足需求:

fn direct(var_val) {
    print("direct获取到var: " + var_val);
}

fn indirect() {
    // 从当前Scope获取变量并传递给direct
    direct(var);
}

内容的提问来源于stack exchange,提问作者phimuemue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:20:56