Rust如何在结构体方法中返回多个String字段拼接的字符串?
错误原因
- 所有报错的根源是Rust所有权的生命周期规则:你在
full_name方法内通过format!生成的局部变量s是String类型,它的生命周期仅局限于方法内部,方法执行结束后s就会被自动回收释放。 - 你尝试返回的
&str是指向s的借用引用,一旦s被销毁,这个引用就变成了悬垂引用,Rust的编译器会直接禁止这种风险行为。 - 对比能正常运行的
description方法:它返回的是静态字符串字面量,生命周期是全局的'static,不存在被销毁的问题,所以可以安全返回&str。
解决方案
最简单的修改方式是调整full_name方法的返回值类型为String,直接返回拼接好的字符串即可:String是拥有所有权的类型,从方法返回时会把所有权转移给调用方,不会出现生命周期问题。
修改后的完整代码如下:
struct Person { first_name: String, last_name: String, age: u8, } impl Person { // 将返回值从&str修改为String fn full_name(&self) -> String { let s = format!("{} {}", self.first_name, self.last_name); println!("** test, s: {}", s); // 直接返回s,所有权转移给调用方 s } fn description(&self) -> &str { match self.age { 0..=12 => "Child", // 修复原代码拼写错误Clild→Child 13..=17 => "Teenager", _ => "Adult", } } } fn main() { println!("Laboratory"); let p = Person { first_name: String::from("Alexandra"), last_name: String::from("Ansley"), age: 25, }; println!("Full Name : {}", p.full_name()); println!("Description : {}", p.description()); }
可选补充说明
如果你确实需要返回&str类型,可以在Person结构体中新增一个预存的full_name: String字段,每次修改first_name/last_name时同步更新这个字段,再返回它的&str借用即可。但绝大多数场景下直接返回String是性价比最高的方案,没有额外性能损耗,调用逻辑也不需要做任何调整。
内容的提问来源于stack exchange,提问作者Alexandra Danith Ansley
相关产品推荐
相关产品推荐

