153
163

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

コールバック関数とは

Posted at

■ コールバック関数とは

他の関数に引数として渡す関数のこと。

下記サイトのC言語の例が分かりやすい。
関数ポインタにコールバック関数を代入し、引数として渡している。

#include<stdio.h>
typedef void (* FUNC_POINTER)(char *); 

// コーバック関数1
void callback1(char *s){
    printf("%s\n",s);
}

// コールバック関数2
void callback2(char *s){
    printf("[");
    printf("%s",s);
    printf("].\n");
}

// コールバック関数を呼び出す関数
void func(char *s,FUNC_POINTER p){
    // コールバック関数を呼び出す
    p(s);
}

int main(){
    FUNC_POINTER p;

    p = callback1;
    // コールバック関数1を呼び出す
    func("コーバック関数1",p);

    p = callback2;
    // コールバック関数2を呼び出す
    func("コーバック関数2",p);
    return 0;
}

実行結果。

コーバック関数1
[コーバック関数2].

■ Pythonの例

pythonでのコールバック関数の使用例。
コールバック関数を呼び出す関数はhandlerと記述されることが多いらしい↓

def handler(func,*args):
    return func(*args)

流れとしては、

  1. ハンドラーを定義
  2. コールバック関数を定義
  3. 関数ポインタにコールバック関数を代入
  4. 関数ポインタをハンドラーの引数として渡す
# -*- coding: utf-8 -*-
def handler(func,*args):
    return func(*args)

def callback1(message1):
    print("%s" % message1)

def callback2(message1, message2):
    print("%s, %s" % ( message1, message2) )

# main
if __name__ == "__main__":

   # コールバック関数の代入
   call = callback1
   # ハンドラーの実行 : コールバック関数の呼び出し
   handler(call, "message1")

   # コールバック関数の代入
   call = callback2
   # ハンドラーの実行 : コールバック関数の呼び出し
   handler(call, "message1", "message2")

実行結果。

message1
message1, message2

■ クラスを使う

関数ポインタの役割をする変数をクラス内のメンバ"func"に持たせているが、基本的にやってることは同じ。

  1. ハンドラーとして機能するクラスを定義
  2. 関数ポインタとして扱うメンバを定義
  3. ハンドラーとして機能するメソッドを定義
  4. コールバック関数を定義
  5. 関数ポインタにコールバック関数を代入
  6. 関数ポインタをハンドラーの引数として渡す
# -*- coding: utf-8 -*-
class Callbacker():
    def __init__(self, func):
        self.func = func

    def handler(self, *args):
        self.func(*args)

def callback1(message1):
    print '%s' % message1

def callback2(message1, message2):
    print("%s, %s" % ( message1, message2) )

# main
if __name__ == "__main__":

    # コールバック関数の代入
    callback = Callbacker(callback1)
    print (type(callback.func))
    print ("callback.func "),
    print (callback.func)
    print ("callback1     "),
    print (callback1)
    # ハンドラーの実行 : コールバック関数の呼び出し
    callback.handler("message1")
    print ("")

    # コールバック関数の代入
    callback.func = callback2
    print (type(callback.func))
    print ("callback.func "),
    print (callback.func)
    print ("callback2     "),
    print (callback2)
    # ハンドラーの実行 : コールバック関数の呼び出し
    callback.handler("message1", "message2")

実行結果

<type 'function'>
callback.func  <function callback1 at 0x7fcff9c8a9b0>
callback1      <function callback1 at 0x7fcff9c8a9b0>
message1

<type 'function'>
callback.func  <function callback2 at 0x7fcff9c8ab18>
callback2      <function callback2 at 0x7fcff9c8ab18>
message1, message2

■ まとめ

コールバック関数とは他の関数に引数として渡す関数のこと。

基本は、

  1. ハンドラーを定義
  2. コールバック関数を定義
  3. 関数ポインタにコールバック関数を代入
  4. 関数ポインタをハンドラーの引数として渡す
153
163
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
153
163

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?