为什么使用 if 可以比较字符串与 &str,但使用 match 则不行?

2024-01-28

我正在尝试实现一个读取命令行参数并将它们与硬编码字符串文字进行比较的函数。

当我与if声明它就像一个魅力:

fn main() {
    let s = String::from("holla!");

    if s == "holla!" {
        println!("it worked!");
    }
}

但使用一个match声明(我想这会更优雅):

fn main() {
    let s = String::from("holla!");

    match s {
        "holla!" => println!("it worked!"),
        _ => println!("nothing"),
    }
}

我不断从编译器中收到错误String是预料之中的,但是&static str被找到:

error[E0308]: mismatched types
 --> src/main.rs:5:9
  |
5 |         "holla!" => println!("it worked!"),
  |         ^^^^^^^^ expected struct `std::string::String`, found reference
  |
  = note: expected type `std::string::String`
             found type `&'static str`

我见过如何在 Rust 中将字符串与字符串文字进行匹配? https://stackoverflow.com/q/25383488/155423所以我知道如何解决它,但我想知道why比较有效的时候if但不使用match.


我想知道为什么比较有效if但不使用match.

这并不是那么多关于if以及更多,因为您已经使用过==在条件下。条件在一个if语句是任何类型的表达式bool;你只是碰巧选择了使用== there.

The ==运算符实际上是一个与the PartialEq trait https://doc.rust-lang.org/std/cmp/trait.PartialEq.html。此特征可以应用于任何pair的类型。并且,为了方便起见,String有实现PartialEq<str> and PartialEq<&str>等 - 反之亦然。

另一方面,match表达式使用模式匹配 https://doc.rust-lang.org/1.2.0/book/patterns.html为了比较,不==. A &'static str字面上的,比如"holla!",是一个有效的模式,但它永远不能匹配String,这是一个完全不同的类型。

模式匹配可以让您简洁地比较复杂结构的各个部分,即使整个结构不相等,也可以将变量绑定到匹配的各个部分。尽管Strings 并没有真正从中受益,它对于其他类型来说非常强大,并且具有与==.

请注意,您可以使用模式匹配if通过改为使用if let构造。你的例子看起来像这样:

if let "holla!" = &*s {
    println!("it worked!");
}

相反,一种使用方法==里面一个match是这样的:

match s {
    _ if s == "holla!" => println!("it worked!"),
    _ => println!("nothing"),
}

或者,正如@ljedrz 所建议的:

