`impl <'a> Config <'a> {`

时间:2019-06-01 23:27:51

标签: rust lifetime

对于以下代码:

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做什么,第二个function fn(el, isEnter) { el.className = ""; requestAnimationFrame(() => { requestAnimationFrame(() => { el.className = isEnter? "in": "out"; }); }); }做什么?

2 个答案:

答案 0 :(得分:3)

第一个<'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”)。< / p>

答案 1 :(得分:3)

所有通用生存期和类型都需要在某个地方声明。

尝试编译您的代码以使用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
}

另请参阅: