如何在RubyFFI中将结构指定为函数的返回值?

Mat*_*ira 4 ruby struct function return-type ffi

我必须加载几个从库本身返回结构的函数.

attach_function 'fn_name', [], # ... What do I put here?
Run Code Online (Sandbox Code Playgroud)

RubyFFI的Wiki页面似乎已经过时,所以我在这里有点迷失.

如何创建FFI::Struct,以及如何将其指定为本机函数的返回类型?

Vas*_*ich 8

class SOME_STRUCT < FFI::Struct 
    layout :a, :float, 
           :b, :float
end
Run Code Online (Sandbox Code Playgroud)

然后

attach_function 'fn_name', [], SOME_STRUCT
Run Code Online (Sandbox Code Playgroud)

如果是堆栈分配的结构:

typedef struct
{ 
    float a, b; 
} SOME_STRUCT;
Run Code Online (Sandbox Code Playgroud)

你应该用这个:

attach_function 'fn_name', [], SOME_STRUCT.by_value
Run Code Online (Sandbox Code Playgroud)

  • 从ffi-1.0(和JRuby 1.6.0)开始,如果函数返回对结构的引用,则使用SOME_STRUCT.by_ref作为返回类型 - 当您只使用SOME_STRUCT时,您将返回FFI :: Pointer而不是实例SOME_STRUCT.您也可以使用简写SOME_STRUCT.ptr和SOME_STRUCT.val - 无论哪个漂浮你的船. (4认同)