1#![forbid(unsafe_code)]
2
3fn lifetime_helper<'a, 'b, T>(_: &'a &'b (), v: &'b T) -> &'a T { v }
4
5fn lifetime_helper_mut<'a, 'b, T>(_: &'a &'b (), v: &'b mut T) -> &'a mut T { v }
6
7pub fn remember<'a, T>(data: &'a T) -> &'static T {
10 let f: fn(_, &'a T) -> &'static T = lifetime_helper;
11 f(&&(), data)
12}
13
14pub fn remember_mut<'a, 'b, T>(data: &'a mut T) -> &'b mut T {
17 let f: fn(_, &'a mut T) -> &'b mut T = lifetime_helper_mut;
18 f(&&(), data)
19}
20
21
22#[cfg(test)]
23mod tests {
24 use crate::remember;
25 #[test]
26 fn test_remember() {
27 let mut data = 1;
28 let refer = &data;
29 let refer = remember(refer);
30 let mut_refer = &mut data;
31 assert_eq!(*refer, 1);
32 *mut_refer = 2;
33 assert_eq!(*refer, 2);
34 }
35 #[test]
36 fn example() {
37 fn printit(s :String) {
38 println!("{}",s);
39 }
40
41 let s = String::new();
42 let refer = remember(&s);
43 printit(s);
44 println!("refer is {}",refer);
45 }
46}