gpt4 book ai didi

无法将字符串从 Ruby 传递到我的 Rust 函数中

转载 作者:太空宇宙 更新时间:2023-11-03 17:46:49 25 4
gpt4 key购买 nike

我正在尝试调用一个接受字符串的函数,该函数是用 Rust 编写的。

然后 Rust 代码被编译为 C 并通过 FFI gem 包含在我的 Ruby 代码中。

当我调用 Rust 函数并传递一个字符串时,我什么也没得到。

防 rust 代码:

#[no_mangle]
pub extern fn speak(words: &str) {
println!("{}", words);
}

ruby 代码:

require 'ffi'

module Human
extend FFI::Library
ffi_lib '../target/release/libruby_and.dylib'
attach_function :speak, [:string], :void
end

Human.speak("Hello, we are passing in an argument to our C function!!")

最佳答案

根据documentation , :string 表示一个以null结尾的字符串,在C中是char *&str参数不等同于那个类型:a &str是一个复合值,由指针和长度组成。

最安全的解决方案是更改 Rust 函数以接受 *const c_char。然后您可以使用 CStr::from_ptrCStr::to_str更轻松地使用它。

或者,您可以在 Ruby 代码中定义一个包含指针和长度的结构,并将其传递给 Rust 函数。然而,不能保证这个结构总是匹配切片的内存布局,所以为了 100% 安全,你应该在你的 Rust 代码中定义等效的结构(使用 #[repr(C)]), 然后,使用这个结构的字段,调用 slice::from_raw_parts构造一个切片(&c_char&u8),然后您可以使用 str::from_utf8 将其转换为 &str .

关于无法将字符串从 Ruby 传递到我的 Rust 函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34937161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com