Funções anônimas em D

Podemos usar funções anônimas em D .

delegate palavra chave

Exemplo com argumento:

import std.stdio;

void evenNumbers(int[] numbers, void delegate(int) callback) {
foreach (int number; numbers) {
if (number % 2 == 0) callback(number);
}
}

void main() {
auto numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
evenNumbers
(numbers, (num) => writeln(num));
// or numbers.evenNumbers((num) => writeln(num));
// or numbers.evenNumbers((num) { writeln(num); });
}

Nesse caso, (num) => writeln(num)é um argumento, uma função que pode ser chamada.

Resultado:

% rdmd delegate.d
2
4
6
8
10

Sintaxe alternativa, estilo de blocos de ruby:

import std.stdio, std.string, std.file, std.path;

void withingDir(string dir, void delegate() callback) {
auto cwd = absolutePath(".").chomp(".");
writeln
("Current directory is: ", cwd);
chdir
(dir);
callback
();
chdir
(cwd);
}

void main() {
withingDir
("/var", {
writefln
("I'm in %s", absolutePath(".").chomp("."));
});
}

Resultado:

% rdmd delegate.d
Current directory is: /Users/pavel/d-try/
I
'm in /private/var/

Se eu quiser ter uma sintaxe mais rubish, posso fazer assim:

alias void delegate() Block;

void withingDir(string dir, Block callback) {
...
}

function palavra-chave.

Não sei qual é a diferença entre delegatee functioneles fazendo o mesmo trabalho.

Exemplo um:

import std.stdio;

void evenNumbers(int[] numbers, void function(int) callback) {
foreach (int number; numbers) {
if (number % 2 == 0) callback(number);
}
}

void main() {
auto numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
numbers
.evenNumbers(function (num) {
writeln
(num);
});
}

Exemplo dois:

import std.stdio, std.string, std.file, std.path;

void withingDir(string dir, void function() callback) {
auto cwd = absolutePath(".").chomp(".");
writeln
("Current directory is: ", cwd);
chdir
(dir);
callback
();
chdir
(cwd);
}

void main() {
withingDir
("/var", function () {
writefln
("I'm in %s", absolutePath(".").chomp("."));
});
// or withingDir("/var", { ... });
}

Consulte Mais informação: