class Fiddle::Closure::BlockCaller

要約

Ruby のブロックをラップしたコールバック関数を表すクラスです。

Ruby のブロックを C の関数ポインタとして表現するためのクラスです。

require 'fiddle'
include Fiddle

libc = Fiddle.dlopen("/lib/libc.so.6")
qs = Fiddle::Function.new(libc["qsort"],
                          [TYPE_VOIDP, TYPE_INT, TYPE_INT, TYPE_VOIDP],
                          TYPE_VOID)
compare = Fiddle::Closure::BlockCaller.new(TYPE_INT, [TYPE_VOIDP, TYPE_VOIDP]){|x, y|
  # qsort の比較関数は 型が int(*)(void*, void*) であるため、
  # このブロックには DL::CPtr オブジェクトが渡される。
  # そのポインタが指す先は比較している文字なので、
  # DL::CPtr#to_s で1文字の文字列に変換している
  x.to_s(1) <=> y.to_s(1)
}
s = "7x0cba(Uq)"
qs.call(s, s.size, 1, compare)
p s # =>  "()07Uabcqx"

目次

特異メソッド
インスタンスメソッド

継承しているメソッド

Fiddle::Closureから継承しているメソッド

特異メソッド

new(ret, args, abi=Fiddle::Function::DEFAULT) { ... } -> Fiddle::BlockClosure[permalink][rdoc]

Ruby のブロックを呼び出す Fiddle::Closure オブジェクトを返します。

args、ret で関数の引数と返り値の型を指定します。指定は Fiddle::Function.new と同様なので、そちらを参照してください。

[PARAM] ret:
返り値の型
[PARAM] args:
引数の型を表す配列
[PARAM] abi:
呼出規約

インスタンスメソッド

call(*args) -> object[permalink][rdoc]

wrap しているブロックを呼び出します。

そのブロックの返り値がこのメソッドの返り値となります。

[PARAM] args:
引数