在本章中,我们将深入探讨如何使用 Rustler 库来实现在 Ruby 环境中调用 Rust 函数的需求。Rustler 是一个用于将 Rust 代码绑定到 Elixir 和 Erlang 的库,不过它的原理和方法同样适用于 Ruby。通过本章的学习,你将能够理解并实现基本的 Ruby 与 Rust 交互。
安装 Rustler
在开始之前,确保你的系统上已安装了 Rust 和 Cargo。如果你还没有安装,请访问 Rust 官方网站 下载并安装 Rust 工具链。
接下来,创建一个新的 Rust 项目:
cargo new hello_rust --lib
进入项目目录:
cd hello_rust
添加 Rustler 依赖到 Cargo.toml
文件中:
[dependencies] rustler = "0.26"
编写 Rust 代码
在 src/lib.rs
中,我们将定义一些简单的函数,这些函数稍后会在 Ruby 中被调用。这里我们定义一个简单的加法函数:
-- -------------------- ---- ------- ------------ ------ ----- -------- ------ ----- -------------- --- -------------- ----- --------- --- -------------------- ------------------------------------ -- -- -- -------- ---- ----- -------- -- ---- - --- --- -- - ----------------------- -- - -------------- -
这里的 rustler_export_nif!
宏用于导出 Rust 函数作为 NIFs(Native Implemented Functions),使它们能够在 Erlang/Elixir 中被调用。虽然我们主要关注 Ruby,但这个例子展示了如何定义这些函数。
设置 Ruby 绑定
Rustler 主要设计用于 Elixir 和 Erlang,但你可以通过类似的方法为 Ruby 创建绑定。首先,你需要为你的 Rust 库创建一个 Ruby 绑定。这通常涉及创建一个 C 语言层来调用 Rust 函数,然后通过 Ruby 扩展接口来暴露这些功能给 Ruby 代码。
由于直接使用 Rustler 来创建 Ruby 绑定并不常见,我们将采取一种间接的方法:使用 FFI(Foreign Function Interface)。
使用 FFI 调用 Rust 函数
首先,我们需要确保 Rust 库可以生成动态链接库(例如 .so 或 .dll)。在 Cargo.toml
中设置 crate-type
:
crate-type = ["cdylib"]
然后,重新构建项目:
cargo build --release
接下来,在 Ruby 中使用 FFI 来调用 Rust 函数。首先安装 ffi gem:
gem install ffi
创建一个 Ruby 文件(如 ruby_rust_integration.rb
)来加载 Rust 库,并调用 Rust 函数:
-- -------------------- ---- ------- ------- ----- ------ --------------- ------ ------------ ------- --------------------------------- ---------------------------- --------------- ----- ------ ------ ---- --- ---- ---------------------- -- - -- --
这里的关键在于正确地指定 Rust 库的位置以及正确的参数类型和返回类型。
小结
通过以上步骤,我们已经成功地在 Ruby 中调用了 Rust 函数。虽然 Rustler 直接支持 Ruby 的能力有限,但通过使用 FFI,我们可以灵活地集成两者。这种方法不仅适用于简单的示例,也可以扩展到更复杂的场景中去。
接下来,我们将在下一章中探索更复杂的数据结构交互,以及如何处理更复杂的错误情况。