#ruby #safe-bindings #repl #bindings #mruby #reflection

mrusty

为 Rust 提供的 mruby 安全绑定。无需依赖即可定义和运行 Ruby。

21 个版本 (1 个稳定版)

使用旧的 Rust 2015

1.0.0 2016 年 12 月 19 日
0.5.1 2016 年 4 月 29 日
0.4.3 2016 年 4 月 26 日
0.3.2 2016 年 4 月 7 日
0.1.1 2016 年 2 月 27 日

#4 in #mruby

Download history 2/week @ 2024-05-17 1/week @ 2024-05-24 122/week @ 2024-07-26 14/week @ 2024-08-02

每月 136 次下载
用于 anima-engine

MPL-2.0 和可能 GPL

370KB
4.5K SLoC

Rust 4K SLoC // 0.0% comments Ruby 423 SLoC // 0.3% comments C 127 SLoC // 0.0% comments

mrusty. 为 Rust 提供的 mruby 安全绑定

[Build Status] (https://travis-ci.org/anima-engine/mrusty) [![Coverage Status] (https://coveralls.io/repos/github/anima-engine/mrusty/badge.svg?branch=master)] (https://coveralls.io/github/anima-engine/mrusty?branch=master) [] (https://crates.io/crates/mrusty)

mrusty 让您

  • 使用非常受限的 API 运行 Ruby 1.9 文件(无需安装 Ruby)
  • 在 mruby 中反射 Rust 的 structenum,并运行它们

它以安全且整洁的方式完成所有这些,同时还将规范测试和 REPL 带到桌面上。

文档

示例

一个非常简单的示例,它是一个将传递给 mruby 且可完美调用的 Container struct

// mrusty_class!
#[macro_use]
extern crate mrusty;

use mrusty::{Mruby, MrubyImpl};

let mruby = Mruby::new();

struct Cont {
    value: i32
}

// Cont should not flood the current namespace. We will add it with require.
mrusty_class!(Cont, "Container", {
    // Converts mruby types automatically & safely.
    def!("initialize", |v: i32| {
        Cont { value: v }
    });

    // Converts slf to Cont.
    def!("value", |mruby, slf: (&Cont)| {
        mruby.fixnum(slf.value)
    });
});

// Add file to the context, making it requirable.
mruby.def_file::<Cont>("cont");

// Add spec testing.
describe!(Cont, "
  context 'when containing 1' do
    it 'returns 1 when calling #value' do
      expect(Container.new(1).value).to eql 1
    end
  end
");

let result = mruby.run("
  require 'cont'

  Container.new(3).value
").unwrap(); // Returns Value.

println!("{}", result.to_i32().unwrap()); // Prints "3".

依赖项

~0–2.2MB
~26K SLoC