[{"@context":"http:\/\/schema.org\/","@type":"BlogPosting","@id":"https:\/\/wiki.edu.vn\/all2fr\/wiki1\/cloture-fonction-wikipedia\/#BlogPosting","mainEntityOfPage":"https:\/\/wiki.edu.vn\/all2fr\/wiki1\/cloture-fonction-wikipedia\/","headline":"Cl\u00f4ture (fonction) – Wikipedia","name":"Cl\u00f4ture (fonction) – Wikipedia","description":"before-content-x4 Un Fermeture (ou Ach\u00e8vement fonctionnel ) est un concept de la programmation fonctionnelle. Il d\u00e9crit une fonction qui contient","datePublished":"2022-04-06","dateModified":"2022-04-06","author":{"@type":"Person","@id":"https:\/\/wiki.edu.vn\/all2fr\/wiki1\/author\/lordneo\/#Person","name":"lordneo","url":"https:\/\/wiki.edu.vn\/all2fr\/wiki1\/author\/lordneo\/","image":{"@type":"ImageObject","@id":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","height":96,"width":96}},"publisher":{"@type":"Organization","name":"Enzyklop\u00e4die","logo":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":600,"height":60}},"image":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":100,"height":100},"url":"https:\/\/wiki.edu.vn\/all2fr\/wiki1\/cloture-fonction-wikipedia\/","wordCount":12989,"articleBody":" (adsbygoogle = window.adsbygoogle || []).push({});before-content-x4Un Fermeture (ou Ach\u00e8vement fonctionnel ) est un concept de la programmation fonctionnelle. Il d\u00e9crit une fonction qui contient acc\u00e8s \u00e0 votre contexte de cr\u00e9ation. Lors de l’appel, la fonction acc\u00e8de ensuite \u00e0 ce contexte de cr\u00e9ation. Ce contexte (zone de m\u00e9moire, condition) ne peut pas \u00eatre r\u00e9f\u00e9renc\u00e9 en dehors de la fonction, c’est-\u00e0-dire H. invisible. Une fermeture contient une r\u00e9f\u00e9rence \u00e0 la fonction et \u00e0 la partie du contexte de cr\u00e9ation qu’il utilise – la fonction et la structure de m\u00e9moire associ\u00e9e sont inextricablement termin\u00e9es dans une r\u00e9f\u00e9rence (terme ferm\u00e9). Il est comparable \u00e0 un objet avec des attributs et des m\u00e9thodes: il contient une identit\u00e9, une condition et un comportement implicites. Dans la syntaxe du langage de programmation, cela est souvent r\u00e9alis\u00e9 par deux fonctions imbriqu\u00e9es – la fonction principale interne est enferm\u00e9e (termin\u00e9e) d’une autre fonction. Cette fonction finale contient la structure de m\u00e9moire requise (voir les exemples ci-dessous). Il est construit de telle mani\u00e8re que lors de l’appel, il fournit une r\u00e9f\u00e9rence \u00e0 la fonction interne avec les variables requises (la structure de m\u00e9moire). \u00c0 proprement parler, la fermeture n’est pas la fonction int\u00e9rieure seule, mais le regroupement de la fonction (int\u00e9rieure) et de l’\u00e9tat de variable, sur lequel la r\u00e9f\u00e9rence montre. Une fermeture peut \u00e9galement \u00eatre consid\u00e9r\u00e9e comme un objet qui n’a g\u00e9n\u00e9ralement qu’une seule m\u00e9thode. Si la fermeture est g\u00e9n\u00e9r\u00e9e avec d’autres fermetures au-dessus du m\u00eame contexte, c’est un objet avec plusieurs m\u00e9thodes. Les variables de la zone g\u00e9n\u00e9r\u00e9e peuvent \u00eatre utilis\u00e9es par la fermeture comme attributs. Les fermetures sont un concept qui provient des langages de programmation fonctionnelle, effectu\u00e9s dans LISP pour la premi\u00e8re fois et a \u00e9t\u00e9 enti\u00e8rement pris en charge pour la premi\u00e8re fois dans son sch\u00e9ma. En cons\u00e9quence, il a \u00e9galement \u00e9t\u00e9 pris en charge dans la plupart des langages de programmation fonctionnels ult\u00e9rieurs (comme Haskell, OCAML). Avec les fermetures, des zones modifiables non visibles mais contr\u00f4l\u00e9es peuvent \u00eatre cr\u00e9\u00e9es, par exemple, le captage de donn\u00e9es peut \u00eatre r\u00e9alis\u00e9 ou mis en \u0153uvre le curry. La production d’une fermeture est associ\u00e9e \u00e0 beaucoup moins de travail que la cr\u00e9ation d’une classe avec une seule m\u00e9thode. Suivant la perspective orient\u00e9e objet, les fermetures conviennent \u00e0 la production rapide d’une structure semblable \u00e0 un objet sans classe. La fonction anonyme est souvent utilis\u00e9e comme m\u00e9thode int\u00e9rieure. Dans un langage de programmation purement fonctionnel, une fermeture peut toujours \u00eatre utilis\u00e9e si elle est appel\u00e9e en fonction ou doit entrer dans un appel de fonction en tant que param\u00e8tre. Dans ce dernier cas, il peut agir comme une fonction de rappel g\u00e9n\u00e9r\u00e9e au terme et permet ainsi \u00e0 un programme d’application de manipuler son propre flux de contr\u00f4le dans une mesure significative pendant son terme. Cependant, cela n’est g\u00e9n\u00e9ralement rendu possible que par un syst\u00e8me de fermetures. En fait, le probl\u00e8me didactique est bas\u00e9 sur l’utilisation des fermetures. Table of ContentsExemple de pseudocode [ Modifier | Modifier le texte source ]] Exigences conceptuelles pour les fermetures dans les langages de programmation [ Modifier | Modifier le texte source ]] Fermetures dynamiques et lexicales [ Modifier | Modifier le texte source ]] Lisp commun [ Modifier | Modifier le texte source ]] Perler [ Modifier | Modifier le texte source ]] Python [ Modifier | Modifier le texte source ]] Ocaml [ Modifier | Modifier le texte source ]] Javascrip [ Modifier | Modifier le texte source ]] Deux [ Modifier | Modifier le texte source ]] Erlang [ Modifier | Modifier le texte source ]] C # [ Modifier | Modifier le texte source ]] C ++ 14 [ Modifier | Modifier le texte source ]] Java [ Modifier | Modifier le texte source ]] Php [ Modifier | Modifier le texte source ]] Rouiller [ Modifier | Modifier le texte source ]] Scala [ Modifier | Modifier le texte source ]] Exemple de pseudocode [ Modifier | Modifier le texte source ]] Dans l’exemple suivant, une fonction est d’abord fonction m\u00e8re Sont d\u00e9finis. Cette fonction d\u00e9finit un nom de variable local g\u00e2teau et d\u00e9finit une fonction locale appel\u00e9e fonction de l'enfant . fonction Motherfunction { param\u00e8tre Kucht type = 'tarte aux pommes' fonction Fonction enfant { donner 'Je mange # {kuchtyp}' } donner fonction de l'enfant} (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Si vous appelez fonction m\u00e8re La fonction locale fonction de l'enfant (pas leur r\u00e9sultat!). (Ceci est techniquement connu dans les langages de programmation non fonctionnels tels que C et les parents en tant que pointeur fonctionnel. Un pointeur fonctionnel tap\u00e9 est appel\u00e9 d\u00e9l\u00e9gu\u00e9.) param\u00e8tre Meinkuchen = call_auf fonction m\u00e8re La variable globale Meinkuchen Alors obtenez la fonction fonction de l'enfant attribu\u00e9. call_auf Meinkuchen Lorsque vous demandez Meinkuchen Par cons\u00e9quent fonction de l'enfant r\u00e9alis\u00e9. Bien qu’aucune variable globale g\u00e2teau exist\u00e9, donne fonction de l'enfant La cha\u00eene de caract\u00e8res 'Je mange une tarte aux pommes' de parce qu’elle peut acc\u00e9der \u00e0 son contexte de cr\u00e9ation dans lequel la variable g\u00e2teau avec 'G\u00e2teau aux pommes' est d\u00e9fini. C’est crucial: bien que fonction m\u00e8re a d\u00e9j\u00e0 renvoy\u00e9 une valeur – le contexte n’existe plus – peut fonction de l'enfant y acc\u00e9der – fonction de l'enfant Il en va de m\u00eame pour une fonction \u00e9troite. [\u00c9dition:] Je mange une tarte aux pommes Avec un changement dans le code, la valeur des variables est maintenant Num\u00e9ro_ g\u00e2teau dans le fonction m\u00e8re Avec chaque acc\u00e8s \u00e0 la fonction de fermeture augmente par un, qui peut \u00eatre utilis\u00e9 pour r\u00e9aliser un compteur. La valeur dans Num\u00e9ro_ g\u00e2teau est prot\u00e9g\u00e9 de la manipulation et ne peut \u00eatre que manger augmenter. (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4fonction Motherfunction { param\u00e8tre Num\u00e9ro_ g\u00e2teau = 0 fonction Fonction enfant { param\u00e8tre Num\u00e9ro_ Cake = Number_ Cake + 1 donner 'Je mange # {num\u00e9ro_kuchen} g\u00e2teau' } donner fonction de l'enfant} Avec plusieurs appels de la fonction m\u00e8re \u00e0 partir d’autres parties du programme, uniquement indirectement sur la valeur de la variable locale, qui n’est plus visible, ne peut \u00eatre que indirectement visible sont accessibles et (uniquement) dans le fonction de l'enfant Les calculs (encapsul\u00e9s) peuvent \u00eatre effectu\u00e9s avec des valeurs autrement non \u00e9changeables – celles-ci sont montr\u00e9es par les principaux avantages des fermetures mentionn\u00e9es: param\u00e8tre manger = call_auf fonction m\u00e8re call_auf manger call_auf manger call_auf manger Je mange 1 g\u00e2teauJe mange 2 g\u00e2teauxJe mange 3 g\u00e2teaux Acc\u00e8s direct \u00e0 la variable Num\u00e9ro_ g\u00e2teau Est ainsi prot\u00e9g\u00e9, votre valeur peut (comme dans l’exemple) ou ne peut pas \u00eatre servie directement \u00e0 l’ext\u00e9rieur. En aucun cas, la valeur ne peut \u00eatre modifi\u00e9e par rapport \u00e0 l’ext\u00e9rieur, si \u00e9troites -UP offrent plus de protection d’acc\u00e8s que, par exemple, en tant que champs \u00abpriv\u00e9s\u00bb d’une classe, par exemple en Java ou C #, ce qui est facile \u00e0 \u00e9viter avec r\u00e9flexion. Comment interpr\u00e9ter cela d\u00e9pend fortement de votre propre perspective sur les langages de programmation. Dans une perspective orient\u00e9e objet, la fonction m\u00e8re assume le r\u00f4le d’une classe, plus pr\u00e9cis\u00e9ment un objet (l’instance d’une classe) et, d’un point de vue orient\u00e9 objet, capsule ainsi les variables de l’enfant avec la fonction (s) de l’enfant en une seule unit\u00e9. En d’autres termes, une sorte de \u00abm\u00e9moire\u00bb crois\u00e9e est impl\u00e9ment\u00e9e dans les fonctions, similaires \u00e0 une variable statique, seulement plus puissante. Vu un peu diff\u00e9remment, cela peut \u00e9galement \u00eatre consid\u00e9r\u00e9 comme un changement dans le flux de contr\u00f4le, car l’exemple ci-dessus montre tr\u00e8s bien. Les listes peuvent \u00eatre impl\u00e9ment\u00e9es en tant qu’appel fonctionnel, par exemple, car un r\u00e9sultat diff\u00e9rent peut \u00eatre livr\u00e9 \u00e0 chaque fois que la “m\u00e9moire”) est appel\u00e9e. C # utilise cela comme un cas sp\u00e9cial, par exemple lors de la mise en \u0153uvre de “rendement de rendement”. L’\u00e9l\u00e9ment suivant d’un type listable comme une liste, pour ainsi dire, “paresseux” (paresseux), c’est-\u00e0-dire H. Pour \u00e9conomiser des ressources uniquement si n\u00e9cessaire. [d’abord] (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Exigences conceptuelles pour les fermetures dans les langages de programmation [ Modifier | Modifier le texte source ]] La fermeture repr\u00e9sente un mod\u00e8le de programmation fonctionnelle comme mentionn\u00e9, ils sont souvent difficiles \u00e0 comprendre pour les programmeurs de programmation purement fonctionnelle, m\u00eame s’ils sont de plus en plus impl\u00e9mentables. Les \u00abblocs de construction\u00bb conceptuels suivants sont n\u00e9cessaires pour rendre une fermeture impl\u00e9mentable dans un langage de programmation. 1. Les fonctions doivent \u00eatre autoris\u00e9es comme des objets de retour d’une autre fonction, en utilisant au moins des \u00e9l\u00e9ments utilis\u00e9s pour aider, tels que les mains fonctionnelles, les d\u00e9l\u00e9gu\u00e9s ou les expressions lambda. On parle \u00e9galement de fonctions de premi\u00e8re classe. (L’inverse est en particulier le cas si les fonctions ne peuvent \u00eatre consid\u00e9r\u00e9es et utilis\u00e9es que comme une sorte de commande nomm\u00e9e). 2. Dans l’exemple ci-dessus, la fonction interne doit pouvoir acc\u00e9der aux variables de la fonction externe (environnement d’appel). Contrairement aux variables locales, ces variables sont \u00e9galement appel\u00e9es \u00abvariables libres\u00bb du point de vue de la fonction int\u00e9rieure. 3. Le compilateur doit \u00eatre en mesure de reconna\u00eetre que la valeur (condition) des variables en dehors de sa port\u00e9e r\u00e9elle (port\u00e9e) est requise et en tenant activement en compte lors de la compilation. Techniquement, ces variables ne sont g\u00e9n\u00e9ralement plus stock\u00e9es sur la pile, mais cela est r\u00e9solu diff\u00e9remment, par ex. B. en g\u00e9n\u00e9rant r\u00e9ellement une classe (anonyme) et une instance qui contient les variables (membres) requises et la fonction interne (en tant que fonction membre). Ce n’est que maintenant que tous les \u00e9l\u00e9ments constitutifs sont ensemble \u00e0 une d\u00e9finition raccourcie mais plus technique du terme Fermeture \u00c0 installer, \u00e0 proprement parler par des fermetures lexicales au sens plus \u00e9troit: Les fermetures sont donc une technique de programmation ou des structures pour impl\u00e9menter le skoping lexical (port\u00e9e anglaise) avec des variables libres dans les langues avec des fonctions de premi\u00e8re classe. Fermetures dynamiques et lexicales [ Modifier | Modifier le texte source ]] La premi\u00e8re impl\u00e9mentation des fermetures r\u00e9sulte du type de mise en \u0153uvre des environnements d’ex\u00e9cution dans LISP. Dans les premi\u00e8res impl\u00e9mentations LISP, il n’y avait pas de skop lexical de la lexicale. L’environnement d’ex\u00e9cution d’une instruction consistait en une soi-disant liste avec des obligations variables qui pourraient \u00eatre atteintes via une seule r\u00e9f\u00e9rence. Une fermeture sur une fonction consistait alors en un couple compos\u00e9 de la d\u00e9finition de la fonction et de la r\u00e9f\u00e9rence \u00e0 la liste A valide \u00e0 la p\u00e9riode de d\u00e9finition de la fermeture. Ce couple g\u00e9n\u00e9r\u00e9 par la fonction LISP est une fermeture dynamique avec le nom historique Funarg (argument fonctionnel). Si le Funarg est venu plus tard \u00e0 l’ex\u00e9cution, cela s’est produit dans le contexte de la liste A apport\u00e9e avec eux plut\u00f4t que dans le contexte de la liste A actuellement valide. [2] La port\u00e9e lexicale aujourd’hui utilis\u00e9e dans LISP comme dans toutes les autres langues conduit \u00e0 une fermeture lexicale, qui est \u00e9galement fonctionnelle dans les langues compil\u00e9es. Il ne r\u00e9sulte que par l’intervention active par le compilateur en identifiant les r\u00e9f\u00e9rences de la fonction sur les variables qui sont libres et en dehors de celui-ci et g\u00e9n\u00e8rent du code, qui compose ces liaisons avec la fonction ensemble lors du retour de son contexte de d\u00e9finition. Cela se produit avant cette fonction – maintenant en tant que fermeture – est mise \u00e0 la disposition de l’appelant. \u00c9tant donn\u00e9 que cette liaison des variables n’est plus li\u00e9e lexicalement, elle ne peut pas rester sur la pile, mais est plac\u00e9e sur le tas par le syst\u00e8me de temps d’ex\u00e9cution. Avec une formation simultan\u00e9e de plusieurs fermetures au-dessus de la m\u00eame liaison variable, le syst\u00e8me de temps d’ex\u00e9cution garantit que la m\u00eame copie bas\u00e9e sur un tas de cette liaison variable est utilis\u00e9e dans les deux fermetures. Il existe \u00e9galement des langages de programmation non fonctionnels qui prennent en charge cette fonction. Cela inclut Ada, [3] C ++ (AB C ++ 11), C #, Go, Groovy, Java, [4] Javascript, [5] Lua, objet Pascal (Delphi), [6] [7] PHP, Perl, Python, Ruby, Smalltalk, Swift et Visual Basic .NET. Apple a \u00e9largi le CCG et a \u00e9t\u00e9 le plus de fermetures, les litt\u00e9raux des blocs de blocs pour C et ont propos\u00e9 cela pour la normalisation. [8] Lisp commun [ Modifier | Modifier le texte source ]] Cet exemple utilise une fermeture pour activer une \u00e9l\u00e9gante requ\u00eate de base de donn\u00e9es. La fermeture provient de la fonction nom est livr\u00e9. \u00c0 travers le fonction sp\u00e9ciale lambda Une fonction sans nom est cr\u00e9\u00e9e dans laquelle la valeur du champ nom sur l’\u00e9galit\u00e9 avec une cha\u00eene de caract\u00e8res n est v\u00e9rifi\u00e9. L’appel (Le nom est \"Elke\") Fournissez donc une fermeture en tant que connexion \u00e0 partir de la fonction anonyme et de la liaison variable de n \u00c0 la cha\u00eene de personnage “Elke”. Cela peut v\u00e9rifier un enregistrement de donn\u00e9es pour le m\u00eame nom avec “Elke”. La fermeture peut directement \u00e0 la fonction filtre sont remis, qui l’utilisent ensuite et renvoie le r\u00e9sultat. ( defparam\u00e8tre * dbase * ' (( \"Chaque\" \"1,1,1980\" ) ( \"Nuit\" \"2.3.1981\" ) ( \"Heidi\" \"4.5.1982\" ) ( \"Nuit\" \"5.6.1983\" ) ( \"Uschi\" \"7.8.1984\" ))) ( d\u00e9funier rendez-vous ( enregistrer ) ( d'abord enregistrer )) ( d\u00e9funier nom est ( nom ) ( lambda ( enregistrer ) ( \u00e9gal ( rendez-vous enregistrer ) nom ))) ( d\u00e9funier filtre ( pr\u00e9dicat liste ) ( supprimer si-non pr\u00e9dicat liste )) Ces d\u00e9finitions rendent d\u00e9sormais possible la requ\u00eate \u00e9l\u00e9gante suivante: ( imprimer ( filtre ( nom est \"Nuit\" ) * dbase * )) Il doit \u00eatre compris comme suit: l’appel de la fonction (nom-est \"gabi\") offre une fermeture. C’est une connexion \u00e0 partir du code de comparaison ici (Nom de l'enregistrement d'\u00e9gal (Get-Name)) de la fonction nom est et la liaison de la cha\u00eene de caract\u00e8res \"Nuit\" une variable de matrice nom . C’est s\u00e9mantiquement la requ\u00eate (Egal (Get-Name Record) \"Gabi\") . Cette comparaison est la fonction de fermeture filtre remettre cette comparaison. L’ex\u00e9cution de ce filtrage conduit alors au r\u00e9sultat: (( \"Nuit\" \"2.3.1981\" ) ( \"Nuit\" \"5.6.1983\" )) Perler [ Modifier | Modifier le texte source ]] Le contexte de tout fragment de code est d\u00e9termin\u00e9, entre autres, par les symboles disponibles: # pragma utiliser strict ; sous fonction { # Copier les arguments en variables nomm\u00e9es mon ( $ var1 , $ Var2 ) = @_ ; Code de blocs # } Dans l’exemple indiqu\u00e9 ci-dessus sont les variables $ var1 et $ Var2 Valide et visible \u00e0 chaque point. Lorsque vous quittez la fonction, vous serez bien rang\u00e9 avec le bloc abandonn\u00e9 (“allez” hors de port\u00e9e ) et sont alors inconnus. Tout acc\u00e8s suppl\u00e9mentaire serait une erreur. Fermetures Offrez maintenant la possibilit\u00e9 d’\u00e9largir la zone de validit\u00e9 de ces variables au-del\u00e0 de sa fin officielle. \u00c0 cette fin, une fonction est simplement d\u00e9finie dans la port\u00e9e qui utilise les variables pertinentes: # pragma utiliser strict ; sous fonction { mon ( $ var1 , $ Var2 ) = @_ ; retour sous { imprimer \"Dont: $ was1, $ var2.n\" }; } mon $ f = fonction ( \"Bonjour\" , 8 )); mon $ g = fonction ( \"bar\" , \"ET\" )); # Appel de $ f $ f -> (); # Appel de $ g $ g -> (); Le syst\u00e8me de temps d’ex\u00e9cution fournit maintenant lors de la sortie de la fonction fonction a d\u00e9clar\u00e9 que les r\u00e9f\u00e9rences aux variables de bloc $ var1 et $ Var2 Existant – La valeur de retour est un sous-programme anonyme, qui \u00e0 son tour contient des r\u00e9f\u00e9rences aux variables de bloc. $ var1 et $ Var2 Par cons\u00e9quent, restez avec leurs valeurs actuelles. Parce que la fonction pr\u00e9serve les variables de cette mani\u00e8re, elle devient une fermeture. En d’autres termes, m\u00eame apr\u00e8s avoir quitt\u00e9 la zone de validit\u00e9 r\u00e9elle des variables, vous pouvez appeler \u00e0 tout moment $ f -> () Et l’appel $ g -> () Ex\u00e9cuter et sera toujours affich\u00e9 comme les valeurs des variables valides lors de la d\u00e9finition des fonctions. Il en r\u00e9sulte la sortie: Dont: Hallo, 8.Qui: Bar, Y. Vous ne pouvez plus modifier ces valeurs car les variables en dehors de la fermeture ne sont plus disponibles. Cependant, cela est principalement d\u00fb \u00e0 la d\u00e9finition de la fonction: bien s\u00fbr, la fermeture aurait non seulement pu d\u00e9penser les valeurs, mais aussi modifier ou m\u00eame rendre le code d’appel \u00e0 nouveau disponible par r\u00e9f\u00e9rence. Dans la variante suivante, par exemple, les fonctions d’incr\u00e9ment et de d\u00e9cr\u00e9ment sont introduites: # pragma utiliser strict ; # fonction sous fonction { mon ( $ var1 , $ Var2 ) = @_ ; retour ( sous { imprimer \"Dont: $ was1, $ var2.n\" }, sous { $ var1 ++ ; $ Var2 ++ ;}, sous { $ var1 - ; $ Var2 - ;} )); } # Appelez la fonction mon ( $ imprimante , $ incr\u00e9ment , $ d\u00e9cr\u00e9mentor ) = fonction ( 3 , 5 )); # Utiliser les fermetures $ imprimante -> (); $ incr\u00e9ment -> (); $ imprimante -> (); $ incr\u00e9ment -> (); $ incr\u00e9ment -> (); $ imprimante -> (); Il en r\u00e9sulte la sortie: Dont: 3, 5.Dont: 4, 6.Dont: 6, 8. Les fermetures peuvent donc \u00eatre utilis\u00e9es, par exemple, pour chavirer l’acc\u00e8s \u00e0 des donn\u00e9es sensibles. Python [ Modifier | Modifier le texte source ]] Suivant un exemple simple de compteur dans Python, qui ne n\u00e9cessite pas de conteneur (nomm\u00e9) qui stocke l’\u00e9tat du compteur actuel. def fermeture (): r\u00e9cipient = [ 0 ]] def Inc (): r\u00e9cipient [ 0 ]] + = d'abord def obtenir (): retour r\u00e9cipient [ 0 ]] retour Inc , obtenir Dans l’exemple, dans le fermeture -Function a cr\u00e9\u00e9 deux objets fonctionnels, tous deux de la liste r\u00e9cipient Reportez-vous \u00e0 leur port\u00e9e globale. Est le fermeture Donc-fonction trait\u00e9e (apr\u00e8s un appel) et les deux objets de fonction retourn\u00e9s sont en outre r\u00e9f\u00e9renc\u00e9s, puis le r\u00e9cipient -List on, m\u00eame si la port\u00e9e de la fermeture a d\u00e9j\u00e0 \u00e9t\u00e9 laiss\u00e9e. De cette fa\u00e7on, la liste est conserv\u00e9e dans une port\u00e9e anonyme. Vous ne pouvez pas aller directement \u00e0 la liste r\u00e9cipient acc\u00e8s. Devenir les deux objets fonctionnels Inc et obtenir Le conteneur dispara\u00eet \u00e9galement. La fermeture de l’exemple pr\u00e9c\u00e9dent est ensuite utilis\u00e9e de la mani\u00e8re suivante: >>> i, g = fermeture ()>>> g ()0>>> i ()>>> i ()>>> g ()2 Ocaml [ Modifier | Modifier le texte source ]] OCAML le permet dans ce qui suit: laisser comptoir , Inc , r\u00e9initialiser = laisser n = r\u00e9f\u00e9rence 0 dans ( fonction () -> ! n ), (* comptoir *) ( fonction () -> n : = ! n + d'abord ), (* incr\u00e9ment *) ( fonction () -> n : = 0 ) (* r\u00e9initialiser *) Maintenant, le compteur peut \u00eatre utilis\u00e9 comme suit: # comptoir () ;; (* R\u00e9sultats 0 *) # Inc () ;; # comptoir () ;; (* R\u00e9sultats 1 *) # Inc () ; Inc () ; Inc () ;; # comptoir () ;; (* R\u00e9sultats 4 *) # r\u00e9initialiser () ;; # comptoir () ;; (* R\u00e9sultats 0 *) # n ;; (* n est encapsul\u00e9 *) Non li\u00e9 valeur n Au lieu d’un entier (“entier”), bien s\u00fbr, tous les objets ou variables de tous les types peuvent \u00eatre encapsul\u00e9s. Javascrip [ Modifier | Modifier le texte source ]] Dans la fonction F1, une autre fonction F2 est d\u00e9finie comme la fermeture; laisser F1 = fonction () { \/\/ D\u00e9finissez une fonction externe F1 ... laisser valeur = 22 ; \/\/ ... et cr\u00e9er une pi\u00e8ce de nom dedans. laisser F2 = fonction () { \/\/ d\u00e9finir une fonction int\u00e9rieure ... retour valeur ; \/\/ ... qui \u00e9tend la pi\u00e8ce de nom \u00e0 l'ext\u00e9rieur. } retour F2 ; \/\/ retourne F2 par F1, qui devient une fermeture. } laisser un = F1 (); \/\/ a est la fonction de fermeture renvoy\u00e9e par F1 (), ... console . enregistrer ( F1 ()); \/\/ ... aussi: function () {return wert;} console . enregistrer ( Type de valeur )); \/\/ n'est pas d\u00e9fini console . enregistrer ( un ()); \/\/ R\u00e9sultats 22 console . enregistrer ( F1 () ()); \/\/ R\u00e9sultats 22, F2 () mais n'est pas disponible ici L’exemple ci-dessus se formule un peu diff\u00e9remment, la fonction int\u00e9rieure est maintenant appel\u00e9e directement: laisser F3 = fonction () { laisser valeur = 23 ; \/\/ La fonction F3 renvoie la fonction de fermeture! retour fonction () { retour valeur ; }; } laisser b = F3 (); \/\/ b est \u00e0 nouveau la fonction renvoy\u00e9e par f3 () ... console . enregistrer ( b ()); \/\/ ... et livre maintenant 23 console . enregistrer ( b )); \/\/ b reste un appel de fonction! console . enregistrer ( F3 () ()); \/\/ d\u00e9livre \u00e9galement 23 La fonction int\u00e9gr\u00e9e sert de fournisseur de la valeur d\u00e9finie dans la fonction globale. La fonction globale peut \u00e9galement \u00eatre d\u00e9finie comme une fonction anonyme: laisser valeur = 24 ; laisser c = ( fonction () { \/\/ l'ext\u00e9rieur en fonction anonyme et ... retour valeur ; \/\/ ... d\u00e9finissez la fonction int\u00e9rieure dedans. } ()); \/\/ la fonction maintenant avec (); Appeler. console . enregistrer ( c )); \/\/ R\u00e9sultats 24 La fermeture peut \u00e9galement \u00eatre cr\u00e9\u00e9e avec une fonction de constructeur: laisser d = ( nouveau Fonction ( \"Retour de valeur;\" )) (); \/\/ d\u00e9finir et appeler avec un constructeur Deux [ Modifier | Modifier le texte source ]] Lua a un -in construit et, dans le sens de la programmation, \u00e9galement un support intuitif pour les fermetures, dont l’impl\u00e9mentation est similaire \u00e0 celle de Python: fonction additionneur ( X ) - G\u00e9n\u00e9rateur de fonctions retour fonction ( et ) - Anonyme, pour ajouter une fonction priv\u00e9e retour X + et - x vient ici du contexte ext\u00e9rieur fin fin Une utilisation d’\u00e9chantillons ressemblerait \u00e0 ceci: ajouter = additionneur ( 2 ) - Ici, la fermeture est g\u00e9n\u00e9r\u00e9e imprimer ( ajouter ( dix )) -> Num\u00e9ro 12 imprimer ( ajouter ( - 2 )) -> Probl\u00e8me 0 Une mise en \u0153uvre de fermeture dans Lua est en [9] d\u00e9crit. Erlang [ Modifier | Modifier le texte source ]] Erlang en tant que langage fonctionnel a \u00e9galement des fermetures, qui, cependant, Amusant (Singulier Amusant , depuis fonction ) d’\u00eatre nomm\u00e9. faire quelque chose ( Amusant ) -> Amusant ( 4 ). principal () -> \u00c9tait = 37 , F = amusant ( N ) -> \u00c9tait + N fin . R\u00e9sultat = faire quelque chose ( F ). % R\u00e9sultat =: = 41 =: = 37 + 4 C # [ Modifier | Modifier le texte source ]] C # prend en charge les fermetures sous forme de d\u00e9l\u00e9gu\u00e9s. [dix] priv\u00e9 statique Action Cr\u00e9ation () { \/\/ D\u00e9claration d'une variable dans le contexte local \u00e9tait X = 0 ; \/\/ Cr\u00e9ation d'un d\u00e9l\u00e9gu\u00e9 de fermeture \u00e0 l'aide d'une expression de lambda Action fermeture = () => Console . \u00c9crit ( X )); \/\/ Changement dans le contexte local X = d'abord ; \/\/ Retour de la fermeture au contexte primordial retour fermeture ; } static void Main(){ var closure = CreateClosure(); \/\/ Im globalen Kontext \/\/ Variable x wird nur noch innerhalb der Closure referenziert \/\/ F\u00fchre Closure aus; Schreibt \"1\" auf die Konsole closure();}C ++ 14 [ Modifier | Modifier le texte source ]] C ++ prend en charge les fermetures en utilisant des expressions lambda [11] (De C ++ 11), qui peut \u00eatre des capsules dans des objets fonctionnels, donc-cal\u00e9 radio, la fonction type std ::. #inclure #inclure #inclure MST :: fonction < annuler ( annuler ) > create_closure () { MST :: cha\u00eene g\u00e2teau ( \"G\u00e2teau aux pommes\" )); \/\/ Les variables locales sont transf\u00e9r\u00e9es \u00e0 l'objet fonctionnel ici comme copie retour [ = ] () { MST :: couter > G\u00e9n\u00e9rateur = nom de g\u00e2teau -> { int comptoir = 0 ; retour () -> \"Je mange \" + comptoir ++ + \"\" + nom de g\u00e2teau ; \/\/ Erreur: le compteur ne peut pas \u00eatre modifi\u00e9 }; public statique annuler principal ( Cha\u00eene [] args ) { Fournisseur < Cha\u00eene > cheesecake = G\u00e9n\u00e9rateur . appliquer ( \"Cheesecake\" )); Syst\u00e8me . dehors . println ( cheesecake . obtenir ()); Syst\u00e8me . dehors . println ( cheesecake . obtenir ()); Syst\u00e8me . dehors . println ( cheesecake . obtenir ()); } En Java, le code peut acc\u00e9der aux variables de la m\u00e9thode environnante dans une expression de lambda, mais ne peut pas la changer. Dans l’exemple ci-dessus, le code du fournisseur retourn\u00e9 essaie par Counter ++ Pour modifier la valeur d’une variable, qui d\u00e9clenche une erreur de compilateur. Afin d’\u00e9viter cette restriction, les donn\u00e9es modifi\u00e9es doivent \u00eatre encapsul\u00e9es dans des objets, par exemple avec AtomicInteger: priv\u00e9 statique Fonction < Cha\u00eene , Fournisseur < Cha\u00eene >> G\u00e9n\u00e9rateur = nom de g\u00e2teau -> { Atomicinteger comptoir = nouveau Atomicinteger ( 0 )); retour () -> \"Je mange \" + comptoir . Incordance Tand () + \"\" + nom de g\u00e2teau ; }; public statique annuler principal ( Cha\u00eene [] args ) { Fournisseur < Cha\u00eene > cheesecake = G\u00e9n\u00e9rateur . appliquer ( \"Cheesecake\" )); Syst\u00e8me . dehors . println ( cheesecake . obtenir ()); Syst\u00e8me . dehors . println ( cheesecake . obtenir ()); Syst\u00e8me . dehors . println ( cheesecake . obtenir ()); } Le code corrig\u00e9 de cette mani\u00e8re compil\u00e9 parce que la r\u00e9f\u00e9rence \u00e0 l’objet du compteur dans l’expression de Lambda reste inchang\u00e9e. La sortie est alors: Je mange 0 cheesecakeJe mange 1 cheesecakeJe mange 2 cheesecake Php [ Modifier | Modifier le texte source ]] PHP prend en charge les fermetures de la version 5.3.0 sous la forme de fonctions anonymes. [douzi\u00e8me] Techniquement, PHP r\u00e9sout la mise en \u0153uvre de cette fonctionnalit\u00e9 \u00e0 travers sa propre classe de \u00abfermeture\u00bb. [13] $ Fonction m\u00e8re = fonction () { $ num\u00e9ro_ g\u00e2teau = 0 ; $ Fonction enfant = fonction () utiliser ( & $ num\u00e9ro_ g\u00e2teau ) { $ num\u00e9ro_ g\u00e2teau = $ num\u00e9ro_ g\u00e2teau + d'abord ; imprimer \"Je mange { $ num\u00e9ro_ g\u00e2teau } G\u00e2teau n \" ; }; retour $ Fonction enfant ; }; manger $ = $ Fonction m\u00e8re (); manger $ (); manger $ (); manger $ (); La sortie des vues est la suivante: Je mange 1 g\u00e2teauJe mange 2 g\u00e2teauxJe mange 3 g\u00e2teaux \u00c0 partir de PHP 7.0, les fermetures sont \u00e9galement soutenues sous la forme de classes anonymes. [14] manger $ = nouveau classe () { priv\u00e9 $ num\u00e9ro_ g\u00e2teau = 0 ; public fonction __invoquer () { $ ceci -> Num\u00e9ro_ g\u00e2teau = $ ceci -> Num\u00e9ro_ g\u00e2teau + d'abord ; imprimer \"Je mange { $ ceci -> Num\u00e9ro_ g\u00e2teau } G\u00e2teau n \" ; } }; manger $ (); manger $ (); manger $ (); Les deux impl\u00e9mentations fournissent des d\u00e9penses identiques. Rouiller [ Modifier | Modifier le texte source ]] Rust a d\u00e9j\u00e0 pris en charge les fermetures de la version 0.1, le retour des fermetures des fonctions jusqu’\u00e0 la rouille 1.26 (publi\u00e9e le 10 mai 2018) via un pointeur vers la m\u00e9moire du tas (via Bo\u00eete ) arriver. FN fonction m\u00e8re () -> Bo\u00eete < homme Fnmut () -> () > { laisser mais Num\u00e9ro_ g\u00e2teau = 0 ; laisser fonction de l'enfant = d\u00e9placer || { Num\u00e9ro_ g\u00e2teau + = d'abord ; println! ( \"Je mange du g\u00e2teau\" , Num\u00e9ro_ g\u00e2teau )); }; \/\/ [ex.1] Erreur si le g\u00e2teau num\u00e9ro_ n'impl\u00e9menterait pas la copie (voir ci-dessous) \/\/ println! (\"Maintenant le nombre de g\u00e2teaux: {}\", g\u00e2teau num\u00e9ro_); retour Bo\u00eete :: nouveau ( fonction de l'enfant )); }fn main() { let mut essen = mutterfunktion(); essen(); essen(); essen();}Sortir: Je mange 1 g\u00e2teauJe mange 2 g\u00e2teauxJe mange 3 g\u00e2teaux Dans Rust 1.26 le trait implorant Syntaxe se stabilise, qui le m\u00eame code sans indirection via la m\u00e9moire du tas ( Box :: new () ) Active: FN fonction m\u00e8re () -> implorant Fnmut () -> () { laisser mais Num\u00e9ro_ g\u00e2teau = 0 ; d\u00e9placer || { Num\u00e9ro_ g\u00e2teau + = d'abord ; println! ( \"Je mange du g\u00e2teau\" , Num\u00e9ro_ g\u00e2teau )); } } fn main() { let mut essen = mutterfunktion(); essen(); essen(); essen();}La valeur de retour de Fonction m\u00e8re () le FN Trait, par lequel le type exact de la valeur de retour n’est d\u00e9termin\u00e9 que lorsque la fonction est utilis\u00e9e. La rouille se diff\u00e9rencie entre les conversions fonctionnelles et les fermetures, ainsi que divers types ferm\u00e9s: FN , Fnmut et FnOnce . Un FN -Closure ne peut pas modifier le contexte dans lequel il est appel\u00e9. Un Fnmut -Closure ne peut modifier la variable dans le contexte mais a \u00e9t\u00e9 marqu\u00e9e. Un FnOnce -Closure consomme la variable cr\u00e9\u00e9e dans le contexte. Ici pourrait manger() Je viens d’\u00eatre appel\u00e9 exactement une fois – \u00e0 la fin de la premi\u00e8re fermeture, le destructeur est Num\u00e9ro_ g\u00e2teau Et la variable n’est plus disponible. Si [Ex.1] L’\u00e9dition est comment\u00e9e: Est maintenant le nombre de g\u00e2teaux: 0Je mange 1 g\u00e2teauJe mange 2 g\u00e2teauxJe mange 3 g\u00e2teaux Le d\u00e9placer Le mot-cl\u00e9 est utilis\u00e9 pour poss\u00e9der la variable Num\u00e9ro_ g\u00e2teau afficher. Depuis notre variable Num\u00e9ro_ g\u00e2teau peut \u00eatre copi\u00e9 (variable du type U32 Mettre en \u0153uvre le Copie -Trait), nous pouvons utiliser la variable au sein de la fonction m\u00e8re une fois la valeur r\u00e9elle de la fermeture. Voici Num\u00e9ro_ g\u00e2teau Copi\u00e9, d. H. Bien que nous ayons d\u00e9j\u00e0 d\u00e9fini le num\u00e9ro sur 1 dans le code, la sortie d\u00e9pense toujours 0 car il s’agit d’une copie compl\u00e8te de la variable. Est le type de Num\u00e9ro_ g\u00e2teau Non copi\u00e9, le compilateur passe une erreur. Scala [ Modifier | Modifier le texte source ]] Scala est un langage de programmation fonctionnel bas\u00e9 sur la machine virtuelle Java. objet Closurest { def principal ( args : D\u00e9ployer [ Cha\u00eene ]):: Unit\u00e9 = { def fonction de l'enfant = fonction m\u00e8re println ( \"Appeler Kinder\" ) fonction de l'enfant ; fonction de l'enfant ; fonction de l'enfant ; } \u00e9tait Num\u00e9ro_ g\u00e2teau = 0 ; def fonction m\u00e8re : Unit\u00e9 = { \u00e9tait Kuchtype = \"G\u00e2teau aux pommes\" def fonction de l'enfant : Unit\u00e9 = { Num\u00e9ro_ g\u00e2teau = Num\u00e9ro_ g\u00e2teau + d'abord retour Syst\u00e8me . dehors . println ( \"Je mange \" + Num\u00e9ro_ g\u00e2teau . tostring () + \"\" + Kuchtype ) } fonction de l'enfant } } Voici la variable Num\u00e9ro_ g\u00e2teau uniquement modifiables entre les appels s’il \u00e9tait d\u00e9fini dans un contexte global (\u00e9galement dans une autre classe ou un autre objet). La sortie du programme est: Appeler les enfantsJe mange 1 tarte aux pommesJe mange 2 tartes aux pommesJe mange 3 tartes aux pommes Ralf H. G\u00fcting, Martin Erwig, Traducteur . Springs, 1999, ISBN 3-540-65389-9 Damian Conway, Perl orient\u00e9 objet Oliver Lau, Andreas Linke, Torsten T. Will: Variable \u00e0 faire – Certes dans les langages de programmation actuels. Dans: c\u2019est , 17\/2013, S. 168ff. \u2191 Ted Neward: \u00c9tat bas\u00e9 sur la fermeture: C #. 2. avril 2016, consult\u00e9 le 14 avril 2022 (Anglais). \u2191 John McCarthy u. un.: Manuel des programmeurs LISP 1.5 . (PDF; 4,5 Mo) Software Preservation.org; Consult\u00e9 le 12 mars 2014. \u2191 John Barnes: Justification de l’ADA 2005 \u2191 Fermetures en java \u2191 Fermetures en javascript (Anglais) \u2191 Craig Stuntz: Comprendre les m\u00e9thodes anonymes. Dans: Community.embarcadero.com. 4. ao\u00fbt 2008, consult\u00e9 le 14 avril 2022 (Anglais). \u2191 Barry Kelly: Tiburon: Fun avec des g\u00e9n\u00e9riques et des m\u00e9thodes anonymes . \u2191 N1370: Extensions d’Apple \u00e0 C (PDF; 69 Ko) \u2191 La mise en \u0153uvre de Lua 5.0 \u2191 Dustin Campbell: Qu’y a-t-il dans une fermeture. (Pas plus disponible en ligne.) 9 f\u00e9vrier 2007, archiv\u00e9 \u00e0 partir de Original suis 15. ao\u00fbt 2014 ; Consult\u00e9 le 12 avril 2014 (Anglais). \u2191 Fonctions Lambda. R\u00e9cup\u00e9r\u00e9 le 17 octobre 2015 (Anglais). \u2191 Fonctions anonymes. Consult\u00e9 le 19 mai 2015 . \u2191 La classe de fermeture. Consult\u00e9 le 19 mai 2015 . \u2191 Joe Watkin, Phil Sturgeon: Classes anonymes. 22. septembre 2013, Consult\u00e9 le 19 mai 2015 (Anglais). (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4"},{"@context":"http:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/wiki.edu.vn\/all2fr\/wiki1\/#breadcrumbitem","name":"Enzyklop\u00e4die"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/wiki.edu.vn\/all2fr\/wiki1\/cloture-fonction-wikipedia\/#breadcrumbitem","name":"Cl\u00f4ture (fonction) – Wikipedia"}}]}]