수색…


통사론

  • fn 함수 <a> (x : & 'a Type)
  • struct Struct < 'a> {x : &'a Type}
  • enum Enum < 'a> {변형 (& a a Type)}
  • impl < 'a> Struct <'a> {fn x < 'a (self) -> &'a {self.x} 유형}
  • impl < 'a> 유형에 대한 특성 <'a>
  • impl < 'a> 유형 <'a>에 대한 특성
  • fn function<F>(f: F) where for<'a> F: FnOnce(&'a Type)
  • struct Struct<F> where for<'a> F: FnOnce(&'a Type) { x: F }
  • enum Enum<F> where for<'a> F: FnOnce(&'a Type) { Variant(F) }
  • impl<F> Struct<F> where for<'a> F: FnOnce(&'a Type) { fn x(&self) -> &F { &self.x } }

비고

  • Rust의 모든 참조는 명시 적으로 주석을 달지 않았더라도 수명이 있습니다. 컴파일러는 암시 적으로 수명을 할당 할 수 있습니다.
  • 'static 수명은 프로그램 바이너리에 저장된 참조에 할당되며 전체 실행 동안 유효합니다. 이 수명은 &'static str 유형의 문자열 리터럴에 가장 많이 할당됩니다.

함수 매개 변수 (입력 수명)

fn foo<'a>(x: &'a u32) {
    // ...
}

이것은 foo 수명이 'a 이고, 매개 변수 x 의 수명이 적어도 'a 이어야 함을 지정 'a . 기능 수명은 일반적으로 평생 elision을 통해 생략됩니다.

fn foo(x: &u32) {
    // ...
}

함수 파라미터 등 여러 참조를 취하고 참조를 반환하는 경우, 컴파일러는 수명 생략 통해 결과의 수명을 추정 할 수 없다.

error[E0106]: missing lifetime specifier
1 | fn foo(bar: &str, baz: &str) -> &i32 {
  |                                 ^ expected lifetime parameter

대신 평생 매개 변수를 명시 적으로 지정해야합니다.

// Return value of `foo` is valid as long as `bar` and `baz` are alive.
fn foo<'a>(bar: &'a str, baz: &'a str) -> &'a i32 {

함수는 여러 평생 매개 변수를 가질 수 있습니다.

// Return value is valid for the scope of `bar`
fn foo<'a, 'b>(bar: &'a str, baz: &'b str) -> &'a i32 {

구조체 필드

struct Struct<'a> {
    x: &'a u32,
}

이것은 Struct 주어진 인스턴스가 평생 'a , x 저장된 &u32 가 적어도 a의 수명을 가져야한다는 것을 지정 'a .

Impl 블록

impl<'a> Type<'a> {
    fn my_function(&self) -> &'a u32 {
        self.x
    }
}

이되도록 지정 Type 수명이 'a , 그리고에 의해 반환되는 참조하는 my_function() 더 이상 후 유효하지 않을 수있다 'a 때문에 끝 Type 더 이상 유지하기 위해 존재 self.x .

상위 순위 특성 경계

fn copy_if<F>(slice: &[i32], pred: F) -> Vec<i32>
    where for<'a> F: Fn(&'a i32) -> bool
{
    let mut result = vec![];
    for &element in slice {
        if pred(&element) {
            result.push(element);
        }
    }
    result
}

이것은 Fn 특성 바인딩에서 i32의 참조가 수명을 가질 수 있음을 지정합니다.

다음은 작동하지 않습니다.

fn wrong_copy_if<'a, F>(slice: &[i32], pred: F) -> Vec<i32>
    where F: Fn(&'a i32) -> bool
{                                   // <----------------+
    let mut result = vec![];        //       'a scope   |
    for &element in slice {         // <--------+       |
        if pred(&element) {         //          |       |
            result.push(element);   // element's|       |
        }                           //   scope  |       |
    }                               // <--------+       |
    result                          //                  |
}                                   // <----------------+

컴파일러에서 다음 오류를 제공합니다.

error: `element` does not live long enough
if pred(&element) {         //          |       |
         ^~~~~~~

왜냐하면 element 로컬 변수는 'a 평생 'a 만큼 길지 않기 때문입니다 (코드의 주석에서 볼 수 있듯이).

수명은 기능 수준에서 선언 할 수 없습니다. 다른 평생을 필요로하기 때문입니다. 그것이 for<'a> 사용 된 이유입니다. 참조가 모든 평생 동안 유효 할 수 있음을 지정하기 때문에 (따라서 더 작은 수명을 사용할 수 있습니다).

상위 순위 특성 경계는 구조체에도 사용할 수 있습니다.

struct Window<F>
    where for<'a> F: FnOnce(&'a Window<F>)
{
    on_close: F,
}

뿐만 아니라 다른 항목.

Higher-Rank 특성 경계는 Fn* 특성과 함께 가장 일반적으로 사용됩니다.

이 예제의 경우 수명 측정이 정상적으로 작동하므로 수명을 지정할 필요가 없습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow