Rust中对函数返回值直接调用as_str与先赋值变量再调用的区别是什么?
Rust临时值生命周期与借用检查问题解答
核心原因
as_str() 方法返回的是 &str 类型,本质是对所属 String 的借用引用,Rust的借用规则要求:引用的生命周期绝对不能超过被引用的所有者的生命周期,否则会产生悬垂引用,这是借用检查器明确禁止的行为。
两种写法的本质差异是 getConfig 返回的 String 类型值的生命周期长度不同:
第一种正常写法的生命周期逻辑
let config = getConfig("key"); let conf = config.as_str();
getConfig返回的String被直接绑定到了config变量,变量的生命周期覆盖整个main函数作用域,只要main函数没有执行结束,这个String就不会被释放。- 后续调用
as_str得到的&str引用生命周期和config变量绑定,直到print执行时引用依然有效,因此不会报错。
第二种链式调用报错的逻辑
let config = getConfig("key").as_str();
getConfig("key")返回的String没有被绑定到任何变量,属于临时值,按照Rust的临时值生命周期规则,它的生命周期仅到当前语句结束为止。- 你在同一条语句中调用
as_str得到了指向这个临时String的引用,语句执行结束后临时String就被自动释放,此时赋值给config的&str已经是悬垂引用,下一行print还要使用这个无效引用,自然会触发E0716报错。
拓展说明
如果想缩短代码行数不想额外绑定变量,也可以直接消费String本身而不是借用,比如直接把链式调用的结果传给print,不需要保留引用:
fn main() { print!("{}", getConfig("key")) }
这种写法下临时String会在print语句执行结束后才释放,全程引用有效,不会报错。
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

