7 个版本

使用旧的 Rust 2015

0.3.0 2017 年 10 月 18 日
0.2.0 2017 年 10 月 18 日
0.1.5 2017 年 10 月 17 日
0.1.3 2016 年 8 月 14 日
0.1.2 2016 年 5 月 17 日

#258 in FFI

每月 30 次下载
3 crates 中使用

MIT 许可证

5KB
72

plugger-ruby

Build Status Crates.io MIT licensed

直接将 Ruby 插件嵌入到您的 Rust 项目中!

需要 Rust 夜间构建版。

目的

此库的目的是尽可能简化在 Rust 项目中进行脚本编写。

库本身由两部分组成 - 一个 Ruby 虚拟机和语法扩展,它将您的 structimpl 转换为 Ruby 包装器,以便它们可以直接在 Ruby 中使用。

您应该能够简单地使用 #[pluggable] 注解类型,并在 Ruby 中直接使用它。

此库与其他库的不同之处在于,它允许您 共享 Rust 代码,而不是在 Rust 中编写 Ruby 对象。

功能

  • 创建 Ruby 虚拟机并 eval 评估 Ruby 代码
  • 从 Ruby 调用 Rust 对象的方法
  • 从 Ruby 访问公共 struct 字段
  • 通过 Ruby 创建新的 Rust 对象
  • 复杂的类型,例如枚举、元组
  • 自动将 Ruby 参数打包到 Rust 类型中
  • 自动将 Rust 返回类型打包到 Ruby 值中
  • 支持 Python

示例

注意:这里并非所有内容都受到支持。这主要是 Rust 和 Ruby 类型之间的自动强制转换。

查看 tools/ 以获取工作示例。

struct Vector3(pub f64, pub f64, pub f64);

#[pluggable]
struct Player
{
    name: String,

    health: f32,

    position: Vector3,
    rotation: Vector3,
}

#[pluggable]
impl Player
{
    pub fn revive(&mut self) { self.health = 1.0 }
    pub fn rename(&mut self, name: &str) { self.name = name.to_owned() }

    pub fn transport(&mut self, position: Vector3) { self.position = position; }
}

fn main() {
    let mut vm = Ruby::new();

    let player = Player { /* ... */ };
    vm.plug("main_player", player);

    vm.eval("main_player.revive").unwrap();
    vm.eval("main_player.rename('foo')").unwrap();
}

无运行时依赖