Синтаксическое значение для `impl <'a> Config <' a> {` - PullRequest
0 голосов
/ 02 июня 2019

Для следующего кода:

struct Config<'a> {
    query: &'a str,
    filename: &'a str,
    case_sensitive: bool,
}

impl<'a> Config<'a> {
    pub fn new(args: &'a [String]) -> Result<Config, &'static str> {
        if args.len() < 3 {
            return Err("not enough arguments");
        }

        let query = &args[1];
        let filename = &args[2];

        let case_sensitive = env::var("CASE_INSENSITIVE").is_err();

        Ok(Config {
            query,
            filename,
            case_sensitive,
        })
    }
}

Почему требуется impl<'a> Config<'a> {, а не impl Config<'a> {?

Каково синтаксическое значение первого и второго 'a?Я знаю, что 'a - это аннотация на всю жизнь, но я не знаю, почему она помещается после impl и Config.Что делает первый 'a и что делает второй 'a

Ответы [ 2 ]

3 голосов
/ 02 июня 2019

Все общие времена жизни и типы должны быть где-то объявлены.

Попробуйте скомпилировать код для использования impl Config<'a>, и вы получите это сообщение об ошибке:

error[E0261]: use of undeclared lifetime name `'a`
 --> src/lib.rs:9:13
  |
9 | impl Config<'a> {
  |             ^^ undeclared lifetime

Как и параметры типа, общие параметры времени жизни, такие как 'a в Config<'a>, должны быть объявлены в каждой функции, определении типа или реализации признака, которые они используют.У них даже не должно быть точно такого же имени, как у первоначально объявленного параметра:

impl<'c> Config<'c> {
    ... // use 'c instead of 'a
}

См. Также:

3 голосов
/ 02 июня 2019

Первый <'a> объявляет контекст, который вводит переменные, которые универсально определены количественно.Другими словами, impl<'a> ... означает "реализовать для любое возможное время жизни 'a ...".

Как только переменные введены, вторая 'a является приложениемпеременная типа.

Синтаксис impl<'a> Config<'a> можно прочитать как: «для любой возможный время жизни 'a, эти методы определены для Config<'a>».

В более сложной ситуации контекст является тем, где вы можете наложить ограничения на параметры.Для жизней это всегда отношения «переживет», например <'a, 'b: 'a> («для всех жизней 'a и 'b, где 'b переживает 'a»).Для типов это может включать как черты характера, так и границы времени жизни, например, <'a, T: + Debug + 'a> («для всех времен жизни 'a и всех типов T, где T реализует Debug и не переживает 'a»).

...