match s == "holla!" {
    true => println!("it worked!"), 
    _ => println!("nothing")
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用 if 可以比较字符串与 &str,但使用 match 则不行? 的相关文章

随机推荐

  • Matlab - 加速嵌套 For 循环

    一个简单的问题 但我不太擅长 MATLAB 我有向量x n 1 y 米 1 和w x y 我想定义M n m x 1 as M i x 中小于或等于 w i 的元素数量 w 已排序 这只是没有削减它 N n m M zeros N 1 fo
  • ARMv8 AArch32模式是否向后兼容armv4、armv5或armv6?

    众所周知 ARMv8 AArch32 位模式完全向后兼容 ARMv7 架构 并且ARMv7向后兼容ARMv4 ARMv5te和ARMv6 从上面的说法 我们可以说ARMv8 AArch32模式也向下兼容ARMv4 ARMv5te和ARMv6
  • 如何手动打开休眠会话?

    我有一个相当大的项目 涉及 spring 和 hibernate 现在 我正在将某些对象从休眠状态恢复到内存中 但我遇到了一些障碍 我有以下设置 A 类包含多个基元和一个 B 类 B 包含基元和一个 C 类 以前是惰性加载 现在我有这个 服
  • 如何阻止嵌套列表与父列表重叠?

    看这里 http jsfiddle net wHztz 67 http jsfiddle net wHztz 67 在此示例中 颜色是背景图像的占位符 我注意到当嵌套列表停止重叠时display block被移除自 innerLeft ul
  • 部署后 ASP.NET 网站看起来有所不同

    我已经用谷歌搜索了这个问题的答案 但还没有找到任何答案 也许我使用的搜索词太通用了 无论如何 这里是 我发现了网页设计和 ASP NET 的乐趣 也发现了尝试在 IE 和所有其他浏览器中以相同方式显示内容的噩梦 我正在 VS2010 中工作
  • 使用R语言进行冒泡排序?

    我是编程新手 刚刚开始学习R语言 我正在尝试进行冒泡排序 但它显示以下错误消息 谁能帮我解决这个问题吗 x lt sample 1 100 10 n lt length x example lt function x for i in 1
  • 如何只显示 1 条得分最低的记录?

    我只想显示 DL 列表中的 1 条记录 该记录具有所有 DL 中的最低分数 目前它正在显示所有记录 在 stackblitz 的示例中 您可以看到第一条记录的 DL 分数为 54 20 并已更新 我不想显示所有 3 条记录 而是只想显示 1
  • 缺少 Idlj 编译器 (Linux/JDK 11)

    找不到idlj编译工具 idl文件 已检查 usr bin and usr lib jvm java 11 jdk 它不是和JDK捆绑在一起的吗 如何添加idlj编译器 附 我更喜欢Python 不太使用Java 如果这是一个愚蠢的问题 我
  • 从 facebookomniauth 获取名字和姓氏字段

    我现在正在我的应用程序中实现omniauth 功能 一切正常 除了我无法从 Facebook 上获取名字和姓氏 这是我的模型代码 def self from omniauth auth user User where email auth
  • 在 Python 3 中未显式打开文件时处理从字节到字符串的转换

    我使用 Requests 模块进行授权 然后从 Web API 中提取 csv 内容 并使其在 Python 2 7 中正常运行 我现在想在 Python 3 5 中编写相同的脚本 但遇到一些问题 iterator should retur
  • 使用注释来注入依赖项是否会消除依赖项注入(外部配置)的主要好处?

    我正在使用 Spring 这是一个控制器 Controller public class PersonController Resource name PersonService private PersonService personSe
  • 如何以编程方式获得 Scenekit 关卡编辑器的优势

    我刚刚运行了一些测试 比较了加载 创建场景的不同方式的性能 以了解性能影响 该测试只是渲染一个 32x32 的立方体网格 并观察 CPU 使用率 内存 能源和渲染时间 不是很科学 但有一些明确的结果 这四项测试包括 Load a dae e
  • ItemTouchHelper:防止越界拖动

    我有一个带有 ItemTouchHelper 的回收器视图 它允许拖动项目 我想将拖动限制在回收器视图的边界内 即 您不能只将视图拖动到容器之外 从而使其消失 我尝试像这样检查绝对坐标 Override public void onChil
  • Java:计算时区差异

    如何在 Java 中获取特定日期和时区与 GMT 的时差 确定特定时区是否处于夏令时非常简单 boolean isIsraelInDST TimeZone getTimeZone Israel inDaylightTime new Date
  • 如何在extjs中的网格视图列中添加按钮?

    创建新行时 一个字段应包含一个在扩展 JS 中动态创建的按钮 Each button should contain different name and action listener The column should like give
  • Excel VBA 将项目添加到组合框而不重复项目

    我想将以下项目添加到组合框中 但如果有重复的项目 则只应添加一个 A 1 john 2 john 3 marry 4 marry 5 john 6 lisa 7 frank 8 marry 我希望组合框结果是john marry lisa
  • 使用特定方法控制XML序列化格式

    我有一个 DateTime 和一个子类 我想要专门针对 XML 序列化对其进行格式化 通常 在不指定任何内容的情况下 DateTime 的序列化只会遵循当前的区域性 但我希望 DateTime 以某种方式格式化 即使不可反序列化 子类也是如
  • Pip 无法再从 https 克隆 - 错误 128

    我有一个使用标准 https 克隆语法的项目已经有一段时间了 就在今天下午 它工作得很好 现在 我得到error code 128每次我尝试克隆时 Obtaining myproject from git git myurl myuser
  • Huggingface 保存标记器

    我正在尝试将标记生成器保存在 Huggingface 中 以便稍后可以从不需要访问互联网的容器中加载它 BASE MODEL distilbert base multilingual cased tokenizer AutoTokenize
  • 为什么使用 if 可以比较字符串与 &str,但使用 match 则不行?

    我正在尝试实现一个读取命令行参数并将它们与硬编码字符串文字进行比较的函数 当我与if声明它就像一个魅力 fn main let s String from holla if s holla println it worked 但使用一个ma