gpt4 book ai didi

generics - 如何在成功时返回用户指定的类型或在失败时返回 String?

转载 作者:行者123 更新时间:2023-11-29 08:11:37 25 4
gpt4 key购买 nike

我有一个程序,其中将用户输入收集到一个函数中并返回一个值。在该函数中,它尝试将 String 输入解析为 u32。如果失败,我希望它返回 String,而不是 panic 和结束程序。

是否可以允许任何返回类型?我阅读了 Rust Book 中的泛型部分,但它没有包含任何关于返回泛型类型的内容。

这是我的代码:

fn read_input(question: &str) -> u32 {
let mut input = String::new();
println!("{}", question);
io::stdin()
.read_line(&mut input)
.ok()
.expect("failed to read input");
match input.trim().parse() {
Ok(number) => {
return number; // return a u32
}
Err(_) => {
return input; // return a String
}
}
}

最佳答案

看来你在这里问了两个不同的问题。

<强>1。用户如何指定函数的输出类型?

使用通用参数。例如,Iterator::collect需要一个类型参数 B,用作返回类型。

<强>2。如何返回可以属于两种不同类型的值?

您可以创建一个 enum 作为这两种类型的“联合”:

pub enum Union<A, B> {
ValueA(A),
ValueB(B)
}

在这种情况下,ValueAValueB 情况没有内在含义。

Result enum 与此类似,但它为每个 case 添加了含义,即 Ok case 表示成功,Err 表示错误。


也就是说,我建议您使用 Result 并且错误情况会返回带有 parse 错误的读取输入:

use std::io;
use std::str::FromStr;

// 1: T is a type parameter that is used as (part of) return type
//
// 2: Result allows you to return either the parsed T value or
// the read input value with the parse error
fn read_input<T: FromStr>(question: &str) -> Result<T, (String, T::Err)> {
let mut input = String::new();
println!("{}", question);
io::stdin()
.read_line(&mut input)
.ok()
.expect("failed to read input");
match input.trim().parse() {
Ok(p) => Ok(p),
Err(err) => Err((input, err))
}
}

这将允许您向用户编写一条友好的错误消息:

fn main() {
// you can use any type that implements FromStr instead of u32
match read_input::<u32>("2 + 2?") {
Ok(ans) => println!("answer: {}", ans),
Err((input, err)) => println!("\"{}\" is an invalid answer: {}", input, err)
}
}

关于generics - 如何在成功时返回用户指定的类型或在失败时返回 String?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37460828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com