Я изучаю Rust примерно две недели и сегодня, я попал в его FFI. Я использовал Python для игры с Rust, используя ctypes и libc. Я передал целые числа, строки и даже научился передавать список целых чисел (благодаря этому замечательному ответу).
Затем я попытался передать список строк (следуя аргументам, лежащим в основе ответа), но я потерпел неудачу, так как я не мог понять, как это сделать. В Python у меня есть что-то вроде этого, чтобы передать массив строк.
def testRust():
lib = ctypes.cdll.LoadLibrary(rustLib)
list_to_send = ['blah', 'blah', 'blah', 'blah']
c_array = (ctypes.c_char_p * len(list_to_send))()
lib.get_strings(c_array, len(list_to_send))
В Rust я думал, что для сбора входящих строк должно быть что-то (например, STRING_RECEIVER
), но я не могу найти его.
#![feature(libc)]
extern crate libc;
use std::slice;
use libc::{size_t, STRING_RECEIVER};
#[no_mangle]
pub extern fn get_strings(array: *const STRING_RECEIVER, length: size_t) {
let values = unsafe { slice::from_raw_parts(array, length as usize) };
println!("{:?}", values);
}
Есть ли альтернативный способ достижения этого?