2014-12-17 2 views
1

저는 녹이기 전부터 또는 심지어 베어 메탈에 닿는 이러한 언어에도 완전히 초보자입니다.Rust에서 클로저 유형의 별명을 지정했지만 컴파일러에서 평생 지정자를 묻습니다.

필자는 몇 가지 포인터를 인수로 취하고 문자열을 반환하는 클로저 형식을 별칭으로 지정하려고했습니다.

pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 

을 그리고 컴파일러가 모든 포인터 인수에 대해 평생 지정자를 추가하는 나를 필요합니다 : 최신 구문 (내가 제대로 이해하는 경우)와 함께 내가 쓴

src/helpers.rs:24:26: 24:49 error: missing lifetime specifier [E0106] 
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 
              ^~~~~~~~~~~~~~~~~~~~~~~ 
src/helpers.rs:24:43: 24:48 error: missing lifetime specifier [E0106] 
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 
                  ^~~~~ 
src/helpers.rs:24:44: 24:48 error: explicit lifetime bound required 
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 
                  ^~~~ 
src/helpers.rs:24:51: 24:58 error: missing lifetime specifier [E0106] 
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 
                    ^~~~~~~ 
src/helpers.rs:24:60: 24:69 error: missing lifetime specifier [E0106] 
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 
                      ^~~~~~~~~ 
src/helpers.rs:24:61: 24:69 error: wrong number of lifetime parameters: expected 1, found 0 [E0107] 
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 
                       ^~~~~~~~ 
src/helpers.rs:24:71: 24:89 error: missing lifetime specifier [E0106] 
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 
                         ^~~~~~~~~~~~~~~~~~ 
src/helpers.rs:24:76: 24:89 error: wrong number of lifetime parameters: expected 1, found 0 [E0107] 
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 
                          ^~~~~~~~~~~~~ 
src/helpers.rs:24:22: 24:99 error: explicit lifetime bound required 
src/helpers.rs:24 pub type HelperDef = Fn<(&HashMap<String, &Show>, &Helper, &Registry, &mut RenderContext), String>; 
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
error: aborting due to 9 previous errors 

난에 대한 완전히 혼란 스러워요 말을해야 평생 지정자들. 이 기능으로 만 사용자 정의 특성을 정의하여 동일한 기능을 구현할 수 있으며 컴파일러는 이런 방식으로 이러한 포인터에 대해 평생을 요구하지 않습니다. 하지만 공유 폐쇄를 사용하는 것이 API 수준에서 더 아름답다고 생각합니다.

답변

2

전역 수준에서는 형식 유추가 없습니다. 함수 정의 (즉, fn x<'a>(&'a self) -> &'a Foo을 작성하지 말고 fn x(&self) -> &Foo과 같은 것을 작성하는 방법)에 대한 평생 엘레멘트 규칙을 제외하고는 모든 것을 명시 적으로 작성해야합니다.

은 완전한 콘크리트 유형이 아니기 때문에이 경우에 중요합니다.. 두 가지 문제가 함께 있습니다

  1. Fn특성 아닌 구체적인 유형입니다; 상자에 넣지 않은 클로저 (Box<Fn<…, …>>, 우발적으로는 Box<Fn(…) -> …>이라고 쓰여질 수 있음)를 포장하거나 필요하면 어디에서나 제네릭을 찾아야합니다.

  2. 평생 동안은 부족합니다.

첫 번째 점을 무시하고 두 번째 점에 대해 걱정 해 봅시다. 당신이 실제로 작성해야하는이 라인을 따라 뭔가 :

pub type HelperDef<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h> = 
    Fn(&'a HashMap<String, &'b Show>, &'c Helper, &'d Registry<'e>, 
     &'f mut RenderContext<'g>) -> String + 'h; 

사람들의 대부분은 이해한다, 그러나 'h 하나는 + 'h 너무 많이하지 않을 수 있습니다 : Fn는 특성 때문에 하나입니다; 특성 (크기가 정해지지 않은 유형이 될 것입니다. 동적 크기 형은 긴 설명입니다. 여기서 설명하려고하지는 않을 것입니다.), 수명 제한은 명시 적으로 만들어 져야합니다. 오류).

+0

설명해 주셔서 감사합니다. 매우 도움이됩니다. 이 사실을 완전히 이해하려면 시간이 필요합니다. 사방 8 명을 지정하는 것은 악몽 일 수 있습니다. 어쩌면 특성 기반 설계로 다시 전환해야합니다. –

+1

더 높은 평생을 사용하는 것이 더 좋지 않겠습니까? '펍 유형 HelperDef <'a> = for' ','c, 'd,'e, 'f,'g ''h> Fn (& b bashMap , & d 도우미, –

+0

@ FrancisGagné : 이전에는 실제로 그것을 실제로 경험하지 못했습니까? 실제로는 실제로 무엇을 의미합니까? –