2016-09-24 4 views
0

대신 발신자 측의 함수로 권투를 이동하는 방법 : 나는 또한 다른 구조에서 이러한 구조를 저장하고자내가 어떤 구조의 특성과 그 구현이

trait Named { 
    fn name(&self) -> String; 
} 

struct Americano; 
impl Named for Americano { 
    fn name(&self) -> String { String::from("Caffè Americano") } 
} 

을 :

struct Menu { 
    item: Box<Named>, 
} 
impl Menu { 
    pub fn new(item: Box<Named>) -> Self { 
     Menu { item: item } 
    } 
} 

나는 main 기능 구조를 권투하고 때 경우에 완벽하게 작동합니다 :

fn main() { 
    let s = Menu::new(Box::new(Americano)); 
} 

나는 Menu의 함수 내에서 권투를 이동하고 같은 것을 사용하는 방법을 궁금 : I는 new 구현하기 위해 노력했다

fn main() { 
    let s = Menu::new(Americano); 
} 

:

impl Menu { 
    pub fn new<T: Named>(b: T) -> Self { 
     Menu { item: Box::new(b) }; 
    } 
} 

을하지만 난 오류가 발생

error: the parameter type `T` may not live long enough [--explain E0310] 
    --> <anon>:19:23 
    |> 
19 |>   Menu { item : Box::new(b) }; 
    |>      ^^^^^^^^^^^ 
help: consider adding an explicit lifetime bound `T: 'static`... 
note: ...so that the type `T` will meet its required lifetime bounds 

여기는 code in the playground입니다. 당신의 구조체에

답변

2

:

struct Menu { 
    item: Box<Named>, 
} 

Box<Named>는 암시 lifetime bound을 가지고 있으며, Box<Named + 'static>에 해당합니다. 따라서 이러한 요구 사항을 충족 시키려면 Menu::set으로 전달되는 값은 'static이어야합니다.

impl Menu { 
    pub fn set<T: Named + 'static>(b: T) -> Self { 
     Menu { item: Box::new(b) } 
    } 
} 

다른 옵션은 평생 바운드를 허용하도록 구조체를 일반화하는 것입니다.

struct Menu<'a> { 
    item: Box<Named + 'a> 
} 

impl<'a> Menu<'a> { 
    pub fn new(item: Box<Named + 'a>) -> Self { 
     Menu { item: item } 
    } 

    pub fn set<T: Named + 'a>(b: T) -> Self { 
     Menu { item: Box::new(b) } 
    } 
} 
+1

이 대답은 컴파일러가 제안 이유를 설명 * T'바인딩 명시 적으로 수명 추가하는 것을 고려 ... * – Shepmaster

+0

이 두 번째 변형은 충분합니다, 감사 'static'을. 아직도 궁금해서, 녹이 T가 충분히 오래 살지 못할 것이라고 생각하는 이유는 무엇입니까? 함수에 값의 소유권 (차용 제외)을 전달하고 값을 복싱하려고합니다. 전달 된 값이 어떻게 파괴 될 수 있는지 상상할 수 없습니까? –

+0

@seb_odessa : 소유권을 전달한 값은 빌린 포인터이거나 빌린 포인터를 포함 할 수 있습니다. 수명 한계는 컴파일러가 지시 대상을 초과하여 사용하는 방식으로 값을 이동하지 않는다는 것을 컴파일러가 확인하는 데 도움이됩니다. –