add section about delegates
This commit is contained in:
parent
b291db0e97
commit
35a2431739
1 changed files with 59 additions and 0 deletions
|
@ -67,6 +67,10 @@
|
||||||
- [Other templates](#other-templates)
|
- [Other templates](#other-templates)
|
||||||
- [Template value parameters](#template-value-parameters)
|
- [Template value parameters](#template-value-parameters)
|
||||||
- [Other template parameters](#other-template-parameters)
|
- [Other template parameters](#other-template-parameters)
|
||||||
|
- [Delegates](#delegates)
|
||||||
|
- [Functions as arguments](#functions-as-arguments)
|
||||||
|
- [Local functions with context](#local-functions-with-context)
|
||||||
|
- [Anonymous functions and lambdas](#anonymous-functions-and-lambdas)
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
|
@ -1003,3 +1007,58 @@ void print(Args...)(Args args) {
|
||||||
print(42, 3.5f, "foo");
|
print(42, 3.5f, "foo");
|
||||||
print(); // also valid, prints nothing
|
print(); // also valid, prints nothing
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Delegates
|
||||||
|
|
||||||
|
#### Functions as arguments
|
||||||
|
|
||||||
|
Global functions can be referenced using the `function` type:
|
||||||
|
|
||||||
|
```D
|
||||||
|
void doSomething(int function(int, int) doer) {
|
||||||
|
// call passed function
|
||||||
|
doer(5,5);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto add(int a, int b) {
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
doSomething(&add);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Local functions with context
|
||||||
|
|
||||||
|
To reference member functions or local functions, `delegate`s have to be used. You
|
||||||
|
can create _closures_ with this:
|
||||||
|
|
||||||
|
```D
|
||||||
|
auto foo() {
|
||||||
|
int x = 42;
|
||||||
|
auto local() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
return &local;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto f = foo();
|
||||||
|
static assert(is(typeof(f) == int delegate() pure nothrow @nogc @safe));
|
||||||
|
writeln(f()); // 42
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Anonymous functions and lambdas
|
||||||
|
You can write anonymous functions and lambdas like this:
|
||||||
|
|
||||||
|
```D
|
||||||
|
auto add = (int lhs, int rhs) {
|
||||||
|
return lhs + rhs;
|
||||||
|
};
|
||||||
|
|
||||||
|
auto lambdaAdd = (int lhs, int rhs) => lhs + rhs;
|
||||||
|
```
|
||||||
|
|
||||||
|
These are often passed as template arguments in the functional parts of Phobos:
|
||||||
|
|
||||||
|
```D
|
||||||
|
[1, 2, 3].reduce!((a, b) => a + b)();
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in a new issue