@@ -15,99 +15,109 @@ canonical example of where you want this is if you would like a
15
15
closure that accepts a reference with any lifetime. For example,
16
16
today you might write:
17
17
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
+ ```
22
24
23
25
If we try to write this using unboxed closures today, we have a problem:
24
26
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
+ ```
39
43
40
44
The problem is that the argument type ` &'a Data ` must include a
41
45
lifetime, and there is no lifetime one could write in the fn sig that
42
46
represents "the stack frame of the ` with ` function". Naturally
43
47
we have the same problem if we try to use an ` FnMut ` object (which is
44
48
the closer analog to the original closure example):
45
49
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
+ ```
57
63
58
64
Under this proposal, you would be able to write this code as follows:
59
65
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
+ ```
86
94
87
95
And naturally the object form(s) work as well:
88
96
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
+ ```
111
121
112
122
The syntax for ` fn ` types must be updated as well to use ` for ` .
113
123
0 commit comments