Skip to content

Commit 359a182

Browse files
committed
Adopt rust fences
1 parent dc2e147 commit 359a182

File tree

1 file changed

+87
-77
lines changed

1 file changed

+87
-77
lines changed

active/0000-higher-ranked-trait-bounds.md

Lines changed: 87 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -15,99 +15,109 @@ canonical example of where you want this is if you would like a
1515
closure that accepts a reference with any lifetime. For example,
1616
today you might write:
1717

18-
fn with(callback: |&Data|) {
19-
let data = Data { ... };
20-
callback(&data)
21-
}
18+
```rust
19+
fn with(callback: |&Data|) {
20+
let data = Data { ... };
21+
callback(&data)
22+
}
23+
```
2224

2325
If we try to write this using unboxed closures today, we have a problem:
2426

25-
fn with<'a, T>(callback: T)
26-
where T : FnMut(&'a Data)
27-
{
28-
let data = Data { ... };
29-
callback(&data)
30-
}
31-
32-
// Note that the `()` syntax is shorthand for the following:
33-
fn with<'a, T>(callback: T)
34-
where T : FnMut<(&'a Data,),()>
35-
{
36-
let data = Data { ... };
37-
callback(&data)
38-
}
27+
```
28+
fn with<'a, T>(callback: T)
29+
where T : FnMut(&'a Data)
30+
{
31+
let data = Data { ... };
32+
callback(&data)
33+
}
34+
35+
// Note that the `()` syntax is shorthand for the following:
36+
fn with<'a, T>(callback: T)
37+
where T : FnMut<(&'a Data,),()>
38+
{
39+
let data = Data { ... };
40+
callback(&data)
41+
}
42+
```
3943

4044
The problem is that the argument type `&'a Data` must include a
4145
lifetime, and there is no lifetime one could write in the fn sig that
4246
represents "the stack frame of the `with` function". Naturally
4347
we have the same problem if we try to use an `FnMut` object (which is
4448
the closer analog to the original closure example):
4549

46-
fn with<'a>(callback: &mut FnMut(&'a Data))
47-
{
48-
let data = Data { ... };
49-
callback(&data)
50-
}
51-
52-
fn with<'a>(callback: &mut FnMut<(&'a Data,),()>)
53-
{
54-
let data = Data { ... };
55-
callback(&data)
56-
}
50+
```rust
51+
fn with<'a>(callback: &mut FnMut(&'a Data))
52+
{
53+
let data = Data { ... };
54+
callback(&data)
55+
}
56+
57+
fn with<'a>(callback: &mut FnMut<(&'a Data,),()>)
58+
{
59+
let data = Data { ... };
60+
callback(&data)
61+
}
62+
```
5763

5864
Under this proposal, you would be able to write this code as follows:
5965

60-
// Using the FnMut(&Data) notation, the &Data is
61-
// in fact referencing an implicit bound lifetime, just
62-
// as with closures today.
63-
fn with<T>(callback: T)
64-
where T : FnMut(&Data)
65-
{
66-
let data = Data { ... };
67-
callback(&data)
68-
}
69-
70-
// If you prefer, you can use an explicit name,
71-
// introduced by the `for<'a>` syntax.
72-
fn with<T>(callback: T)
73-
where T : for<'a> FnMut(&'a Data)
74-
{
75-
let data = Data { ... };
76-
callback(&data)
77-
}
78-
79-
// No sugar at all.
80-
fn with<T>(callback: T)
81-
where T : for<'a> FnMut<(&'a Data,),()>
82-
{
83-
let data = Data { ... };
84-
callback(&data)
85-
}
66+
```
67+
// Using the FnMut(&Data) notation, the &Data is
68+
// in fact referencing an implicit bound lifetime, just
69+
// as with closures today.
70+
fn with<T>(callback: T)
71+
where T : FnMut(&Data)
72+
{
73+
let data = Data { ... };
74+
callback(&data)
75+
}
76+
77+
// If you prefer, you can use an explicit name,
78+
// introduced by the `for<'a>` syntax.
79+
fn with<T>(callback: T)
80+
where T : for<'a> FnMut(&'a Data)
81+
{
82+
let data = Data { ... };
83+
callback(&data)
84+
}
85+
86+
// No sugar at all.
87+
fn with<T>(callback: T)
88+
where T : for<'a> FnMut<(&'a Data,),()>
89+
{
90+
let data = Data { ... };
91+
callback(&data)
92+
}
93+
```
8694

8795
And naturally the object form(s) work as well:
8896

89-
// The preferred notation, using `()`, again introduces
90-
// implicit binders for omitted lifetimes:
91-
fn with(callback: &mut FnMut(&Data))
92-
{
93-
let data = Data { ... };
94-
callback(&data)
95-
}
96-
97-
// Explicit names work too.
98-
fn with(callback: &mut for<'a> FnMut(&'a Data))
99-
{
100-
let data = Data { ... };
101-
callback(&data)
102-
}
103-
104-
// The fully explicit notation requires an explicit `for`,
105-
// as before, to declare the bound lifetimes.
106-
fn with(callback: &mut for<'a> FnMut<(&'a Data,),()>)
107-
{
108-
let data = Data { ... };
109-
callback(&data)
110-
}
97+
```rust
98+
// The preferred notation, using `()`, again introduces
99+
// implicit binders for omitted lifetimes:
100+
fn with(callback: &mut FnMut(&Data))
101+
{
102+
let data = Data { ... };
103+
callback(&data)
104+
}
105+
106+
// Explicit names work too.
107+
fn with(callback: &mut for<'a> FnMut(&'a Data))
108+
{
109+
let data = Data { ... };
110+
callback(&data)
111+
}
112+
113+
// The fully explicit notation requires an explicit `for`,
114+
// as before, to declare the bound lifetimes.
115+
fn with(callback: &mut for<'a> FnMut<(&'a Data,),()>)
116+
{
117+
let data = Data { ... };
118+
callback(&data)
119+
}
120+
```
111121

112122
The syntax for `fn` types must be updated as well to use `for`.
113123

0 commit comments

Comments
 (0)