96SEO 2026-02-23 14:10 13
。

模式可由字面量、变量名、通配符和许多其他东西组成#xff1b;后文会详细介绍所有不同种类的模式及它…1.
Rust中有一个异常强大的控制流运算符match它允许将一个值与一系列的模式相比较并根据匹配的模式执行相应代码。
模式可由字面量、变量名、通配符和许多其他东西组成后文会详细介绍所有不同种类的模式及它们的工作机制。
match的能力不仅来自模式丰富的表达力也来自编译器的安全检查它确保了所有可能的情况都会得到处理。
你可以将match表达式想象成一台硬币分类机硬币滑入有着不同大小孔洞的轨道并且掉入第一个符合大小的孔洞。
同样值也会依次通过match中的模式并且在遇到第一个“符合”的模式时进入相关联的代码块并在执行过程中被代码所使用。
由于我们正好提到了硬币所以就用它们来编写一个使用match的示例示例中的函数会接收一个美国的硬币作为输入并以一种类似于验钞机的方式确定硬币的类型并返回它的分值如示例6-3所示。
示例6-3一个枚举以及一个以枚举变体作为模式的match表达式❶enum
让我们先来逐步分析一下函数value_in_cents中的match块。
首先我们使用的match关键字后面会跟随一个表达式也就是本例中的coin值❷。
初看上去这与if表达式的使用十分相似但这里有个巨大的区别在if语句中表达式需要返回一个布尔值而这里的表达式则可以返回任何类型。
例子中coin的类型正是我们在首行❶中定义的Coin枚举。
接下来是match的分支一个分支由模式和它所关联的代码组成。
第一个分支采用了值Coin::Penny作为模式并紧跟着一个运算符用于将模式和代码区分开来❸。
这里的代码简单地返回了值1。
不同分支之间使用了逗号分隔。
当这个match表达式执行时它会将产生的结果值依次与每个分支中的模式相比较。
假如模式匹配成功则与该模式相关联的代码就会被继续执行。
而假如模式匹配失败则会继续执行下一个分支就像上面提到过的硬币分类机一样。
分支可以有任意多个在示例6-3中match有4个分支。
每个分支所关联的代码同时也是一个表达式而这个表达式运行所得到的结果值同时也会被作为整个match表达式的结果返回。
如果分支代码足够短就像示例6-3中仅返回一个值的话那么通常不需要使用花括号。
但是假如我们想要在一个匹配分支中包含多行代码那么就可以使用花括号将它们包裹起来。
例如下面的代码会在每次给函数传入Coin::Penny时打印“Lucky
匹配分支另外一个有趣的地方在于它们可以绑定被匹配对象的部分值而这也正是我们用于从枚举变体中提取值的方法。
下面举一个例子让我们修改上面的枚举变体来存放数据。
在1999年到2008年之间美国在25美分硬币的一侧为50个州采用了不同的设计。
其他类型的硬币都没有类似的各州的设计所以只有25美分拥有这个特点。
我们可以通过在Quarter变体中添加一个UsState值来将这些信息添加至枚举中如示例6-4所示。
示例6-4Coin枚举中的Quarter变体存放了一个UsState值#[derive(Debug)]
{Penny,Nickel,Dime,Quarter(UsState),
假设我们有一个朋友正在尝试收集所有50个州的25美分硬币。
当我们在根据硬币类型进行大致分类的时候也可以打印出每个25美分硬币所对应的州的名字。
一旦这个朋友发现了没有的硬币就可以将其加入自己的收藏中。
在这份代码的匹配表达式中我们在模式中加入了一个叫作state的变量用于匹配变体Coin::Quarter中的值。
当匹配到Coin::Quarter时变量state就会被绑定到25美分所包含的值上。
接着我们就可以在这个分支中像下面一样使用state了
如果我们在代码中调用value_in_cents(Coin::Quarter(UsState::
Alaska))Coin::Quarter(UsState::Alaska)就会作为coin的值传入函数。
Quarter(state)模式才会终止匹配。
这时值UsState::Alaska就会被绑定到变量state上。
表达式中使用这个绑定了这就是从Coin枚举的变体Quarter中获取值的方法。
在上篇文章中我们曾经想要在使用OptionT时从Some中取出内部的T值现在我们就可以如同操作Coin枚举一样使用match来处理OptionT了
除了使用OptionT的变体而不是Coin的变体来进行比较match表达式的大部分工作流程完全一致。
比如我们想要编写一个接收Optioni32的函数如果其中有值存在则将这个值加1。
如果其中不存在值那么这个函数就直接返回None而不进行任何操作。
得益于match方法的使用编写这个函数将会非常简单它看起来会如示例6-5所示
示例6-5一个对Optioni32使用match表达式的函数fn
让我们来分析一下首次执行plus_one的过程中究竟发生了些什么。
当我们调用plus_one(five)❸时plus_one函数体中的变量x被绑定为值Some(5)。
随后我们会将这个值与各个分支进行比较。
自然Some(5)没办法匹配上模式None❶所以我们继续尝试与下一个分支进行比较。
❷这里Some(5)会匹配上Some(i)吗答案是肯定的匹配的两端拥有相同的变体。
这里的i绑定了Some所包含的值也就是5。
接着这个匹配分支中的代码得到执行我们将i中的值加1并返回一个新的包含了结果为6的Some值。
现在再让我们来看一看示例6-5中plus_one的第二次调用这一次x变成了None❹。
依然继续进入match表达式并将它与第一个分支❶进行比较。
它们匹配上了这里我们没有可用于增加的对象所以右侧的程序会简单地终止并返回None值。
由于第一个分支匹配成功因此其他的分支会被跳过。
将match与枚举相结合在许多情形下都是非常有用的。
你会在Rust代码中看到许多类似的套路使用match来匹配枚举值并将其中的值绑定到某个变量上接着根据这个值执行相应的代码。
这初看起来可能会有些复杂不过一旦你习惯了它的用法就会希望在所有的语言中都有这个特性。
这一特性一直以来都是社区用户的最爱。
match表达式中还有另外一个需要注意的特性。
你可以先来看下面这个存在bug、无法编译的plus_one函数版本
此段代码的问题在于我们忘记了处理值是None的情形。
幸运的是这是一个Rust可以轻松捕获的问题。
假如我们尝试去编译这段代码就会看到如下所示的错误提示信息
Rust知道我们没有覆盖所有可能的情形甚至能够确切地指出究竟是哪些模式被我们漏掉了
Rust中的匹配是穷尽的exhausitive我们必须穷尽所有的可能性来确保代码是合法有效的。
特别是在这个OptionT的例子中Rust会强迫我们明确地处理值为None的情形。
这使得我们不需要去怀疑所持有值的存在性因而可以有效地避免前面提到过的10亿美金的错误。
有的时候我们可能并不想要处理所有可能的值Rust同样也提供了一种模式用于处理这种需求。
例如一个u8可以合法地存储从0到255之间的所有整数。
但假设我们只关心值为1、3、5或7时的情形我们就没有必要去列出0、2、4、6、8、9直到255等其余的值。
所幸我们也确实可以避免这种情形即通过使用一个特殊的模式_来替代其余的值
这里的_模式可以匹配任何值。
通过将它放置于其他分支后可以使其帮我们匹配所有没有被显式指定出来的可能的情形。
与它对应的代码块里只有一个()空元组所以在_匹配下什么都不会发生。
使用它也就暗示了我们并不关心那些在_通配符前没有显式列出的情形且不想为这些情形执行任何操作。
不过在只关心某一种特定可能的情形下使用match仍然会显得有些烦琐。
为此Rust提供了if
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback