411 Stimmen

Wie kann man Rückrufe in einfachem Englisch erklären? Wie unterscheiden sie sich vom Aufruf einer Funktion aus einer anderen Funktion?

Wie kann man Rückrufe in einfachem Englisch erklären? Wie unterscheiden sie sich vom Aufruf einer Funktion aus einer anderen Funktion, die einen Kontext von der aufrufenden Funktion übernimmt? Wie kann ihre Leistungsfähigkeit einem unerfahrenen Programmierer erklärt werden?

4voto

tonylo Punkte 3220

Eine metaphorische Erklärung:

Ich habe ein Paket, das ich einem Freund zustellen lassen möchte, und ich möchte auch wissen, wann mein Freund es erhält.

Also bringe ich das Paket zur Post und bitte sie, es zuzustellen. Wenn ich wissen möchte, wann mein Freund das Paket erhält, habe ich zwei Möglichkeiten:

(a) Ich kann auf dem Postamt warten, bis es zugestellt wird.

(b) Ich erhalte eine E-Mail, wenn die Sendung zugestellt wird.

Option (b) ist analog zu einem Rückruf.

4voto

yunzen Punkte 31443

Ich denke, das ist recht einfach zu erklären.

Zunächst sind Rückrufe nur gewöhnliche Funktionen.
Außerdem rufen wir diese Funktion (nennen wir sie A) aus einer anderen Funktion (nennen wir sie B) heraus auf.

Der Zauber dabei ist, dass ich entscheide, die Funktion sollte von der Funktion aus aufgerufen werden außerhalb B.

Zu dem Zeitpunkt, an dem ich die Funktion B schreibe, weiß ich nicht, welche Callback-Funktion aufgerufen werden soll. Wenn ich die Funktion B aufrufe, sage ich dieser Funktion auch, dass sie die Funktion A aufrufen soll.

3voto

Ed Shelton Punkte 41

A callback function ist eine Funktion, die als Parameter an eine andere Funktion übergeben wird (& irgendwann verwendet wird).

Hier sind einige Funktionen:

def greeting(name):
    print("Hello " + name + "!")

def departing(name):
    print("Goodbye " + name + "!")

Hier ist eine Funktion (mit ourCallBack als Rückrufparameter):

def promptForName(ourCallback):
    myName = input("Enter Name:")
    ourCallback(myName)

Jetzt können wir einige Rückrufe verwenden!

promptForName(greeting) 
# Enter Name: 
# >Ed
# Hello Ed!

promptForName(departing) 
# Enter Name: 
# >Ed
# Goodbye Ed!

promptForName(greeting) 
# Enter Name: 
# >Guy
# Hello Guy!

Ich konnte meinen Code recht schnell erweitern.


Umgang mit (falschen und irreführenden) Antworten:

Rückrufe bedeuten nicht asynchron!

JS bekam Versprechen in ~2015 & async/await in ~2017. Davor wurden Callbacks verwendet.

Deshalb machen einige Antworten hier keinen Sinn, weil sie beides miteinander vermischen!

Sie werden oft für asynchronen Code verwendet, aber mein Beispiel ist synchron.

Rückrufe bedeuten nicht ereignisgesteuert!

Sie werden oft für die Ereignisbehandlung verwendet, aber mein Beispiel ist kein Ereignis.

Rückrufe sind nicht gleichbedeutend mit Abschlüssen!

Dies wird zwar oft als eleganter Abschluss verwendet, aber in meinem Beispiel ist das nicht der Fall.

Rückrufe sind nicht die vollständige Definition von First Class Functions!

Es ist eines von vielen Merkmalen, die die Definition von First Class Functions ausmachen.

C kann Funktionszeiger als Rückrufe verwenden, obwohl es keine First Class Functions gibt.

3voto

Optimist Punkte 367

Ein Callback ist eine Methode, die ausgeführt werden soll, wenn eine Bedingung erfüllt ist.

