Анонимная функция: различия между версиями
[отпатрулированная версия] | [непроверенная версия] |
Juni85 (обсуждение | вклад) Нет описания правки |
Olegrok (обсуждение | вклад) м + Go |
||
Строка 187: | Строка 187: | ||
| |
| |
||
<source lang="prolog">{(X,Y)=X+Y}</source> |
<source lang="prolog">{(X,Y)=X+Y}</source> |
||
|- |
|||
! [[Go]] |
|||
| |
|||
<source lang="prolog"> |
|||
Z := func() int { |
|||
return X + Y |
|||
}() |
|||
</source> |
|||
|} |
|} |
||
Версия от 11:54, 7 декабря 2017
Анонимная функция в программировании — особый вид функций, которые объявляются в месте использования и не получают уникального идентификатора для доступа к ним. Поддерживаются во многих языках программирования.
Обычно при создании анонимные функции либо вызываются напрямую, либо ссылка на функцию присваивается переменной, с помощью которой затем можно косвенно вызывать данную функцию. Если анонимная функция ссылается на переменные, не содержащиеся в её теле (захват), то такая функция называется замыканием. Лямбда-выражение — типичная для многих языков синтаксическая конструкция для определения анонимной функции.
Синтаксис
Синтаксис записи анонимных функций для различных языков программирования в большинстве случаев сильно различается.
Язык | Пример записи сложения |
---|---|
AS3 |
function(x:int, y:int):int{return x + y;}
|
C# |
(x,y) => x+y
|
C++ | Введены в C++11. Обязательно должны присутствовать захват и тело. Полная форма[1]:
[захват](параметры)mutable исключения атрибуты->возвращаемый_тип{тело}
[](int x, int y){ return x + y; }
В С++14 была добавлена возможность использовать лямбда-функции с auto lambda = [](auto x, auto y) {return x + y;};
int a; auto f = [a](){return a;}
[a = std::string{}](){return a;}
|
CoffeeScript |
(x, y) -> x + y
|
PascalABC.NET |
(x, y) -> x + y
|
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 (c 2009 версии) |
function(x, y: integer): integer
begin
result := x+y;
end;
|
Erlang |
fun(X,Y)->X+Y end
|
Scala |
Без указания контекста надо указывать тип переменных: (x: Int, y: Int) => x + y
Но в местах, где тип может быть выведен, можно использовать сокращенные формы: (1 to 100) reduce ((a, b) => a+b)
Или ещё короче, с использованием автоподстановок '_': (1 to 100) reduce (_ + _)
|
GNU Octave |
@(x,y)x+y
|
Groovy |
{x, y -> x + y}
|
Haskell |
\x y -> x + y
|
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<Product> mayBeProduct = findProduct(id);
mayBeProduct.ifPresent(product -> product.setPrice(newPrice));
return mayBeProduct.get();
}
|
JavaScript |
var square = function(number) {return number * number};
var sum = (x,y) => x+y;
|
Lua |
function(x,y) return x+y end
|
Maple |
(x, y) -> x + y
|
Mathematica |
#1+#2&
или Function[#1+#2]
или Function[{x,y},x+y]
|
MATLAB |
f=@(x,y) x+y
|
Maxima |
lambda([x,y], x+y)
|
Perl |
sub { return $_[0] + $_[1] }
|
PHP |
// PHP 5.3
function($x, $y) use ($a, &$b) { return $x + $y; }
$a, $b - захваченные переменные, при этом переменная $b ещё и замкнутая[8][9]. // PHP 4 >= 4.0.1, PHP 5
create_function('$x, $y', 'return $x + $y;')
|
Python |
lambda х, у: х+у
|
R |
function(x,y) x+y
|
Ruby |
proc{|x,y| x + y }
|
Rust |
| x: uint, y: uint | x + y
|
Scheme, Common Lisp |
(lambda (x y) (+ x y))
|
SML |
fn (x, y) => x + y
|
Visual Prolog |
{(X,Y)=X+Y}
|
Go |
Z := func() int {
return X + Y
}()
|
См. также
Примечания
- ↑ анонимные функции .
- ↑ C++11. Лямбда-выражения
- ↑ Sutter, Herb Trip Report: ISO C++ Spring 2013 Meeting . isocpp.org (20 апреля 2013). Дата обращения: 14 июня 2013.
- ↑ Описание в справочнике «Ядро JavaScript»
- ↑ Arrow functions . Mozilla Developer Network. Дата обращения: 30 декабря 2015.
- ↑ Mathematica Documentation: Function (&)
- ↑ perldoc perlref (англ.)
- ↑ M. Zandstra, “PHP Objects, Patterns, and Practice”, second edition, Ed. Apress, 2008.
- ↑ PHP Manual
- ↑ PHP Manual
- ↑ Раздел учебника «Освой Python за 24 часа самостоятельно»
- ↑ Описание в книге «Programming Ruby» (англ.)