borrowfix/
lib.rs

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
7/// create a static refrence
8/// using https://github.com/rust-lang/rust/issues/25860
9pub fn remember<'a, T>(data: &'a T) -> &'static T {
10    let f: fn(_, &'a T) -> &'static T = lifetime_helper;
11    f(&&(), data)
12}
13
14/// change a mutable refrence's lifetime
15/// using https://github.com/rust-lang/rust/issues/25860
16pub 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}