blob: 17ad8a6b54858f0e6c56c12e5af9939f57997385 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
// Go's defer in Rust, with a little twist!
struct Defer<F: Fn()> {
f: F
}
impl <F: Fn()> Drop for Defer<F> {
fn drop(&mut self) {
(self.f)()
}
}
// Only added this for Go-syntax familiarity ;-)
fn defer<F: Fn()>(f: F) -> Defer<F> {
Defer { f }
}
// Changed your mind about the defer?
// (Note: This leaks the closure! Don't actually do this!)
fn undefer<F: Fn()>(token: Defer<F>) {
use std::mem;
mem::forget(token);
}
fn main() {
let mut i = 1;
// Calling it "token" ... could be something else. The lifetime of this
// controls when the action is run.
let token = defer(move || println!("Value is: {}", i));
i += 1;
println!("Value is: {}", i);
// Oh, now I changed my mind about the previous defer:
undefer(token);
}
// Prints:
// Value is: 2
|