2013-05-31 70 views
3

我有這些的(有點過高)編號:如何在Ruby FFI模塊中打包C常量?

extern TCODLIB_API const TCOD_color_t TCOD_red; 
extern TCODLIB_API const TCOD_color_t TCOD_flame; 
extern TCODLIB_API const TCOD_color_t TCOD_orange; 
extern TCODLIB_API const TCOD_color_t TCOD_amber; 
extern TCODLIB_API const TCOD_color_t TCOD_yellow; 
extern TCODLIB_API const TCOD_color_t TCOD_lime; 

我怎樣才能在價值觀上的Ruby端得好嗎?這感覺就像應該有一個attach_const相當於attach_function,如下使用:

module TCOD 
    extend FFI::Library 
    ffi_lib File.join(APP_ROOT, "libtcod-1.5.1/libtcod.so") 
    attach_function :color_RGB, 'TCOD_color_RGB', [:uchar, :uchar, :uchar], Color.val 
end 

我不希望有重新定義一切從lightest_sepia到desa​​turated_chartreuse如果可能的話...

回答

3

有,attach_variable是你在找什麼。

這將適用於任何實際上是全局變量(看起來是你的情況),但如果常量只是#define宏,則不適用。

引述FFI::Library documentation的例子:

module Bar 
    extend FFI::Library 
    ffi_lib 'my_lib' 
    attach_variable :c_myvar, :myvar, :long 
end 
# now callable via Bar.c_myvar 

和:

module Bar 
    extend FFI::Library 
    ffi_lib 'my_lib' 
    attach_variable :myvar, :long 
end 
# now callable via Bar.myvar 
+0

給代碼示例,請。 –

+0

@BorisStitnicky:完成。 – Ashe

+0

遺憾的是,#define常量也沒有解決方案,但是這有助於:D –