作为Rust的初学者,我想知道如何在函数中返回泛型数据.

pub fn tryparse() -> (CLIAction, ArgSingle) {
    let args = CLI::from_args();
    match args.cmd {
        SubCommand::Add(opt) => {
            (CLIAction::QuantityAdd,opt)
        }
        SubCommand::Del(opt) => {
            (CLIAction::QuantityDel,opt)
        }
    }
}

在本例中,AddDel都获得ArgSingle struct 类型.然而,我想实现一个使用ArgSearch struct 类型的Search,并返回它……如何告诉Ruust tryparse()可以返回ArgSingleArgSearch类型?

推荐答案

听起来您想从tryparse()函数中返回ArgSingleArgSearch.有几种方法可以做到这一点,一种常见的方法是使用枚举作为返回.

首先,定义一个表示可以从函数返回的所有可能类型的枚举:


enum CLIResult {
    Single(ArgSingle),
    Search(ArgSearch),
}

然后,修改该函数以在元组中返回此枚举:

pub fn tryparse() -> (CLIAction, CLIResult) {
    let args = CLI::from_args();
    match args.cmd {
        SubCommand::Add(opt) => {
            (CLIAction::QuantityAdd, CLIResult::Single(opt))
        }
        SubCommand::Del(opt) => {
            (CLIAction::QuantityDel, CLIResult::Single(opt))
        }
        SubCommand::Search(opt) => {
            (CLIAction::Search, CLIResult::Search(opt))
        }
    }
}

现在,该函数可以返回ArgSingle作为CLIResult::Single,也可以返回ArgSearch作为CLIResult::Search.

要使用返回值tryparse(),您需要在CLIResult枚举上进行模式匹配,以提取适当类型的结果.例如:

let (action, result) = tryparse();
match result {
    CLIResult::Single(single_arg) => {
        // Handle single argument case
    }
    CLIResult::Search(search_arg) => {
        // Handle search argument case
    }
}

Rust相关问答推荐

收集RangeInclusive T到Vec T<><>

如何使用 list 在Rust for Windows中编译?

亚性状上位性状上的 rust 病伴生型界限

关于如何初始化弱 struct 字段的语法问题

如何在 struct 的自定义序列化程序中使用serde序列化_WITH

Rust&;Tokio:如何处理更多的信号,而不仅仅是SIGINT,即SIGQUE?

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

为什么`AlternateScreen`在读取输入键时需要按Enter键?

失真图像图形捕获Api

借来的价值生命周期 不够长,不确定为什么它仍然是借来的

如何从borrow 的异步代码运行阻塞代码?

unwrap 选项类型出现错误:无法移出共享引用后面的*foo

Sized问题的动态调度迭代器Rust

std::vector::shrink_to_fit 如何在 Rust 中工作?

使用自定义 struct 收集 Vec

使用方法、关联函数和自由函数在 Rust 中初始化函数指针之间的区别

如何在 Rust 中编写涉及异步的重试函数

相交着色器从 SSBO 中读取零

为什么可以从闭包中返回私有 struct

如何从 many0 传播 Nom 失败上下文?