Warning: session_name(): Cannot change session name when session is active in /home/stalko/rodina-ru.com/docs/dokuwiki/inc/init.php on line 231

Warning: session_set_cookie_params(): Cannot change session cookie parameters when session is active in /home/stalko/rodina-ru.com/docs/dokuwiki/inc/init.php on line 232
======Анонимная функция====== **Анонимная функция** в [[программирование|программировании]] — особый вид [[функция-программирование-|функций]], которые объявляются в месте использования и не получают уникального [[идентификатор|идентификатора]] для доступа к ним. Поддерживаются во многих [[язык-программирования|языках программирования]]. Обычно при создании анонимные функции либо вызываются напрямую, либо [[ссылка-программирование-|ссылка]] на функцию присваивается [[переменная-программирование-|переменной]], с помощью которой затем можно косвенно вызывать данную функцию. Если анонимная функция ссылается на переменные, не содержащиеся в её теле (захват), то такая функция называется [[замыкание-программирование-|замыканием]]. [[лямбда-выражение|Лямбда-выражение]] — типичная для многих языков [[синтаксис-программирование-|синтаксическая]] конструкция для определения анонимной функции. =====Синтаксис===== [[синтаксис|Синтаксис]] записи анонимных функций для различных [[язык-программирования|языков программирования]] в большинстве случаев сильно различается. {| ! Язык ! Пример записи сложения |- ! [[action-script|AS3]] | function(x:int, y:int):int{return x + y;} |- ! [[c-sharp|C#]] | (x,y) => x+y |- ! [[c++|C++]] | Введены в C++11. Полная форма(([[http://en.cppreference.com/w/cpp/language/lambda|анонимные функции]].)): [захват](параметры)mutable исключения атрибуты->возвращаемый_тип{тело} Обязательно должны присутствовать захват и тело. Пример(([[http://blog.olendarenko.org.ua/2009/08/c0x.html|C++11. Лямбда-выражения]])): [](int x, int y){ return x + y; } В С++14 была добавлена возможность использовать лямбда-функции с ''auto''((//[[herb-sutter|Sutter, Herb]]// [[https://isocpp.org/blog/2013/04/trip-report-iso-c-spring-2013-meeting|Trip Report: ISO C++ Spring 2013 Meeting]]. //isocpp.org// (20 April 2013). Проверено 14 июня 2013.)): [] auto lambda = [](auto x, auto y) {return x + y;}; Анонимная функция может захватывать как отдельные переменные, например: int a; auto f = [a](){return a;} так и все внешние переменные: по ссылке ''[&]'' или с помощью копии ''[=]''. Также можно комбинировать эти подходы: например, все переменные захватить по ссылке, а определённые параметры по копии. Чтобы иметь возможность модифицировать переменные, захваченные по ссылке, нужно указать ключевое слово ''mutable'' при объявлении функции. |- ! [[coffeescript|CoffeeScript]] | (x, y) -> x + y |- ! [[pascalabc.net|PascalABC.NET]] | (x, y) -> x + y |- ! [[d-язык-программирования-|D]] | // короткая форма записи с автовыводом типов auto a = ((x, y) => x + y)(2, 3); // длинная форма записи (блок с фигурными скобками) с автовыводом типов auto aa = (x, y) { return x + y; }(2, 3); // автоопределение компилятором типа анонимной функции: функция или делегат auto b = (int x, int y) => x + y; auto bb = (int x, int y) { return x + y; }; // функции не имеют доступа к внешним переменным auto c = function(int x, int y) => x + y; auto cc = function(int x, int y) { return x + y; }; // делегаты имеют доступ к внешним переменным auto d = delegate(int x, int y) => x + y; auto dd = delegate(int x, int y) { return x + y; }; // делегат, принимающий переменную типа int и возвращающий значение типа double auto f = delegate double(int x) { return 5.0 / x; }; |- ! [[delphi-язык-программирования-|Delphi]] (c 2009 версии) | function(x, y: integer): integer begin result := x+y; end; |- ! [[erlang|Erlang]] | fun(X,Y)->X+Y end |- ! [[scala-язык-программирования-|Scala]] | Без указания контекста надо указывать тип переменных: (x: Int, y: Int) => x + y Но в местах, где тип может быть выведен, можно использовать сокращенные формы: (1 to 100) reduce ((a, b) => a+b) Или ещё короче, с использованием автоподстановок '_': (1 to 100) reduce (_ + _) |- ! [[gnu-octave|GNU Octave]] | @(x,y)x+y |- ! [[groovy|Groovy]] | {x, y -> x + y} |- ! [[haskell|Haskell]] | \x y -> x + y |- ! [[java|Java]] (с версии 8) | // with no parameter () -> System.out.println("Hello, world."); // with a single parameter (This example is an identity function). a -> a //with a single expression (a, b) -> a + b // with explicit type information (Long id, String name) -> "id: " + id + ", name:" + name // with a code block (a, b) -> {return a + b;} // with multiple statements in the lambda body. It require a code block. // This example also includes a nested lambda expression as well as a closure. (id, newPrice) -> { Optional mayBeProduct = findProduct(id); mayBeProduct.ifPresent(product -> product.setPrice(newPrice)); return mayBeProduct.get(); } |- ! [[javascript|JavaScript]] | var square = function(number) {return number * number}; (([[https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Functions|Описание в справочнике «Ядро JavaScript»]])) В [[ecmascript|ECMAScript]] 6 (также известном как ECMAScript 2015) были добавлены Arrow Functions: var sum = (x,y) => x+y (([[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions|Arrow functions]]. Mozilla Developer Network. Проверено 30 декабря 2015.)) |- ! [[lua|Lua]] | function(x,y) return x+y end |- ! [[maple|Maple]] | (x, y) -> x + y |- ! [[mathematica|Mathematica]] | #1+#2& или Function[#1+#2] или Function[{x,y},x+y] (([[http://documents.wolfram.com/mathematica/functions/Function|Mathematica Documentation: Function (&)]])) |- ! [[matlab|MATLAB]] | f=@(x,y) x+y |- ! [[maxima|Maxima]] | lambda([x,y], x+y) |- ! [[perl|Perl]] | sub { return $_[0] + $_[1] } (([[http://perldoc.perl.org/perlref.html|perldoc perlref]] (англ.))) |- ! [[php|PHP]] | // PHP 5.3 function($x, $y) { return $x + $y; } (([[http://php.net/functions.anonymous|PHP Manual]])) // PHP 4 >= 4.0.1, PHP 5 create_function('$x, $y', 'return $x + $y;') (([[http://php.net/create_function|PHP Manual]])) |- ! [[python|Python]] | lambda х, у: х+у (([[http://fantom-lab.narod.ru/Python/LerningNoName/Chapter-08/08.htm#6|Раздел учебника «Освой Python за 24 часа самостоятельно»]])) |- ! [[r-язык-программирования-|R]] | function(x,y) x+y |- ! [[ruby|Ruby]] | proc{|x,y| x + y } (([[http://www.rubycentral.com/book/tut_containers.html|Описание в книге «Programming Ruby»]] (англ.))) |- ! [[rust-язык-программирования-|Rust]] | | x: uint, y: uint | x + y |- ! [[scheme|Scheme]], [[common-lisp|Common Lisp]] | (lambda (x y) (+ x y)) |- ! [[sml|SML]] | fn (x, y) => x + y |- ! [[visual-prolog|Visual Prolog]] | {(X,Y)=X+Y} |} =====См. также===== * [[замыкание-программирование-|Замыкание (программирование)]] * [[callback-программирование-|Callback (программирование)]] {{tag>"Концепции языков программирования" "Статьи с примерами кода Rust (страница отсутствует)"}}