Ein Beispiel aus der "realen Welt" ist ein lokaler Videospielladen. Sie warten auf Half-Life 3. Anstatt jeden Tag in den Laden zu gehen, um zu sehen, ob das Spiel da ist, tragen Sie sich in eine E-Mail-Liste ein, um benachrichtigt zu werden, wenn das Spiel verfügbar ist. Die E-Mail wird zu Ihrem "Rückruf", und die Bedingung, die erfüllt sein muss, ist die Verfügbarkeit des Spiels.

Ein Beispiel für "Programmierer" ist eine Webseite, auf der Sie eine Aktion ausführen möchten, wenn eine Schaltfläche angeklickt wird. Sie registrieren eine Callback-Methode für eine Schaltfläche und fahren mit anderen Aufgaben fort. Wenn der Benutzer auf die Schaltfläche klickt, schaut der Browser in die Liste der Callbacks für dieses Ereignis und ruft Ihre Methode auf.

Ein Callback ist eine Möglichkeit, Ereignisse asynchron zu behandeln. Sie können nie wissen, wann der Rückruf ausgeführt wird, oder ob er überhaupt ausgeführt wird. Der Vorteil ist, dass Ihr Programm und Ihre CPU-Zyklen für andere Aufgaben frei werden, während Sie auf die Antwort warten.

3voto

Sachin Mhetre Punkte 4355

Was ist eine Callback-Funktion?

Die einfache Antwort auf diese erste Frage ist, dass eine Rückruf-Funktion eine Funktion ist, die über einen Funktionszeiger aufgerufen wird. Wenn Sie den Zeiger (die Adresse) einer Funktion als Argument an eine andere übergeben, und dieser Zeiger zum Aufruf der Funktion verwendet wird, auf die er zeigt, spricht man von einem Rückruf.

Callback-Funktionen sind schwer nachzuvollziehen, aber manchmal sind sie sehr nützlich. Vor allem, wenn Sie Bibliotheken entwerfen. Eine Callback-Funktion ist so, als würden Sie den Benutzer bitten, Ihnen einen Funktionsnamen zu geben, und Sie werden diese Funktion unter bestimmten Bedingungen aufrufen.

Sie schreiben zum Beispiel einen Callback-Timer. Sie können die Dauer und die aufzurufende Funktion angeben, und die Funktion wird entsprechend zurückgerufen. "MeineFunktion() alle 10 Sekunden für 5 Mal ausführen"

Oder Sie können ein Funktionsverzeichnis erstellen, indem Sie eine Liste von Funktionsnamen übergeben und die Bibliothek bitten, entsprechend zurückzurufen. "Callback success() bei Erfolg, Callback fail() bei Misserfolg."

Betrachten wir ein einfaches Beispiel für einen Funktionszeiger

void cbfunc()
{
     printf("called");
}

 int main ()
 {
                   /* function pointer */ 
      void (*callback)(void); 
                   /* point to your callback function */ 
      callback=(void *)cbfunc; 
                   /* perform callback */
      callback();
      return 0; 
}

Wie übergibt man ein Argument an eine Callback-Funktion?

Es wurde festgestellt, dass der Funktionszeiger zur Implementierung des Rückrufs einen void * aufnimmt, was bedeutet, dass er jeden Variablentyp einschließlich einer Struktur aufnehmen kann. Daher können Sie mehrere Argumente per Struktur übergeben.

typedef struct myst
{
     int a;
     char b[10];
}myst;

void cbfunc(myst *mt) 
{
     fprintf(stdout,"called %d %s.",mt->a,mt->b); 
}

int main() 
{
       /* func pointer */
    void (*callback)(void *);       //param
     myst m;
     m.a=10;
     strcpy(m.b,"123");       
     callback = (void*)cbfunc;    /* point to callback function */
     callback(&m);                /* perform callback and pass in the param */
     return 0;   
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X