Névtelen funkció

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. április 7-én felülvizsgált verziótól ; az ellenőrzések 29 szerkesztést igényelnek .

Az anonim függvény a programozásban  olyan speciális funkciók , amelyek a felhasználás helyén deklaráltak, és nem kapnak egyedi azonosítót a hozzáférésükhöz. Számos programozási nyelven támogatott .

Általában anonim függvények létrehozásakor vagy közvetlenül hívják meg őket, vagy a függvényre való hivatkozást hozzárendeljük egy változóhoz , amely azután a függvény közvetett meghívására használható. De az utóbbi esetben az anonim függvény nevet kap, és megszűnik anonim lenni. Ha egy névtelen függvény olyan változókra hivatkozik, amelyek nem szerepelnek a törzsében (capture), akkor az ilyen függvényt lezárásnak nevezzük . A lambda-kifejezés egy olyan szintaktikai konstrukció , amely sok nyelvben közös anonim függvények meghatározására.

Szintaxis

Az anonim függvények írásának szintaxisa a különböző programozási nyelvekhez a legtöbb esetben nagyon eltérő.

Nyelv Példa a kiegészítés jelölésére
AS3 function ( x : int , y : int ): int { return x + y ;}
C# ( x , y ) => x + y
C++ C++11 nyelven bevezetve. A markolatnak és a testnek jelen kell lennie. Hosszú forma [1] : [ capture ]( paraméterek ) mutable kivételek attribútumok - > return_type { body } [2] példa : []( int x , int y ){ return x + y ; }

A C++14 hozzáadta a lambda függvények használatának lehetőségét a auto[3] -mal :

auto lambda = []( auto x , auto y ) { return x + y ;}; Az anonim függvények külön változóként rögzíthetők, például:int a ; auto f = [ a ](){ return a ;} és minden külső változó: hivatkozással [&] vagy másolattal [=] . Ezeket a megközelítéseket kombinálhatja is: például az összes változót hivatkozással, bizonyos paramétereket pedig másolással rögzíthet. Az értékkel rögzített változók módosításához meg kell adnia a változó kulcsszót a függvény deklarálásakor. A C++14 lehetőséget ad a lambda-változók inicializálására a rögzítésben. Például:[ a = std :: string {}](){ return a ;}
CoffeeScript (x, y) -> x + y
D // rövid forma auto típusú következtetéssel auto  a  =  (( x ,  y )  =>  x  +  y )( 2 ,  3 ); // hosszú alakú jelölés (kapcsos zárójelek blokkja) automatikus típuskövetkeztetéssel auto  aa  =  ( x ,  y )  {  return  x  +  y ;  }( 2 ,  3 ); // fordító névtelen függvénytípus automatikus felismerése: függvény vagy delegálás auto  b  =  ( int  x ,  int  y )  =>  x  +  y ; auto  bb  =  ( int  x ,  int  y )  {  return  x  +  y ;  }; // a függvények nem férnek hozzá a külső változókhoz auto  c  =  function ( int  x ,  int  y )  =>  x  +  y ; auto  cc  =  function ( int  x ,  int  y )  {  return  x  +  y ;  }; // a küldöttek hozzáférhetnek a külső változókhoz auto  d  =  delegate ( int  x ,  int  y )  =>  x  +  y ; auto  dd  =  delegált ( int  x ,  int  y )  {  return  x  +  y ;  }; // delegate, amely int változót vesz fel és dupla értéket ad vissza auto  f  =  delegate  double ( int  x )  {  return  5.0  /  x ;  };
Delphi (2009-es verzió óta) függvény ( x , y : integer ) : egész szám kezdési eredmény := x + y ; vége ;
Erlang móka ( X , Y ) -> X + Y vége
GNU Octave @( x , y ) x + y
megy Z := func () int { return X + Y }()
Groovy { x , y -> x + y }
Haskell \ x y -> x + y
Java (8-as verzió óta) // paraméter nélkül () -> Rendszer . ki . println ( "Szia, világ." ); // egyetlen paraméterrel (Ez a példa egy identitásfüggvény). a -> a //egyetlen kifejezéssel ( a , b ) -> a + b // kifejezett típusinformációkkal ( Long id , String name ) -> "id: " + id + ", name:" + name // kódblokkkal ( a , b ) -> { return a + b ;} // több utasítással a lambda törzsben. Kódblokkot igényel. // Ez a példa egy beágyazott lambda kifejezést és egy lezárást is tartalmaz. ( id , newPrice ) -> { Optional < Product > mayBeProduct = findProduct ( id ); lehet, hogy Termék . ifPresent ( termék -> termék . setPrice ( newPrice )); visszatérés mayBeProduct . kap (); }
JavaScript A nyíl függvénykifejezéseket mindig név nélkül deklarálják. Az ECMAScript 6 (más néven ECMAScript 2015) [4] szabvány nyílfüggvényekkel bővült . // Nyíl függvény. ES6+ (ES2015+) ( x , y ) => x + y ; Függvény deklarálása függvénykifejezésen keresztül név megadása nélkül. Ezt a módszert először az ECMAScript 3 szabvány specifikációjában írták le [5] [6] . // Függvénykifejezés. ES3+ függvény ( x , y ) { return x + y }

