2017-12-29 17 views
0

을 가지고 나는 녹에 lifetime 복잡 장난되었고, 나는 다음과 같은 코드를 작성 결국 :이해 심판 구조체와 그것의 구성원은 서로 다른 수명

trait Boss<'a, 'c> { 
    fn work(&self, &'a i32) -> &'c i32; 
} 

struct Human<'c> { 
    i:&'c i32 
} 

impl<'a, 'b, 'c> Boss<'a, 'c> for &'b Human <'c> { 
    fn work(&self, v:&'a i32) -> &'c i32 { 
    &self.i 
    } 
} 


fn main() { 
    let h = Human {i:&1}; 
} 

이 코드는 컴파일을하지만, 나는 확실하지 않다 왜. 내가 이해하는 바와 같이, &Human의 수명은 'b이며, 참조 자 istruct Human입니다. 'c입니다. 왜 컴파일러는 'b'c보다 오랫동안 남아있을 수 있다고 불평하지 않습니까?

답변

0

h : Human<'static>'static 참조는 출력 수명 요건을 충족합니다.

h.i이 h보다 수명이 짧은 변수를 참조하는 코드를 작성해보십시오.

fn main() { 
    let mut h = Human {i:&1}; 
    { 
     let x : i32 = 3; 
     h.i = &x; 
    } 
    let r = (&h).work(&3); 
} 

error[E0597]: `x` does not live long enough 
    --> a.rs:21:5 
    | 
20 |   h.i = &x; 
    |    - borrow occurs here 
21 |  } 
    | ^`x` dropped here while still borrowed 
22 |  let r = (&h).work(&3); 
23 | } 
    | - borrowed value needs to live until here