Frage

Ich habe noch nie verschachtelte Funktionen verwendet, aber haben Verweise auf sie in mehreren Sprachen (wie auch verschachtelte Klassen, die ich davon ausgehen, beziehen) zu sehen.

  • Was für eine verschachtelte Funktion ist?
  • Warum?!?
  • Was können Sie mit einer verschachtelten Funktion zu tun, dass Sie jede andere Art und Weise nicht tun können?
  • Was können Sie mit einer verschachtelten Funktion tun dies schwierig oder unelegant ohne verschachtelte Funktionen?

Ich gehe davon aus verschachtelten Funktionen sind einfach ein Artefakt alles als ein Objekt der Behandlung, und wenn Objekte andere Objekte enthalten können dann folgt.

Sie verschachtelte Funktionen Umfang haben (in der Regel nehme ich an Sprachen auf diesen unterscheiden) nur als Variablen in dem Funktionsbereich haben?

Bitte fügen Sie die Sprache, die Sie verweisen, wenn Sie nicht sicher sind, dass Ihre Antwort ist sprachunabhängig.

-Adam

War es hilfreich?

Lösung

Eine beliebte Verwendung von verschachtelten Funktionen ist Schließungen . In einer lexikalisch Sprache mit erstklassigen Funktionen scoped es ist mögliche Funktionen zu verwenden, um Daten zu speichern. Ein einfaches Beispiel in Schema ist ein Zähler:

(define (make-counter)
  (let ((count 0))                ; used to store the count
    (define (counter)             ; this is the counter we're creating
      (set! count (+ count 1))    ; increment the count
      count)                      ; return the new count
    counter))                     ; return the new counter function

(define mycounter (make-counter)) ; create a counter called mycounter

(mycounter)                       ; returns 1

(mycounter)                       ; returns 2

In diesem Beispiel haben wir Nest der Funktionszähler innerhalb der Funktion Make-Zähler, und durch diese interne Funktion zurückkehren können wir auf die Daten zugreifen zur Verfügung zu begegnen, wenn sie definiert wurde. Diese Informationen sind für diese Instanz von mycounter privat - wenn wir einen anderen Zähler zu schaffen, wäre es eine andere Stelle verwenden, um die interne Zählung zu speichern. Fortsetzung aus dem vorherigen Beispiel:

(define mycounter2 (make-counter))

(mycounter2)                      ; returns 1

(mycounter)                       ; returns 3

Andere Tipps

Es ist nützlich für die Rekursion, wenn es nur 1 Methode ist, dass es jemals rufen

string[] GetFiles(string path)
{
  void NestedGetFiles(string path, List<string> result)
  {
    result.AddRange( files in the current path);
    foreach(string subPath in FoldersInTheCurrentPath)
      NestedGetFiles(subPath, result);
  }

   List<string> result = new List<string>();
   NestedGetFiles(path, result);
   return result.ToArray();
}

Der obige Code ist vollständig aus, sondern auf C # basiert die Idee davon zu geben, was ich meine. Die einzige Methode, die NestedGetFiles nennen kann, ist die Methode GetFiles.

Eine verschachtelte Funktion ist nur eine Funktion innerhalb einer anderen Funktion.

Ja, es ist ein Ergebnis der alles ein Objekt zu sein. Da Sie nur haben können Variablen sichtbar in den Anwendungsbereich der Funktion und Variablen Funktionen zeigen können, können Sie eine Funktion haben, die durch eine lokale Variable verwiesen wird.

Ich glaube nicht, dass es etwas gibt, dass Sie mit einer verschachtelten Funktion tun können, die Sie absolut nicht verzichten konnten. Ein großer Teil der Zeit ist es sinnvoll, wenn. Und zwar immer dann, wenn eine Funktion ist eine „Unterfunktion“ einer anderen Funktion.

Ein gemeinsamer Anwendungsfall für mich ist, wenn eine Funktion eine Menge komplizierter Logik führt aber, was die Funktion berechnet / Returns ist einfach zu abstrakt für alle Fälle von der Logik diktiert wird.

(C #): Ich verwende, dass das Objekt Browser-Ansicht zu vereinfachen, und meine Klassen besser zu strukturieren. Als Klasse Rad in Truck-Klasse verschachtelt.

Vergessen Sie nicht, dieses Detail: „Nested-Typen können private und geschützte Member des enthaltenden Typs zuzugreifen, einschließlich aller geerbten privaten oder geschützten Mitglieder.“

Verschachtelte Funktionen können Sie Code kapseln, die nur relevant für das Innenleben einer Funktion innerhalb dieser Funktion ist, und ermöglicht gleichzeitig zur besseren Lesbarkeit oder Verallgemeinerung, dass Code aus zu trennen. In einigen Implementierungen ermöglichen sie auch den Zugang zu den äußeren Rahmen. In D:

int doStuff() {
    int result;
    void cleanUpReturn() {
        myResource1.release();
        myResource2.release();
        return result * 2 + 1;
    }

    auto myResource1 = getSomeResource();
    auto myResource2 = getSomeOtherResource();
    if(someCondition) {
        return cleanUpReturn();
    } else {
        doSomeOtherStuff();
        return cleanUpReturn();
    }
}

Natürlich, in diesem Fall dies auch mit RAII behandelt werden könnte, aber es ist nur ein einfaches Beispiel.

Sie können auch nützlich sein, wenn Sie eine Funktion an eine andere Funktion als Argument übergeben müssen. Sie können auch zur Herstellung von Werksfunktionen für die Fabrik Funktionen nützlich sein (in Python):

>>> def GetIntMaker(x):
...   def GetInt():
...     return x
...   return GetInt
... 
>>> GetInt = GetIntMaker(1)
>>> GetInt()
1

Eine verschachtelte Funktion ist einfach eine Funktion innerhalb des Körpers einer anderen Funktion definiert. Warum? Über den einzigen Grund, warum ich von aus der Spitze von meinem Kopf denken könnte, ist ein Helfer oder Nutzenfunktion.

Dies ist ein konstruiertes Beispiel, aber Geduld mit mir. ein Objekt mit Werten aus einer der Abfragen Angenommen, Sie eine Funktion hatte, die auf den Ergebnissen zwei Abfragen zu handeln hatte und füllen. Man könnte so etwas wie die folgenden tun.

function process(qryResult q1, qryResult q2) {

   object o;
   if (q1.someprop == "useme") {
       o.prop1 = q1.prop1;
       o.prop2 = q1.prop2;
       o.prop3 = q1.prop3;
   } else if (q2.someprop == "useme") {
       o.prop1 = q2.prop1;
       o.prop2 = q2.prop2;
       o.prop3 = q2.prop3;
   }

   return o;

}

Wenn Sie 20 Eigenschaften haben, sind Sie den Code zu duplizieren das Objekt über setzen und über zu einer riesigen Funktion führt. Sie könnten eine einfache verschachtelte Funktion zu tun, um die Kopie der Objekte aus der Abfrage zu dem Objekt hinzufügen. Wie folgt aus:

function process(qryResult q1, qryResult q2) {

   object o;
   if (q1.someprop == "useme") {
       fillObject(o,q1);
   } else if (q2.someprop == "useme") {
       fillObject(o,q2);
   }

   return o;

   function fillObject(object o, qryResult q) {
       o.prop1 = q.prop1;
       o.prop2 = q.prop2;
       o.prop3 = q.prop3;
   }


}

Es hält die Dinge ein wenig sauberer. Hat es eine verschachtelte Funktion sein? Nein, aber Sie können es auf diese Art und Weise zu tun, wenn die Prozessfunktion das einzige ist, die diese Kopie zu tun haben würden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top