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
相关产品推荐
相关产品推荐

