【问题标题】:how should I compare two strings case-insensitively我应该如何不区分大小写地比较两个字符串
【发布时间】:2022-12-12 10:32:00
【问题描述】:

在我学习语言的同时,我正在用 Rust 制作一个石头剪刀布游戏作为一个小项目。我已经制作了下面的代码,但似乎无论我做什么,它总是打印“无效响应”。

我当前的代码:

fn start_next() {
    thread::sleep(time::Duration::from_secs(3));
    rps();
}

fn rps() {
    let rk = String::from("rock");
    let pp = String::from("paper");
    let sc = String::from("scissors");
    let end = String::from("end");
    
    let mut guess = String::new();
    println!("Choose one (\"end\" to quit):\n- rock\n- paper\n- scissors");
    
    io::stdin().read_line(&mut guess).expect("Unable to read line");
    let aichoice = ["rock", "paper", "scissors"][(rand::random::<u8>() % 3) as usize];


    // debug
    println!("\nAI chose {}", aichoice); 
    println!("You chose {}", guess);
    

    
    if guess.eq_ignore_ascii_case(&rk) {
        match aichoice {
            "rock" => {
                println!("Your moves canceled out.");
            }
            "paper" => {
                println!("Paper defated your rock.");
            }
            "scissors" => {
                println!("You defeated scissors");
            }
            _ => {}
        }

        start_next();
        return;
    }
     if guess.eq_ignore_ascii_case(&pp) {
        match aichoice {
            "rock" => {
                println!("You defeated rock.");
            }
            "paper" => {
                println!("Your moves canceled out.");
            }
            "scissors" => {
                println!("Scissors defeated your paper.");
            }
            _ => {}
        }

        start_next();
        return;
    }
    if guess.eq_ignore_ascii_case(&sc) {
        match aichoice {
            "rock" => {
                println!("Rock defeated your scissors.");
            }
            "paper" => {
                println!("You defeated paper.");
            }
            "scissors" => {
                println!("Your moves canceled out.");
            }
            _ => {}
        }

        start_next();
        return;
    }
    if guess.eq_ignore_ascii_case(&end) {
        return;
    }
    
    println!("Invalid response");
    start_next();
}

(是的,如果链接有点糟糕,我会这样做,但我正在尝试这样做,因为它不适用于 string.to_lowercase() 和匹配)

就像我提到的那样,我之前曾尝试使用 match case 语句来做到这一点,但结果相同。

我以前的代码是这样的:

let mut guess = String::new();
println!("Choose one (\"end\" to quit):\n- rock\n- paper\n- scissors");
    
io::stdin().read_line(&mut guess).expect("Unable to read line");

let aichoice = ["rock", "paper", "scissors"][(rand::random::<u8>() % 3) as usize];
let guess2: &str = &*guess.to_lowercase();

match guess2 {
    case "rock" => {
        ...
    }

    case "paper" => {
        ...
    }

    case "scissors" => {
        ...
    }

    case "end" => {
        return;
    }

    case _ => {
        println!("Invalid Response");
    }
}

thread::sleep(time::Duration::from_secs(3));
rps();

我的猜测是我两次都犯了一些随机错误,或者我的 Rust 安装有问题。

我还测试了我以前的代码并且 to_lowercase() 正在工作,只是比较我不理解的字符串。

【问题讨论】:

标签: string rust


【解决方案1】:

您的代码的一个可能问题是您没有从输入字符串中删除换行符。这读行方法从标准输入中读取输入字符串并在末尾附加一个换行符。这意味着您的 guess 变量将在末尾有一个换行符,这将与您正在与之比较的字符串文字值不匹配。

https://www.educative.io/answers/what-is-the-stringtrim-method-in-rust

要解决此问题,您可以使用修剪guess 变量上的方法删除任何前导和尾随空格,包括换行符。然后你可以使用 to_lowercase 方法来转换猜测的字符串小写,然后使用当量方法。

let mut guess = String::new();
println!("Choose one ("end" to quit):
- rock
- paper
- scissors");

io::stdin().read_line(&mut guess).expect("Unable to read line");
let guess = guess.trim().to_lowercase();

let aichoice = ["rock", "paper", "scissors"][(rand::random::<u8>() % 3) as usize];

if guess == "rock" {
    // rock logic
} else if guess == "paper" {
    // paper logic
} else if guess == "scissors" {
    // scissors logic
} else if guess == "end" {
    return;
} else {
    println!("Invalid response");
}

thread::sleep(time::Duration::from_secs(3));
rps();

或者,您可以使用 match 语句将猜测字符串与可能的值进行比较,对猜测字符串使用 to_lowercase 方法:

let mut guess = String::new();
println!("Choose one ("end" to quit):
- rock
- paper
- scissors");

io::stdin().read_line(&mut guess).expect("Unable to read line");
let guess = guess.trim().to_lowercase();

let aichoice = ["rock", "paper", "scissors"][(rand::random::<u8>() % 3) as usize];

match guess.as_str() {
    "rock" => {
        // rock logic
    }
    "paper" => {
        // paper logic
    }
    "scissors" => {
        // scissors logic
    }
    "end" => {
        return;
    }
    _ => {
        println!("Invalid response");
    }
}

thread::sleep(time::Duration::from_secs(3));
rps();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多