Sto provando a passare una stringa in Ruby a un eseguibile ruggine, a manipolarlo e a passare la stringa manipolata indietro.Stringa di rubino per arrugginire e tornare indietro
Finora riesco a passare la stringa e restituirla, ma non riesco a capire come convertirla in una stringa di ruggine, manipolarla e poi restituirla a ruby. Ecco quello che ho finora:
// lib.rs
use std::ffi::CStr;
#[no_mangle]
pub extern fn return_string(test_str: &CStr) -> &CStr {
// working funciton
test_str
}
#[no_mangle]
pub extern fn manipulate_and_return_string(mystr: &CStr) -> &CStr {
// mystr type == &std::ffi::c_str::CStr
// println!("{:?}", mystr); => std::ffi::c_str::CStr` cannot be formatted using `:?`
let cstr = mystr.to_bytes_with_nul();
// println!("{:?}", mystr); => []
// cstr type == &[u8]
let ptr = cstr.as_ptr();
// ptr type == *const u8
// println!("{:?}", mystr); => 0x7fd898edb520
let str_slice: &str = std::str::from_utf8(cstr).unwrap();
// str type == &str
// println!("{:?}", mystr); => ""
let str_buf: String = str_slice.to_owned();
// str_bug == collections::string::String
// println!("{:?}", mystr); => ""
}
# rust.rb
require 'ffi'
module Rust
extend FFI::Library
ffi_lib './bin/libembed.dylib'
attach_function :return_string, [:string], :string
attach_function :manipulate_and_return_string, [:string], :string
end
commento rapida: ci sono due problemi immediati con questo. Innanzitutto, 'CStr' ** non è un tipo FFI-safe ** e non dovrebbe essere usato in questo modo. Dovresti usare '* const libc :: c_char'. In secondo luogo, la risposta dipende interamente da chi, esattamente, possiede la stringa risultante. Ruby lo gestisce? Se é cosi, come? Su quale heap deve essere assegnato? Rust lo possiede ancora? In tal caso, come si fornisce una funzione di pulizia? Tutto quello che posso raccomandare è di scoprire come farlo in C, quindi fallo in questo modo in Rust. –
Guarda anche http://stackoverflow.com/q/30510764/155423, poiché copre tutte le parti importanti. Adattarlo a Ruby è facile a quel punto. – Shepmaster
http://clalance.blogspot.ca/2011/01/writing-ruby-extensions-in-c-part-8.html sarà utile, così come sarà https://github.com/ruby/ruby/blob /trunk/doc/extension.rdoc –