Skip to content

Commit 8e0bb03

Browse files
committed
Merge pull request #20820 from sellibitze/closure-doc
Closure documentation: Fix boxed closure left-over Reviewed-by: steveklabnik
2 parents 3d5a102 + d4b70fe commit 8e0bb03

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

src/doc/trpl/closures.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -110,25 +110,27 @@ passing two variables: one is an i32, and one is a function."
110110
Next, let's look at how `twice` is defined:
111111

112112
```{rust,ignore}
113-
fn twice(x: i32, f: |i32| -> i32) -> i32 {
113+
fn twice<F: Fn(i32) -> i32>(x: i32, f: F) -> i32 {
114114
```
115115

116116
`twice` takes two arguments, `x` and `f`. That's why we called it with two
117117
arguments. `x` is an `i32`, we've done that a ton of times. `f` is a function,
118-
though, and that function takes an `i32` and returns an `i32`. Notice
119-
how the `|i32| -> i32` syntax looks a lot like our definition of `square`
120-
above, if we added the return type in:
121-
122-
```{rust}
123-
let square = |&: x: i32| -> i32 { x * x };
124-
// |i32| -> i32
125-
```
126-
127-
This function takes an `i32` and returns an `i32`.
118+
though, and that function takes an `i32` and returns an `i32`. This is
119+
what the requirement `Fn(i32) -> i32` for the type parameter `F` says.
120+
You might ask yourself: why do we need to introduce a type parameter here?
121+
That is because in Rust each closure has its own unique type.
122+
So, not only do closures with different signatures have different types,
123+
but different closures with the *same* signature have *different* types!
124+
You can think of it this way: the behaviour of a closure is part of its type.
125+
And since we want to support many different closures that all take
126+
an `i32` and return an `i32` we introduced a type parameter that is able
127+
to represent all these closures.
128128

129129
This is the most complicated function signature we've seen yet! Give it a read
130130
a few times until you can see how it works. It takes a teeny bit of practice, and
131-
then it's easy.
131+
then it's easy. The good news is that this kind of passing a closure around
132+
can be very efficient. With all the type information available at compile-time
133+
the compiler can do wonders.
132134

133135
Finally, `twice` returns an `i32` as well.
134136

0 commit comments

Comments
 (0)