Rust impl Trait 作为函数返回类型[重复]

2023-12-07

我有以下功能,其中Command是一种特质

pub fn parse_arguments(matches: ArgMatches) -> Result<impl Command, &'static str>

在函数体内,我想根据参数返回 Command 的不同实现 喜欢

match args.subcommand() {
    ("init", Some(args)) => {
        Ok(Init::new(args))
    }
    ("btc", Some(args)) => {
        Ok(ImportBtc::new(args))
    },
    ("grin", Some(args)) => {
        Ok(ImportGrin::new(args))
    },
    _ => Err ("Invalid subcommand supplied")
}

编译将失败并出现错误:

expected struct `commands::cmd_types::Init`, found struct `commands::cmd_types::ImportBtc`

和类似的ImportGrin返回线。

我是否误解了如何impl Trait works?


不幸的是,这并不完全是这样impl Trait does. impl Trait作为返回类型意味着“此函数将返回实现此特征的单个类型”,而您试图返回实现此特征的多个类型。这对于编译器来说很困难,因为它需要知道返回的类型有多大,并且不同的类型有不同的大小。

一些选项:

  1. 将返回值装箱,因为Box始终具有相同的尺寸
  2. 定义一个enum每个返回类型都有一个变体,将您的返回值包装在enum,并实现特征enum.
  3. Use https://crates.io/crates/auto_enums它会自动创建 2 中描述的枚举。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust impl Trait 作为函数返回类型[重复] 的相关文章

随机推荐

  • 如何使用更少的 import 语句导入 Java 中的多个类? [复制]

    这个问题在这里已经有答案了 我对在 Java 中使用包还很陌生 我想知道是否有一种更简单的方法来使用更少的 import 语句导入类 我正在使用处理并且我已经开始使用用于处理的 Box2D创建一些游戏 为了使用该库 我必须将以下内容添加到我
  • 为什么这个表达式的计算结果为 0?

    为什么表达 5 lt 3 lt 1 在 MATLAB 中计算结果为 0 每个单独的语句都评估为 true 所以我很困惑为什么它的评估结果为 false 因为它实际上看起来像这样 5 lt 3 lt 1 5 1 最终答案 0
  • 实施 UserDefaults 时遇到问题

    我以前有编码经验 但对 Swift 和 iOS 都非常陌生 我正在开发一款供个人使用的应用程序 以将我用来帮助管理多动症的多个不同应用程序的功能合并到一个地方 该应用程序的主视图提供了一种跟踪日常支出的方法 我正在尝试使用 UserDefa
  • 检查模型与两个不同物体之间是否同时发生碰撞

    在 VR Unity 项目中工作 尝试编写一些 C 脚本 我的角色模型有两只脚 在 VR 中使用跟踪器进行控制 我需要一种方法来找出双脚何时与立方体碰撞 同时 左脚使用立方体 A 右脚使用立方体 B 这样我就可以在满足条件时生成另一个对象
  • 直观地区分自动生成的文件?

    我们有一堆根据数据库模型自动生成的文件 我有过一些捂脸的经历 因为我修改了一些代码 却发现我的修改被覆盖了 因为我没有注意到我的更改在那些生成的文件中 因此 我修改了生成器以在文件头中包含 请勿修改 注释 这有帮助 不过 在跟踪方法调用时
  • 使用 count() 和 first() 时,iPython 笔记本中的 PySpark 会引发 Py4JJavaError

    我在 iPython 笔记本 python v 3 6 中使用 PySpark v 2 1 0 而不是在我的 Mac Sierra 10 12 3 Beta 中使用 virtualenv 1 我通过在终端中拍摄启动了 iPython 笔记本
  • JSON 有效时 JSON 输入意外结束

    我正在使用 Express 从公共 API 获取数据并在前端使用这些数据 这是我的字符路由 它在某些公共 API URL 上运行良好 但我尝试的大多数结果都会出现意外的输入错误结束 我也收到了Unexpected token in JSON
  • 如何使用 Meteor.loginWithGoogle 获取 Google+ 个人资料?

    我正在寻找 Meteor loginWithGoogle 的工作示例 使用meteor 0 6 4 1 我找到了这个用于 loginWithGitHub 的 https www eventedmind com posts meteor cu
  • 我需要在 ios 8 中实现可扩展的 tableView 单元格

    In my project I need to implement the UITableview with some of the tableView cells are expandable and some of them are i
  • htaccess 无法在 iis 上运行

    如何将 htaccess 转换为 web config 我刚刚知道我需要使用 web config 而不是 htaccess 请在下面找到我的 htaccess RewriteEngine On RewriteBase RewriteCon
  • PIL - 在图像上绘制多行文本

    我尝试在图像底部添加文本 实际上我已经做到了 但如果我的文本比图像宽度长 它会从两侧剪切 为了简化 我希望文本在多行中 如果是 比图像宽度长 这是我的代码 FOREGROUND 255 255 255 WIDTH 375 HEIGHT 50
  • 如何使用C#从Excel文件中读取数据[重复]

    这个问题在这里已经有答案了 我的应用程序需要从 Excel 文件读取数据 我使用 Net 和 c 进行开发 我无法在系统中安装MS Office 因此 我的应用程序无法读取 excel 文件 并在加载 excel 的 dll 时抛出错误 如
  • 如何恢复已推送到远程的合并提交?

    git revert
  • 将手柄传递到管道中

    说我有 node foo js node bar js 有没有办法将 foo 的标准输入句柄传递给 bar js 我有一个罕见的情况 我想在管道中进行向后通信 至少我知道我可以发送node bar js的pidnode foo js 鉴于
  • 在python中访问字典的字典

    你好 在我的代码中有一个字典的字典 nrec bridge xapi1 current operations uuid 9ae5ca7d e7d6 7a81 f619 d0ea33efb534 tags other config is gu
  • Google Play 游戏服务 - 如何在暂停时不留空间

    我不知道为什么 https stackoverflow com questions 18142763 is it possible to show full screen activity without leaving room usin
  • ISO 8601 周数(C 语言)

    我正在尝试使用 C 获取 ISO8601 周数 我的 PC 上安装了 MinGW GCC 版本是 5 3 0 你可以在下面看到我的代码 strftime不适用于说明符 V 但它与说明符 W 一起工作得很好 但这不是我想要的 我需要 ISO
  • 测试后清除 Spring 应用程序上下文

    如何使用 Junit5 和 Spring Boot 在每次测试执行后清除应用程序上下文 我希望在测试中创建的所有 bean 在执行后都被销毁 因为我在多个测试中创建相同的 bean 我不想为所有测试使用一个配置类 而是为每个测试使用一个配置
  • 我可以同时使用 Twitter Bootstrap 和 jQuery UI 吗?

    我正在使用 Twitter Bootstrap 我想使用 Bootstrap 中不可用的 自动建议 而 jQuery UI 有自己的自动建议方法 我可以同时使用两者吗 会导致带宽超载吗 查看jquery ui 引导程序 来自自述文件 Twi
  • Rust impl Trait 作为函数返回类型[重复]

    这个问题在这里已经有答案了 我有以下功能 其中Command是一种特质 pub fn parse arguments matches ArgMatches gt Result