Disclaimer: Non ho mai usato prima Ruby-FFI; Sto andando su quello che posso trovare nella documentazione.
Secondo lo Ruby-FFI wiki page on types, :string
equivale a una stringa C con terminazione NUL. Questo è non lo stesso di un Rust String
. A String
in Rust è (attualmente) tre volte più grande!
Il tipo corrispondente in Ruggine sarebbe *const ::libc::c_char
. Di nota, c'è anche std::ffi::CString
, che è stato progettato per la creazione di stringhe C, e std::ffi::CStr
che è il tipo di wrapper sicuro che può essere creato da a CString
o *const c_char
. Notare che nessuno di questi è compatibile con *const c_char
!
In sintesi, per gestire le stringhe C in Rust, dovrete manipolare i tipi. Inoltre, tieni presente che, a seconda di ciò che stai effettivamente cercando di fare, potresti dover gestire anche la gestione manuale della memoria utilizzando libc::malloc
e libc::free
.
This answer to "Rust FFI C string handling" fornisce ulteriori dettagli su come gestire le stringhe C in Rust. Sebbene il contesto per la domanda si stia integrando con il codice C, dovrebbe essere ugualmente utile nel tuo caso.
fonte
2015-05-25 14:10:07
"Una stringa in ruggine è (attualmente) tre volte più grande!" è tecnicamente vero, nel senso che una stringa è un puntatore e due numeri interi e un 'char *' è un puntatore. Ma questo non significa che "lolfoobarthisisastring" sia tre volte più grande in Rust che in C. –
Grazie, la tua risposta mi ha indirizzato nella giusta direzione. Mi sono imbattuto in https://github.com/vrinek/ruby-rust-examples/tree/master/messages. Sebbene dovessi adattare l'esempio alla nuova versione ruggine, avrei potuto farlo funzionare. – xijo
Divertente nota a margine: la mia implementazione della ruggine è molto più lenta del mio puro rubino. Accidenti curva di apprendimento: D – xijo