我需要从Rust函数中返回几个值。尝试声明一个返回数组的函数。
$ffi = FFI::cdef('float get_arr()[2];', './target/release/libphp_rust.dylib');
$array = $ffi->get_arr();
但出现了一个错误:PHP 致命错误: FFI\ParserException: 第 1 行不允许返回数组的函数在 /array.php 中:3
看起来 PHP FFI 不能直接使用数组。所以我找到了另一个解决方案。 我从 PHP 中创建了 C 数组,然后将指针传递给 Rust 代码,并使用 Rust 函数对其进行了填充:
$ffi = FFI::cdef('bool get_arr(float (*res)[2]);', './target/release/libphp_rust.dylib');
$array = $ffi->new('float[2]');
$result = $ffi->get_arr(FFI::addr($array));
if ($result) {
var_dump($array);
} else {
//... something went wrong
}
#[no_mangle]
pub extern fn get_arr(array_pointer: *mut [f32;2]) -> bool {
let res = unsafe {
assert!(!array_pointer.is_null());
&mut *array_pointer
};
res[0] = 0.1;
res[1] = 0.2;
return true;
}
这个解决方案看起来是正确的,但我对它有一些疑虑:
- 传递指针到FFI是否足够安全?以后可能会遇到什么问题?
- Rust数组是否完全兼容C,以便我能够直接通过索引为其赋值?
- 是否有更好的方法来实现我所需的功能?或者关于通过FFI传递复杂数据结构的最佳实践?
谢谢
let fat: *mut [f32] = array_pointer;
- zoryamba*mut [f32; 2]
强制转换为*mut [f32]
(一个 fat 指针),以便使用方法<*mut [T]>::as_uninit_slice_mut()
。出于某种原因,似乎 Rust 不会自动执行此操作。 - Coder-256