我是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/