Tôi đang cố truyền một chuỗi trong Ruby thành một tệp thực thi rỉ sét, thao tác nó và chuyển chuỗi thao tác trở lại.Chuỗi Ruby bị rỉ sét và trở lại lần nữa
Cho đến nay tôi có thể chuyển chuỗi vào và gửi lại nhưng tôi không biết cách chuyển đổi thành chuỗi gỉ, thao tác và sau đó chuyển nó trở lại ruby. Dưới đây là những gì tôi có cho đến nay:
// 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
bình luận nhanh: có hai vấn đề ngay lập tức với điều này. Thứ nhất, 'CStr' ** không phải là loại an toàn FFI ** và không nên được sử dụng như thế này. Bạn nên sử dụng '* const libc :: c_char'. Thứ hai, câu trả lời phụ thuộc hoàn toàn vào ai, chính xác, sở hữu chuỗi kết quả. Ruby có quản lý nó không? Nếu vậy, làm thế nào? Heap nào cần phải được cấp phát? Rust có còn sở hữu nó không? Nếu vậy, làm thế nào để bạn cung cấp một chức năng dọn dẹp? Tất cả những gì tôi có thể đề nghị là tìm hiểu cách làm điều này trong C, sau đó chỉ cần làm theo cách đó trong Rust. –
Ngoài ra, hãy xem http://stackoverflow.com/q/30510764/155423 vì nó bao gồm tất cả các phần quan trọng. Việc thích ứng với Ruby thật dễ dàng tại thời điểm đó. – Shepmaster
http://clalance.blogspot.ca/2011/01/writing-ruby-extensions-in-c-part-8.html sẽ hữu ích, vì sẽ là https://github.com/ruby/ruby/blob /trunk/doc/extension.rdoc –