You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:06:04