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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:39:20