Rust 的 Ruby 绑定。在 Rust 中编写 Ruby 扩展 gem,或从 Rust 调用 Ruby。
Rust 的高级 Ruby 绑定。在 Rust 中编写 Ruby 扩展 gem,或调用 来自 Rust 二进制文件的 Ruby 代码。 [API 文档] | GitHub | crates.io [开始使用] | [类型转换] | [安全性] | [兼容性]
使用 Magnus, 可以将常规的 Rust 函数绑定为 Ruby 中的方法
自动类型转换。调用者传递错误的参数或不兼容的参数时
类型将得到与它们所用的相同类型的 ArgumentError 或 TypeError
从 Ruby 的内置方法来看。
定义函数(没有 Ruby self 参数):
fn fib(n: usize) -> usize {
match n {
0 => 0,
1 | 2 => 1,
_ => fib(n - 1) + fib(n - 2),
}
}
#[magnus::init]
fn init(ruby: &magnus::Ruby) -> Result {
ruby.define_global_function("fib", magnus::function!(fib, 1));
Ok(())
}定义一个方法(带有 Ruby self 参数):
fn is_blank(rb_self: String) -> bool {
!rb_self.contains(|c: char| !c.is_whitespace())
}
#[magnus::init]
fn init(ruby: &magnus::Ruby) -> Result {
// returns the existing class if already defined
let class = ruby.define_class("String", ruby.class_object())?;
// 0 as self doesn't count against the number of arguments
class.define_method("blank?", magnus::method!(is_blank, 0))?;
Ok(())
}一些 Ruby 方法在 Ruby 的 C API 中有直接对应,因此也在 Magnus 中有对应。Ruby 的 Object#frozen? 方法可用为 magnus::ReprValue::check_frozen,或者 Array#[] 变为 magnus::RArray::aref。仅在 Ruby 中定义的其他 Ruby 方法必须使用 magnus::ReprValue::funcall 来调用。所有 Magnus 的 Ruby 封装类型都实现了 ReprValue 特性,因此可以在所有类型上使用 funcall。
暂无开放 Issues,或尚未同步最近议题。