如何在Rust中定义并输出包含姓与名的结构体?
Rust实现Go语言Person结构体打印的正确方式
你给出的Go代码实现了定义含姓名字段的person结构体、实例化后直接打印的功能,但你写的Rust代码存在关键语法和逻辑错误,导致编译失败。
错误原因分析
- impl块位置错误:Rust的
impl块不能放在函数(比如main)内部,必须置于全局作用域中。 - Display trait实现逻辑错误:实现
fmt::Displaytrait时,必须实现它强制要求的fmt方法,你混淆了结构体实例化语法与trait实现逻辑,错误地在impl块里写字段初始化代码。
正确实现方式
方式一:手动实现fmt::Display trait(自定义打印格式)
这种方式可以精准控制输出格式,和Go的默认打印风格对齐:
use std::fmt; struct Person { first_name: String, last_name: String, } // 在全局作用域实现Display trait impl fmt::Display for Person { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { // 匹配Go的默认结构体输出格式 write!(f, "{{firstName: {}, lastName: {}}}", self.first_name, self.last_name) } } fn main() { // 实例化Person结构体 let alex = Person { first_name: String::from("alex"), last_name: String::from("anderson"), }; // 直接打印(因实现了Display trait) println!("{}", alex); }
方式二:派生Debug trait(简洁快速)
如果不需要自定义格式,仅需快速打印结构体内容,派生Debug trait是更高效的选择,输出风格和Go的默认打印高度接近:
// 派生Debug trait,支持用{:?}格式打印 #[derive(Debug)] struct Person { first_name: String, last_name: String, } fn main() { let alex = Person { first_name: String::from("alex"), last_name: String::from("anderson"), }; // 打印Debug格式内容 println!("{:?}", alex); // 若需要更易读的缩进格式,可使用{:#?} // println!("{:#?}", alex); }
运行方式二的代码,输出示例:Person { first_name: "alex", last_name: "anderson" }
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