A függvénynek egy függvényobjektum konstruktora (Function constructor) általi dinamikus létrehozása mindig név nélkül történik. A dinamikus függvény létrehozásának rövidebb jelölése egy függvényhívás, amely automatikusan meghívja a függvénykonstruktort ugyanazokkal a paraméterekkel. A függvények létrehozásának ilyen módjai a legkorábbi specifikációk óta léteznek, kezdve az ECMAScript First Edition-től [7] [8] .

// Egy függvény dinamikus létrehozása a függvénykonstruktorral. ES1+ új függvény ( 'x' , 'y' , 'return x + y' ) // Rövidebb jelölés. ES1+ függvény ( 'x' , 'y' , 'return x + y' )
Lua függvény ( x , y ) visszatér x + y vége
juharfa ( x , y ) -> x + y
Mathematica #1 + #2 &

vagy

Funkció [ #1 + #2 ]

vagy

függvény [{ x , y }, x + y ] [9] [10]
MATLAB f =@( x , y ) x + y
Maxima lambda ([ x,y ] , x+y )
Nim proc ( x , y : int ): int = x * y
PascalABC.NET ( x , y ) -> x + y
Perl sub { return $_ [ 0 ] + $_ [ 1 ] } [tizenegy]
PHP // PHP 7.4+ fn ( $x , $y ) => $x + $y ;

Nyílfüggvények kerültek hozzáadásra a PHP 7.4-ben [12] .

// PHP 5.3+ függvény ( $x , $y ) use ( $a , & $b ) { return $x + $y ; }

Itt $a, $b rögzített változók, míg a $b változó szintén zárt [13] [14] .

// PHP 4.0.1+ create_function ( '$x, $y' , 'return $x + $y;' )

Névtelen függvény létrehozása a create_function [15] segítségével . Ez a módszer a PHP 7.2.0 óta elavult.

PowerShell { param ( $x , $y ) $x + $y } [16]
Piton lambda x , y : x + y [17]
R függvény ( x , y ) x + y
rubin lambda { | x , y | x + y } [tizennyolc]
Rozsda | x : i32 , y : i32 | x + y
Scala

A kontextus megadása nélkül meg kell adnia a változók típusát:

( x : Int , y : Int ) => x + y

De olyan helyeken, ahol a típusra lehet következtetni, használhatók a gyorsított formák:

( 1 -től 100 - ig ) csökkenti ( ( a , b ) => a + b )

Vagy még rövidebb, '_' automatikus helyettesítések használatával:

( 1 -től 100 - ig ) csökkenti ( _ + _ )
Scheme , Common Lisp ( lambda ( x y ) ( + x y ))
SML fn ( x , y ) => x + y
Gyors // 1 opció legyen f : ( Int , Int ) - > Int = { x , y cserében x + y } // 2. opció legyen f : ( Int , Int ) -> Int = { x , y in x + y } /* Paraméternevek rövidítése */ // 1. opció legyen f : ( Int , Int ) -> Int = { return $0 + $1 } // 2. opció legyen f : ( Int , Int ) -> Int = { $0 + $1 }
gépelt // Egy nyílfüggvény kifejezés mindig név nélkül deklarálva ( x , y ) => x + y // Függvénykifejezés (függvénykifejezés) név nélkül függvény ( x , y ) { return x + y } // Funkció dinamikus létrehozása // függvényobjektum konstruktorral (Function constructor) // mindig név nélkül deklarálva new Function ( 'x' , 'y' , 'return x + y' ) // Rövidebb jelölés a dinamikus függvény létrehozásához. // Egy függvény meghívása automatikusan meghívja // a függvénykonstruktort ugyanazokkal a paraméterekkel a függvény ( 'x' , 'y' , 'return x + y' )
Visual Prolog {( X , Y ) = X + Y }

Lásd még

Jegyzetek

  1. névtelen funkciók . Hozzáférés időpontja: 2016. február 21. Az eredetiből archiválva : 2016. február 21.
  2. C++11. Lambda kifejezések . Letöltve: 2010. augusztus 25. Az eredetiből archiválva : 2010. október 9..
  3. Sutter, Herb Trip Report: ISO C++ 2013. tavaszi találkozó . isocpp.org (2013. április 20.). Letöltve: 2013. június 14. Az eredetiből archiválva : 2017. augusztus 20..
  4. Nyílfüggvények (HTML). MDN webes dokumentumok . Mozilla fejlesztői hálózat. Letöltve: 2019. szeptember 27. Az eredetiből archiválva : 2019. augusztus 19.
  5. ECMAScript nyelvi specifikáció . 3. kiadás, végleges  (angol) (PDF) . Archívum mozilla.org 79. o . Svájc, CH-1204 Genf, 114 Rue du Rhone: ECMA (2000. március 24.) .  — Az ECMAScript szabvány (ECMA-262) specifikációja. Harmadik kiadás. Letöltve: 2019. szeptember 27. Az eredetiből archiválva : 2019. szeptember 24..
  6. Funkciók a JavaScriptben (HTML). MDN webes dokumentumok . Mozilla fejlesztői hálózat. Letöltve: 2019. szeptember 27. Az eredetiből archiválva : 2019. szeptember 3..
  7. ECMAScript . Általános célú, többplatformos programozási nyelv  (angol) (PDF) . Archívum mozilla.org P. 63-64 . Svájc, CH-1204 Genf, 114 Rue du Rhone: ECMA (1997. június) .  — Az ECMAScript szabvány (ECMA-262) specifikációja. Első kiadás. Letöltve: 2019. szeptember 27. Az eredetiből archiválva : 2019. szeptember 27..
  8. Függvény (HTML). MDN webes dokumentumok . Mozilla fejlesztői hálózat. — A Function objektum és a Function konstruktor leírása a függvények dinamikus létrehozásához Hozzáférés dátuma: 2019. szeptember 27. Archiválva : 2019. szeptember 23.
  9. Mathematica Dokumentáció: Függvény (&) Archiválva : 2008. április 5.
  10. Funkció (&) . Wolfram Nyelvi és Rendszer - Dokumentációs Központ . Volfrám. Letöltve: 2019. szeptember 28. Az eredetiből archiválva : 2019. október 1..
  11. perldoc perlref Archivált : 2018. január 2. a Wayback Machine -nél 
  12. PHP Digest #152 (2019. március 11-25.) . Letöltve: 2019. május 7. Az eredetiből archiválva : 2019. május 7.
  13. M. Zandstra, „PHP Objects, Patterns, and Practice”, második kiadás, szerk. Sajtó, 2008.
  14. PHP kézikönyv . Hozzáférés dátuma: 2010. május 1. Az eredetiből archiválva : 2013. február 16.
  15. PHP kézikönyv . Letöltve: 2010. május 1. Az eredetiből archiválva : 2011. augusztus 10.
  16. Adatmanipuláció egyszerűsítése a PowerShellben Lambda-funkciókkal . Letöltve: 2019. szeptember 27. Az eredetiből archiválva : 2019. szeptember 27.
  17. Oktató rész "Master Python in Your Own 24 Hours" Archiválva : 2006. április 30.
  18. Leírás a Programozásban Ruby Archiválva : 2006. április 11.  (Angol)