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 (страница отсутствует)"}}