对于实现相同特征的结构,如何克服类型不兼容的匹配臂?

2024-04-25

我正在尝试写cat命令来学习 Rust,但我似乎无法将命令行参数转换为阅读器结构。

use std::{env, io};
use std::fs::File;

fn main() {
    for arg in env::args().skip(1) {
        let reader = match arg.as_str() {
            "-" => io::stdin(),
            path => File::open(&path).unwrap(),
        };
    }
}

Error:

error[E0308]: match arms have incompatible types
 --> src/main.rs:6:22
  |
6 |         let reader = match arg.as_str() {
  |                      ^ expected struct `std::io::Stdin`, found struct `std::fs::File`
  |
  = note: expected type `std::io::Stdin`
  = note:    found type `std::fs::File`
note: match arm with an incompatible type
 --> src/main.rs:8:21
  |
8 |             path => File::open(&path).unwrap(),
  |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^

似乎不可能多态地匹配特征实现者(有关的) https://stackoverflow.com/questions/26126683/how-to-match-trait-implementors。我怎样才能使用File or Stdin作为读者?


问题是stdin()返回类型的对象Stdio and File::open(...).unwrap()返回类型的对象File。在 Rust 中,匹配的所有分支都必须返回相同类型的值。

在这种情况下,您可能想返回一个常见的Read目的。很遗憾Read是一个特征,所以你不能通过值传递它。最简单的替代方案是诉诸堆分配:

use std::{env, io};
use std::io::prelude::*;
use std::fs::File;

fn main() {
    for arg in env::args().skip(1) {
        let reader = match arg.as_str() {
            "-" => Box::new(io::stdin()) as Box<Read>,
            path => Box::new(File::open(&path).unwrap()) as Box<Read>,
        };
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于实现相同特征的结构,如何克服类型不兼容的匹配臂? 的相关文章

随机推荐

  • Google 聊天机器人 - 发送私人消息而不发生事件

    我有一个正在 PM 中工作的机器人 我可以与它交谈并让它毫无问题地完成我的任务 但我不知道如何让它向特定的其他人发送消息 我希望它能够向特定的用户列表发送私人消息 而无需这些用户的任何交互 唯一的交互是我发出的命令 要求它向其他人发送消息
  • JavaFx - 线程“JavaFX 应用程序线程”中的无尽异常 java.lang.NullPointerException

    我得到以下异常 甚至无法理解它出现在什么地方 这意味着什么 Exception in thread JavaFX Application Thread java lang NullPointerException at com sun ja
  • 在asp.net中生成PDF文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何制作pdf https stackoverflow com questions 575584 how to make pdf 在 Asp net 中创建 pdf 文件 https stackove
  • Raspberry 3 上的 GSM/GPRS 模块与 Android Things 原生集成

    我想知道是否有任何方法可以使 GPRS GSM 模块 SIM800L 作为 android 中的 默认 连接 允许浏览互联网并使用 Android 库发出请求 似乎不是 因为如this https stackoverflow com a 4
  • html 中字体标签的最佳替代品

    自从fontHTML 中的标签在 HTML5 中已被弃用 我明白为什么 是否有一个干净的解决方案可以将某些属性和样式仅应用于portions段落文本 我正在使用 JavaScript 来解析 XML 文件 该文件依赖于以下事实 font标签
  • 处理单元测试和集成测试之间的重复

    我有一个由多个类实现的算法 所有类都由单元测试覆盖 我想重构它 这将改变两个类的行为 当我更改一个类及其测试时 所有单元测试都会通过 但在重构完成之前算法会变得不正确 这个例子说明 单元测试的完全覆盖有时是不够的 我需要在输入输出方面对整个
  • Android WebView 未加载 URL

    我想加载URL http www teluguoneradio com rssHostDescr php hostId 147 in WebView 我使用了以下代码 webView WebView findViewById R id we
  • 学说迁移phar,如何设置类型映射?

    我想在我的非 symfony 项目中使用学说迁移 所以我从https github com doctrine migrations https github com doctrine migrations 我正确配置了所有内容 数据库配置和
  • Angular Reactive Forms 模式验证:正则表达式无效

    我在 AngularJS 网站上有一个用于澳大利亚电话号码验证的正则表达式 我在反应式表单验证器中设置了确切的模式 如下所示 Validators pattern 0 1 0 61 2 4 3 7 8 0 1 0 1 0 9 2 0 1 0
  • Bootstrap 3.0.2 中的面包屑导航栏

    我是 Bootstrap 的新手 我想创建一个带有一些内容 链接 下拉菜单 和面包屑的导航栏 但是当我将面包屑放入导航栏中时 我的显示有问题 块 我认为 这是我的示例代码
  • 瑞典 SSN 正则表达式拒绝特定年龄以下的用户

    我的正则表达式有问题 我已经可以验证正确的瑞典社会安全号码以符合这些标准 YYMMDDNNNN 年月日 NNNN 年年月日DDNNNN YYYYMMDD NNNN 但如果用户未满 18 岁 我也想拒绝该用户注册 我的常规表达现在是这样的 有
  • 如何在flutter中仅在一页上阻止屏幕截图?

    我想知道如何仅在一页上阻止颤振中的屏幕截图 我读到有一种方法可以阻止颤振应用程序中的屏幕截图 方法是 getWindow addFlags LayoutParams FLAG SECURE 但我的理解是 当我这样做时 整个应用程序中的屏幕截
  • 如何在Python中删除图像的背景

    我有一个包含全角人类图像的数据集 我想删除这些图像中的所有背景 只留下全角人物 我的问题 有没有Python代码可以做到这一点 我是否需要每次都指定人员对象的坐标 这是使用 Python OpenCV 的一种方法 读取输入 转换为灰色 阈值
  • plm 与 lfe 中的聚类标准错误不同

    当我运行集群标准错误面板规范时plm and lfe我得到的结果在第二个有效数字处有所不同 有谁知道为什么他们对SE的计算不同 set seed 572015 library lfe library plm library lmtest c
  • Swift 2.1 do-try-catch 未捕获错误

    这是我的 Swift 2 1 代码片段 发生的错误显示在错误出现处的注释中 错误显示在调试面板中 并且应用程序崩溃 该应用程序永远不会打印 catch 中的行 也不会按预期优雅地返回 let audioFileURL receivedAud
  • AngularJS 数据落后一步

    我正在使用 angularJS 跟踪地图坐标来更新数据 但是我遇到了一个奇怪的问题 即您在屏幕上看到的数据与console陈述 zombie controller move function scope io on location fun
  • Tensorflow:tf.get_collection 未返回范围内的变量

    我正在尝试获取变量范围内的所有变量 如所解释的here https stackoverflow com questions 36533723 tensorflow get all variables in scope 然而 该行tf get
  • 如何停止在 Visual Studio Code 中复制空白行上的空白?

    在 Visual Studio 代码中 如果您在空白行上按 ctrl c 且没有突出显示任何内容 则会复制该空白行 我认为可能有一个选项可以禁用此功能 但尚未找到它 您应该能够通过配置选项来做到这一点editor emptySelectio
  • 使用 echo 在 php 文件中输出 HTML 代码总是更好吗? [复制]

    这个问题在这里已经有答案了 可能的重复 在 PHP 中回显 HTML 的最简单方法 https stackoverflow com questions 1100354 easiest way to echo html in php Hell
  • 对于实现相同特征的结构,如何克服类型不兼容的匹配臂?

    我正在尝试写cat命令来学习 Rust 但我似乎无法将命令行参数转换为阅读器结构 use std env io use std fs File fn main for arg in env args skip 1 let reader ma