Ruby 2.1.0 リファレンスマニュアル > ライブラリ一覧 > dl/importライブラリ > DL::Functionクラス > call
call(*arg) -> DL::CPtr | Integer | Float | nil
[permalink][rdoc]call(*arg) {|*v| ... } -> DL::CPtr | Integer | Float | nil
自身が表す関数を呼び、返り値を Ruby のオブジェクトに変換して返します。
返り値と引数は DL::Function.new で指定したものが使われます。 より詳しくいうと、
を用います。
引数の変換は以下の通りです。
nil ならば C の NULL に変換されます DL::CPtr は保持している C ポインタに変換されます。 適当に変換してから、C のポインタに変換します。 文字列であればその先頭ポインタになります。 IO オブジェクトであれば FILE* が渡されます。 整数であればそれがアドレスとみなされます。 どれでもなければ to_ptr を呼び出し DL::CPtr オブジェクトに 変換したのが用いられます。
Ruby の整数を C の整数に変換します。
Ruby の整数 or 浮動小数点数を C の浮動小数点数に変換します
返り値の変換は以下の通りです。
nil を返します
C の整数を Ruby の整数に変換します
C のポインタを保持した DL::CPtr を返します。
ブロックを与えた場合、引数の中に DL::Function オブジェクトが もしあれば与えられたブロックをバインドし、その後上と同じように関数を呼びます。 複数の DL::Function オブジェクトを引数に渡した場合は、前にある ほうにバインドされます。
例:
require 'dl/import' h = DL::Handle.new addr = h.sym('fread') cfunc = DL::CFunc.new(addr, DL::TYPE_INT) func = DL::Function.new(cfunc, [DL::TYPE_VOIDP, DL::TYPE_LONG, DL::TYPE_LONG, DL::TYPE_VOIDP]) io = File.open('s.txt') s = " " * 8 func.call(s, 4, 1, io) p s #=> "hoge "
例:
require 'dl/import' h = DL::Handle.new addr = h.sym('strdup') cfunc = DL::CFunc.new(addr, DL::TYPE_VOIDP) func = DL::Function.new(cfunc, [DL::TYPE_VOIDP]) s = 'abc' ptr = func.call(s) p ptr.to_s #=> "abc"