rust - 在Rust中基于用户输入运行功能

标签 rust match

我是Rust语言的新手,就像通常在尝试使用某种语言时一样,我喜欢经历Euler Project的问题。我想熟悉 cargo 及其提供的一切,因此我创建了一个名为euler-project的 cargo 项目。
在启动时,我希望程序询问用户要运行的解决方案,并让它在与用户请求的解决方案相对应的代码中运行功能。
我想避免if/else if/else块的巨大链式,所以我认为match函数会很好地工作。这就是我所拥有的。

use std::io;

fn main() {
    
    // Solution selection. Every solution will be selectable here
    let mut selection = String::new();

    // Enum to hold every solved problem number for match control flow
    enum Solutions {
        P1, P2, 
    }

    loop {
        println!("Select the solution you would like to run. (Example: '32' would be Problem 32)");

        io::stdin()
            .read_line(&mut selection)
            .expect("Input should be an integer.");
        
        
        match selection {
            Solutions::P1 => p1(),
            Solutions::P2 => p2(),
        }
    }
}

fn p1() {
    println!("p1")
    
}

fn p2() {

}
当前,这将产生如下错误:
...
21 |         match selection {
   |               --------- this expression has type `std::string::String`
22 |             Solutions::P1 => p1(),
   |             ^^^^^^^^^^^^^ expected struct `std::string::String`, found enum `main::Solutions`
我在这里做错了什么?如果您知道执行此类型控制的更好选择,请向我提出建议。我也很想知道是否存在类似于Python的交互式控制台模式的功能,该模式允许用户在终端中运行代码,并通过简单地键入函数名称并按Enter键来进行函数调用。

最佳答案

您在这里比较苹果和桔子。一方面,您具有从用户那里读取的字符串,另一方面,您具有Solutions类型的值,但是您在任何地方都没有告诉编译器如何比较两者。做您想做的最简单的方法就是直接比较字符串:

match selection.trim() {
    "1" => p1(),
    "2" => p2(),
    _ => panic!("{} does not designate a valid problem!", selection),
}
请注意对trim的调用:read_line返回的字符串包括结尾的换行符,您需要删除该换行符以便进行比较。
还要注意,您将需要在selection.clear()之前调用read_line,否则循环的下一次迭代将追加到字符串中,而不是替换它。

关于rust - 在Rust中基于用户输入运行功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64797966/

相关文章:

rust - rust 双引用值

ubuntu - 我们如何才能完全删除 Ubuntu 安装的 Rust?

arrays - 尝试 const 数组中的 .find() 值时如何修复 "temporary value dropped here while still borrowed"?

string - 在 winapi 调用中使用字符串的更方便的方法

rust - 匹配语句中明显未使用的变量

javascript - 正则表达式尝试将除特定模式之外的任何内容与允许的模式中的字符进行匹配

rust - 引用枚举中的参数

if-statement - 如何将使用三元运算符的 C++ 代码移植到 Rust?

python - 匹配两个包含字符串的列表

scala - 没有返回值的情况