Tôi muốn sử dụng Fiddle để truy cập thư viện gốc được biên dịch từ mã Rust. Các đại diện C của struct là rất đơn giản, nó chỉ là một con trỏ và chiều dài:Có thể sử dụng Fiddle để chuyển hoặc trả về cấu trúc cho mã gốc không?
typedef struct {
char *data;
size_t len;
} my_thing_t;
// Example function that somehow accepts a struct
void accepts_a_struct(my_thing_t thing);
// Example function that somehow returns a struct
my_thing_t returns_a_struct(void);
Tuy nhiên, tất cả các ví dụ tôi có thể tìm thấy chấp nhận hoặc trả lại con trỏ đến cấu trúc, và không phải là cấu trúc chính mình. Tôi muốn tránh sự bỏ cặp đôi nếu có thể.
Tôi đã mượn ví dụ từ Fiddle::Importer
documentation. Tuy nhiên, tôi không thấy làm thế nào để đúng cách gọi phương thức extern
với một cấu trúc thay vì một con trỏ đến một cấu trúc:
require 'fiddle'
require 'fiddle/import'
module LibSum
extend Fiddle::Importer
dlload './libsum.so'
extern 'double sum(double*, int)'
extern 'double split(double)'
end
Note
Fiddle là không giống như FFI gem. Fiddle là một thành phần của thư viện chuẩn của Ruby, và không được cung cấp như một viên ngọc riêng biệt. Những câu hỏi liên quan tham khảo các viên ngọc FFI, và không thay vì chỉ violong:
- How to wrap function in Ruby FFI method that takes struct as argument?
- How do I specify a struct as the return value of a function in RubyFFI?
Câu hỏi thú vị, nhưng tôi nghi ngờ có thể là FFI (Fiddle là trình bao bọc) dường như không hỗ trợ trực tiếp cấu trúc truyền, xem phần "Đối số chức năng và giá trị trả về" của [tài liệu này] (http: // fistfvck .sakura.ne.jp/ruby / rurima-2.1.0/library/fiddle.html) (tiếng Nhật, tôi đã đọc bản dịch của google) và nếu bạn mong đợi một số hiệu suất tăng bạn sẽ rất khó có được bất kỳ điều gì đáng kể - các biến của ruby là con trỏ đến cấu trúc với một dữ liệu ('RBasic' và các lớp con), hoặc thậm chí một con trỏ khác từ đó đến dữ liệu thực tế trong heap. –
Ngoài ra, danh sách các loại được hỗ trợ trong chữ ký chức năng có thể được lấy từ ['parse_ctype'] (https://github.com/ruby/ruby/blob/c8b3f1b470e343e7408ab5883f046b1056d94ccc/ext/fiddle/lib/fiddle/cparser.rb#L120) chức năng. –