2017-03-03 1 views
4

하나의 매개 변수와 동일한 수명의 연결된 유형을 반환하는 함수로 특성을 정의하려고합니다. (작동하지 않습니다 lifetime parameter not allowed on this type [Self::Output]를) 다음과 같은하나의 매개 변수와 같은 수명의 연결된 유형을 반환하는 함수로 특성 정의

개념적으로 뭔가 내가 스택 오버플로 인터넷하지만 없음에 관련된 유형의 수명에 대한 몇 가지 질문을 발견

trait Trait { 
    type Output; 
    fn get_output<'a>(&self, input: &'a i32) -> Self::Output<'a>; 
} 

도움이 보인다. 일부는 전체 특성에 수명을 정의 제안 :

trait Trait<'a> { 
    type Output; 
    fn get_output(&self, input: &'a i32) -> Self::Output; 
} 

을하지만이 작업 중 하나를하지 않습니다 : 그것은 컴파일하지만 다음 함수가 컴파일에 실패 :

fn f<'a, T>(var: &T) 
    where T: Trait<'a> 
{ 
    let input = 0i32; 
    let output = var.get_output(&input); 
} 

오류를주는 :

error: `input` does not live long enough 
    --> <anon>:9:35 
    | 
    |  let output = var.get_output(&input); 
    |         ^^^^^ does not live long enough 
    | } 
    | - borrowed value only lives until here 
    | 
note: borrowed value must be valid for the lifetime 'a as defined on the body at 7:48... 
    --> <anon>:7:49 
    | 
    | fn f<'a, T>(var : &T) where T : Trait<'a> { 
    | _________________________________________________^ starting here... 
    | |  let input = 0i32; 
    | |  let output = var.get_output(&input); 
    | | } 
    | |_^ ...ending here 

원하는 방식으로 특성을 정의해야합니까?

답변

4

밤에는 녹이더라도 현재 불가능합니다.

이것은 더 높은 종류의 HKT (Higher Kinded Types)가 필요하며, 현재의 접근 방식은 ATC (Associated Type Constructor)라고 불립니다.

ATC를 도입하기위한 주요 동기는 실제로는 바로이 유스 케이스입니다.

ATC로, 구문은 다음과 같습니다

trait Trait { 
    type Output<'a>; 
    fn get_output<'a>(&self, input: &'a i32) -> Self::Output<'a>; 
} 

참고 :이 ATCS에 대해 알고 싶다면, Niko's series of articles를 참조하십시오.

fn f<T>(var: &T) 
    where for<'a> T: Trait<'a> 
{ ... } 

그러나이 상당히 제한된다 (특히, 제한 : Shepmaster에서 언급 한 바와 같이 당신이, 당신이 HRTB와 함께이 문제를 해결할 수있는 특정 예를 들어


(고등는 특색 경계 위) 특성 경계).

관련 문제