Rust代码返回不同来源引用报错的原因咨询(无需解决方案)
Rust代码报错的具体原因分析
先看你写的代码:
fn main() { let strings = vec![String::from("hello")]; let default = String::from("default"); let s = first_or(&strings, &default); println!("{}", s); } fn first_or(strings: &Vec<String>, default: &String) -> &String { if strings.len() > 0 { &strings[0] } else { default } }
这段代码报错的核心是Rust编译器的生命周期推断无法处理分支返回不同来源引用的情况。
具体细节:
- 当不给函数参数的引用标注生命周期时,编译器会给每个引用分配独立的匿名生命周期。比如
strings: &Vec<String>会被推断为&'a Vec<String>,default: &String会被推断为&'b String,'a和'b是两个无关联的生命周期。 - 函数返回值
&String,编译器会尝试按规则将其与某一个参数的生命周期绑定,但你的函数在不同分支返回了两个不同生命周期来源的引用:一个是和strings绑定的&strings[0](生命周期'a),另一个是和default绑定的default(生命周期'b)。 - 编译器无法确定返回值的生命周期该取
'a还是'b——因为这两个生命周期对应的变量存活时间可能完全不同,编译器没办法保证返回的引用在调用者处始终有效,因此会抛出生命周期不匹配的错误。
内容的提问来源于stack exchange,提问作者Ankur Mallick
相关产品推荐
相关产品推荐

