Rust中生命周期约束'b: 'a的含义及编译疑惑解析
fn longest<'a, 'b: 'a>(s1: &'a str, s2: &'b str) -> &'a str { if s1.len() > s2.len() { s1 } else { s2 } } fn main() -> Result<(), StdSafeDynError> { let myS1 = String::from("xxxx"); let myS1Ref = &myS1; { let myS2 = String::from("yyy"); let res = longest(myS1Ref, &myS2); DEBUG!("{:?} is the longest", res); } Ok(()) }
Rust生命周期问题解答
1. 'b: 'a 是否表示生命周期关系为 'b >= 'a?
是的,'b: 'a 是生命周期约束语法,含义为生命周期'b的存活范围至少覆盖'a的整个范围,也就是'b的存活时间不短于'a。
2. 为何myS1Ref存活时间长于myS2,编译器却未报错?
编译器不会直接把函数签名里的生命周期占位符和实参的原始生命周期绑定,而是会根据调用场景推导合适的具体生命周期:
myS1Ref的原始生命周期是从myS1创建到main函数结束(记为'long)&myS2的原始生命周期是从myS2创建到内部代码块结束(记为'short)
在这次调用中,编译器将'a推导为'short,'b推导为'long,此时'long完全覆盖'short,满足'b: 'a的约束。同时函数返回的&'a str(即&'short str)仅需要在内部代码块内有效,而res确实在myS2销毁前就完成了使用,因此不会触发报错。
3. 关于编译器不固定绑定生命周期占位符、甚至可交换角色的说法是否正确?
这个说法完全正确。
函数签名里的'a、'b只是生命周期的占位符,编译器在每次调用时会根据实参的实际生命周期,为这些占位符匹配能满足所有约束的具体生命周期值,而非严格按照参数顺序绑定。只要最终的生命周期组合符合函数签名里的约束条件,编译器就会通过检查,甚至可以像这个例子一样,让第一个参数的生命周期对应'b,第二个参数的对应'a,只要满足'b: 'a即可。
内容的提问来源于stack exchange,提问作者phil skillwon
相关产品推荐
相关产品推荐

