对于以下代码:
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";
});
});
}
做什么?
答案 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
}
另请参阅: