如何在Rust函数逻辑判断中使用struct并正确声明结构体入参
Rust 结构体方法声明与调用问题修复
原代码核心问题梳理
- 你将
get_social_status定义为Citizen结构体的关联方法时,首个参数&self本身就代表当前调用方法的Citizen实例,不需要额外声明多余的&String入参 - 方法内部访问实例字段需要用
self.字段名语法,不能直接用结构体名Citizen.字段名,后者是访问结构体关联常量的语法 - 调用结构体方法需要使用
实例.方法名()格式,不能直接当全局函数调用;如果要当全局函数使用,就不要把函数写在impl Citizen块中 - 原代码的判断逻辑有独立
if重复执行问题,需要将第二个if改为else if避免输出冲突
方案1:保留为结构体实例方法(推荐)
#[derive(Debug)] struct Citizen { id_num: u32, weight: u32, height: u32, first_name: &'static str, last_name: &'static str, phone_number: &'static str, age: u32, sex: &'static str, marital_status: &'static str, social_rating: u32 } impl Citizen { // 仅保留&self作为入参,&self本身就是Citizen类型的实例不可变引用 fn get_social_status(&self) { if self.social_rating >= 7 { println!("Good"); } else if self.social_rating >= 5 && self.age <= 20 { println!("Fair"); } else { println!("Not Great"); } } } fn main() { let citizen3030 = Citizen { id_num: 1, weight: 100, height: 55, first_name: "Jake", last_name: "Doe", phone_number: "555-555-3232", age: 17, sex: "m", marital_status: "Married", social_rating: 5 }; let citizen3031 = Citizen { id_num: 2, weight: 255, height: 78, first_name: "Lex", last_name: "Luther", phone_number: "333-333-2323", age: 56, sex: "m", marital_status: "Single", social_rating: 7 }; println!("{:?}",citizen3030); println!("{:?}",citizen3031); println!("First Name of cit3030, {}", citizen3030.first_name ); let temps = citizen3031.first_name; println!("{}", temps); // 结构体实例方法调用格式 citizen3030.get_social_status(); }
运行后citizen3030会输出Fair,符合参数匹配逻辑。
方案2:定义为独立全局函数
如果不需要绑定到结构体,可把函数定义在impl块外,显式声明入参为Citizen类型:
// 入参显式指定为Citizen的不可变引用,避免所有权转移 fn get_social_status(citizen: &Citizen) { if citizen.social_rating >= 7 { println!("Good"); } else if citizen.social_rating >=5 && citizen.age <=20 { println!("Fair"); } else { println!("Not Great"); } } // main中调用方式与原写法一致,传入引用即可 get_social_status(&citizen3030);
内容的提问来源于stack exchange,提问作者SRSLOL
相关产品推荐
相关产品推荐

