1个不稳定版本

使用旧的Rust 2015

0.3.0 2017年10月18日

#2337Rust模式

MIT 许可证

30KB
581 代码行

plugger-ruby

Build Status Crates.io MIT licensed

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

需要Rust nightly。

目的

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

该库本身由两部分组成 - 一个Ruby VM和一个语法扩展,它创建Ruby包装器来覆盖你的structimpl,以便可以直接从Ruby中使用。

应该可以通过简单地给类型添加#[pluggable]注解,然后直接从Ruby中使用它。

该库与其他库的区别在于,它允许你共享Rust代码,而不是在Rust中编写Ruby对象。

功能

  • 创建Ruby VM和评估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();
}

依赖关系

~20KB