1个稳定版本
2.0.0 | 2024年2月14日 |
---|
#10 in #scripting-engine
在 spo-rhai 中使用
250KB
6.5K SLoC
插件进程宏
这个crate包含用于代码生成的进程宏,支持Rhai的插件系统。
此crate由Rhai crate自动引用。通常不应直接使用。
lib.rs
:
这个crate包含进程宏,使得创建Rhai插件模块更加容易。
将整个Rust模块导出到Rhai Module
use rhai::{EvalAltResult, FLOAT};
use rhai::plugin::*;
use rhai::module_resolvers::*;
#[export_module]
mod advanced_math {
pub const MYSTIC_NUMBER: FLOAT = 42.0;
pub fn euclidean_distance(x1: FLOAT, y1: FLOAT, x2: FLOAT, y2: FLOAT) -> FLOAT {
((y2 - y1).abs().powf(2.0) + (x2 -x1).abs().powf(2.0)).sqrt()
}
}
let mut engine = Engine::new();
let m = exported_module!(advanced_math);
let mut r = StaticModuleResolver::new();
r.insert("Math::Advanced", m);
engine.set_module_resolver(r);
assert_eq!(engine.eval::<FLOAT>(
r#"
import "Math::Advanced" as math;
math::euclidean_distance(0.0, 1.0, 0.0, math::MYSTIC_NUMBER)
"#)?, 41.0);
将Rust函数注册到Rhai Module
use rhai::{EvalAltResult, FLOAT, Module};
use rhai::plugin::*;
use rhai::module_resolvers::*;
#[export_fn]
fn distance_function(x1: FLOAT, y1: FLOAT, x2: FLOAT, y2: FLOAT) -> FLOAT {
((y2 - y1).abs().powf(2.0) + (x2 -x1).abs().powf(2.0)).sqrt()
}
let mut engine = Engine::new();
engine.register_fn("get_mystic_number", || 42.0 as FLOAT);
let mut m = Module::new();
set_exported_fn!(m, "euclidean_distance", distance_function);
let mut r = StaticModuleResolver::new();
r.insert("Math::Advanced", m);
engine.set_module_resolver(r);
assert_eq!(engine.eval::<FLOAT>(
r#"
import "Math::Advanced" as math;
math::euclidean_distance(0.0, 1.0, 0.0, get_mystic_number())
"#)?, 41.0);
将插件函数注册到Engine
use rhai::{EvalAltResult, FLOAT, Module};
use rhai::plugin::*;
use rhai::module_resolvers::*;
#[export_fn]
pub fn distance_function(x1: FLOAT, y1: FLOAT, x2: FLOAT, y2: FLOAT) -> FLOAT {
((y2 - y1).abs().powf(2.0) + (x2 -x1).abs().powf(2.0)).sqrt()
}
let mut engine = Engine::new();
engine.register_fn("get_mystic_number", || { 42 as FLOAT });
register_exported_fn!(engine, "euclidean_distance", distance_function);
assert_eq!(engine.eval::<FLOAT>(
"euclidean_distance(0.0, 1.0, 0.0, get_mystic_number())"
)?, 41.0);
依赖
~275–720KB
~17K SLoC