Rust中如何在结构体impl方法内获取用户输入为嵌套结构体字段赋值
Rust猜数字游戏字段赋值问题解答
语法合法性判断
在start方法内为p1、p2的name属性赋值完全符合Rust语法规则。
原因很简单:start方法通过&mut self拿到了当前Game实例的可变引用,Rust中结构体字段的可变性随实例的可变性传递——只要持有父结构体的可变引用,就可以修改其内部所有未被特殊可变性包装(如Cell、RefCell)限制的普通字段,p1、p2作为Game持有的普通Player实例,自然支持修改其内部的name属性。
你只需要在初始化Game实例时,给p1、p2的字段填上符合类型要求的初始值即可,比如name初始可以设为空字符串String::new(),后续在start方法里覆盖赋值。
用户输入赋值实现方法
你可以直接使用Rust标准库的std::io模块读取终端用户输入,为了减少重复代码,可以先写一个简单的输入读取辅助函数,再分别读取两个玩家的名称赋值到对应字段。
完整可运行的核心代码示例如下:
use std::io; // 原结构体定义保持不变 struct Player { name: String, balance: i32, betamount: i32, guess: i32 } struct Game { p1: Player, p2: Player, random_card: i32 } impl Game { pub fn start(&mut self) { // 辅助函数:读取用户输入的字符串 fn read_input() -> String { let mut input = String::new(); io::stdin() .read_line(&mut input) .expect("读取输入失败"); // 去掉首尾空白(包含回车产生的换行符)后返回 input.trim().to_string() } // 读取玩家1名称赋值 println!("请输入玩家1的名称:"); self.p1.name = read_input(); // 读取玩家2名称赋值 println!("请输入玩家2的名称:"); self.p2.name = read_input(); // 后续可继续编写下注、猜数字、判定胜负的逻辑 } } fn main() { // 初始化Game实例,字段填入对应类型的初始值 let mut game = Game { p1: Player { name: String::new(), balance: 1000, betamount: 0, guess: 0 }, p2: Player { name: String::new(), balance: 1000, betamount: 0, guess: 0 }, random_card: 0 }; game.start(); // 测试:打印赋值后的玩家名称 println!("玩家1:{},玩家2:{}", game.p1.name, game.p2.name); }
如果需要后续读取数字类型的赌注、猜测值,只需要在读取到字符串之后调用parse()方法转成对应i32类型即可,注意做好简单的错误判定,避免用户输入非数字内容导致程序崩溃。
内容的提问来源于stack exchange,提问作者Ari Rosen
相关产品推荐
相关产品推荐

