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 delegate
e function
eles 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: