在循环中构建 std::process::Command 时类型不匹配

2024-01-17

我是 Rust 新手,试图通过使用借用检查器来学习安全编程。我尝试的一件事是构建一个std::process::Command http://doc.rust-lang.org/std/process/struct.Command.html基于输入。

如果我只想做文档中所有示例假设我想做的事情,并且只使用我在编码时知道的参数运行命令,那么它工作得很好:

use std::process::Command;

fn main() {
    let mut command = Command::new("/usr/bin/x-terminal-emulator")
                              .arg("-e")
                              .arg("editor")
                              .output()
                              .unwrap();
}

我正在尝试运行我在运行时构建的命令。为了做到这一点,我需要将Command结构从其参数的构建。当我这样做时,编译器会抱怨类型不匹配:

use std::env::args;
use std::process::Command;

fn main() {
    let args = args().collect::<Vec<_>>();
    let mut command = Command::new("/usr/bin/x-terminal-emulator");

    for arg in &args[1..args.len()] {
        command = command.arg(arg);
    }
}

我得到的错误是

不匹配的类型:预期std::process::Command, found &mut std::process::Command

查看文档std::process::Command::arg http://doc.rust-lang.org/std/process/struct.Command.html#method.arg,它说它期望&mut self并返回一个&mut Command。根据编译器的说法,这正是它得到的结果。文档是否错误,或者(更有可能)我误解了这里的某些内容?


如果我们检查编译器提供的完整错误,这可能有助于阐明:

error: mismatched types:
 expected `std::process::Command`,
    found `&mut std::process::Command`
(expected struct `std::process::Command`,
    found &-ptr) [E0308]

command = command.arg(arg);
          ^~~~~~~~~~~~~~~~

编译器指向表达式的整个右侧。这表明有问题返回值 of the arg称呼。让我们看看的文档arg http://doc.rust-lang.org/std/process/struct.Command.html#method.arg:

fn arg<S: AsRef<OsStr>>(&mut self, arg: S) -> &mut Command

So, arg对可变引用进行操作self,接受一个arg参数,以及returns对自身的可变引用。让我们稍微改变一下你的代码来测试我们的假设。我们将使用一个技巧让编译器告诉我们变量的类型 https://stackoverflow.com/q/21747136/155423:

for arg in &args[1..args.len()] {
    let _: () = command;
    let _: () = command.arg(arg);
}

这会产生错误:

error: mismatched types:
 expected `()`,
    found `std::process::Command`

let _: () = command;
            ^~~~~~~

error: mismatched types:
 expected `()`,
    found `&mut std::process::Command`

let _: () = command.arg(arg);
            ^~~~~~~~~~~~~~~~

哈,我们明白了!我们正在尝试存储一个&mut Command转化为类型变量Command。不会工作!由于构建器模式的此实例会改变构建器,因此我们无需执行任何特殊操作来保留它:

use std::env;
use std::process::Command;

fn main() {
    let mut command = Command::new("/usr/bin/x-terminal-emulator");

    for arg in env::args().skip(1) {
        command.arg(arg);
    }
}

还有另一种风格的构建器模式接受self按值并按值返回它。在这种情况下,你would必须在每个步骤之间跟踪构建器,并且您的代码将按原样运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在循环中构建 std::process::Command 时类型不匹配 的相关文章

随机推荐

  • c中sizeof函数内的赋值[重复]

    这个问题在这里已经有答案了 foo a b c new value of a after the call b c but sizeof a b c new value of a old value of a 在后一种情况下 为什么赋值语句
  • 给定一个 [Int] 类型的函数参数;可以限制它不为空吗?

    请考虑以下事项 func example array Int guard array count gt 0 else return Do something 最好通过函数签名来宣布限制 是否可以对参数进行约束 相当于 func exampl
  • 用于保留大小写模式、大小写的正则表达式

    主要问题 是否有一个正则表达式可以保留案例模式 U and L 理想情况下 它也会尊重单词边界和锚点 Example 假设我们有大量文本 我们想要将一个单词转换为另一个单词 同时保留单词的大小写 例如 替换所有实例 date with mo
  • 更多 GCC 链接时间问题:对 main 的未定义引用

    我正在为 Cortex A8 处理器编写软件 并且必须编写一些 ARM 汇编代码来访问特定寄存器 我正在使用 GNU 编译器和相关工具链 这些工具安装在带有 Ubuntu 的处理器板 Freescale i MX515 上 我使用 WinS
  • 如何更改默认文化?

    我使用 ASP NET Core 创建了我的第一个应用程序 当我调试它时 我发现带有重音符号的单词有问题 如何正确本地化应用程序 Update 我尝试实施乔的建议 但没有得到预期的结果 正如您在此图中看到的那样 从数据库显示的字符串没问题
  • 如何从信使聊天头服务等服务中检测后退按钮/主页按下?

    我一直在浏览几个 stackoverflow 问题 以了解如何使用 Windows 管理器监听服务上的后按按钮 大多数答案都表明这是不可能的 但是我可以看到 Messenger 处理得很好 Messenger 如何处理其头部聊天服务上的后按
  • 使用 C# 通过互联网进行最简单的双向通信

    我可以使用什么来通过互联网进行双向通信 而无需在客户端打开端口 尽管在服务器端一切皆有可能 但用户不会同意在客户端打开端口并进行端口转发 但是 我需要完成双向通信 我该如何实现这一目标 无论是 WCF 远程处理还是 Web 服务 这并不重要
  • Haskell:如何在纯函数中产生副作用

    我是一个 Haskell 初学者 我对如何在一些纯函数中呈现一些副作用感到困难 即一个非常简单的函数size功能 size Int gt StateT Int IO size fmap x gt do num lt get put num
  • 如何将 Backbone.Marionette.ItemView 与 Mustache 一起使用

    使用以下代码可以正常工作Backbone Marionette ItemView但不是Mustache Backbone Marionette ItemView 无小胡子 http jsfiddle net derickbailey me4
  • “Series”对象没有属性“applymap”

    我正在尝试对我的数据集使用 applymap 将浮点数创建为整数 但我收到 Series 对象没有属性 applymap 错误 import pandas as pd import matplotlib as mpl import matp
  • 恢复应用程序后,TextureView 抛出致命信号 11

    我有一个基于Romain Guy示例的TextureView 可以找到here http pastebin com J4uDgrZ8 在 Android 4 3 和 4 4 上 经过几轮暂停和恢复应用程序后 应用程序崩溃 唯一的错误痕迹是
  • 尝试在 C# 中清除打印队列时访问被拒绝

    我正在尝试在 C 中创建一个方法来清空打印队列中的所有项目 下面是我的代码 LocalPrintServer localPrintServer new LocalPrintServer PrintSystemDesiredAccess Ad
  • Swift:成为 UITextField 上的第一响应者不起作用?

    我在 Storyboard 上创建了一个带有一个 UITextField 的自定义 UIViewController 在viewDidLoad 我将 UITextFIeld 设置为becomeFirstResponder 什么也没发生 没有
  • 从 PHP7 调用 Mongodb 存储函数

    下面是我存储在 Mongodb 中的 mongodb 函数 db system js save id echoFunction value function x return x 我可以使用以下查询在 mongo 中调用此函数 db loa
  • 使用 JWT 处理过期/“记住我”功能

    从概念上讲 我真的很喜欢 JWT 因为它符合 REST 等的无状态性 没有状态保存服务器端 所有相关数据都包含在令牌中 我不确定的是 未连接时如何处理令牌过期 即 记住我 功能 网络上有关于 JWT 的新兴报道 但我还找不到任何人回答过期问
  • WPF MouseLeftButtonUp 未触发

    当我使用MouseUp事件 我可以通过单击鼠标右键来触发它 但MouseLeftButtonUp任何点击都不会触发
  • 在 Delphi 7 中制作 TPageControl 平面

    我不知道这个问题是否可以在这里得到解答 但我希望能够 我在 Delphi 7 中编写了一个简单的文本编辑器 作为我在 Windows 下编写 C 代码的主要 IDE 我在虚拟机中运行 Windows 我需要一些简单的东西 无论如何 它使用
  • WPF:缩放路径的正确方法?

    我有一条路径 看起来像椭圆形
  • 增加 Hadoop 2 中 Hive 映射器的数量

    我从 Hive 创建了一个 HBase 表 并尝试对其进行简单的聚合 这是我的 Hive 查询 from my hbase table select col1 count 1 group by col1 地图缩减作业仅产生 2 个映射器 我
  • 在循环中构建 std::process::Command 时类型不匹配

    我是 Rust 新手 试图通过使用借用检查器来学习安全编程 我尝试的一件事是构建一个std process Command http doc rust lang org std process struct Command html基于输入