首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Rust】006-Rust 枚举与`match`、`if let`、`let else`

【Rust】006-Rust 枚举与match、if let、let else 一、简介 在编程中,我们经常需要处理一组有限的、明确的值。例如,在游戏中,角色的移动方向只有上、下、左、右四种选择。...这种场景下,枚举(Enum)是一种非常合适的数据类型。Rust中的枚举不仅可以定义一组可能的值,还可以携带数据,使得代码更具表达力和安全性。...二、使用场景 枚举在Rust中有广泛的应用场景,特别是在以下情况下: 状态管理:如定义有限状态机中的状态。 数据分类:如处理不同类型的消息或事件。 错误处理:如定义可能出现的错误类型。...三、基本使用 1、定义枚举 在Rust中,定义枚举非常简单。...2、用if let简化代码 对于只关心某个变体的情况,可以使用if let简化代码,避免不必要的复杂性。

7900

Rust流程控制:if let和while let

与C相比,Rust多了if let和while let这两个流程控制语句,因为之前我没有接触过这种,因此第一感觉就是有点抽象。...为了实现这样的目标,我们引入了match语句。而match语句要求我们必须为其他情况编写一个处理分支,这显得不是那么的雅观。if let语句的引入正是为了改善上述代码的整洁度。...("failed."); } while let语句 与if let类似,while let语句解决的是下面这个“循环匹配一个分支“的场景中,match语句带来的复杂性的问题。...所以,while let语句其实就是相当于只有一个待匹配分支的loop{match{}}语句块的功能。...参考资料: https://doc.rust-lang.org/rust-by-example/flow_control/if_let.html https://doc.rust-lang.org/rust-by-example

40750
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Rust学习】12_if let 简单控制流

    ("The maximum is configured to be {max}"), _ => (), }}如果值为 Some,我们通过将值绑定到模式中的变量 max 来打印出 Some...在这种情况下,模式是 Some(max),并且 max 绑定到 Some 中的值。然后,我们可以在 if let 块的主体中使用 max,就像我们在相应的 match 分支中使用 max 一样。...; } else { count += 1; }}如果你的情况是你的程序的逻辑太冗长而无法使用 match 来表示,请记住 if let 也在你的 Rust 工具箱中。...您的 Rust 程序现在可以使用结构和枚举来表达作用域中的概念。创建要在 API 中使用的自定义类型可确保类型安全:编译器将确保您的函数仅获取每个函数期望的值。...为了给你的用户提供一个组织良好的 API,它易于使用,并且只公开你的用户需要的东西,现在让我们转向 Rust 的模块。

    10710

    Rust FFI 编程 - 手动绑定 C 库入门 01

    背景 本篇为一个新的章节《手动绑定 C 库入门》的第一篇。从这个章节开始,我们将会进行使用 Rust 对 C 库进行封装的实践。 这个章节,大概会由 6 ~8 篇文章组成。...这种谨慎的设计哲学,使得 Rust 可以真正地严肃地来重新审视过去整个 IT 工业的基础,也使得 Rust 有潜力成为新时代的 IT 工业的基石。...let psrc = src.as_ptr(); let mut dstlen = snappy_max_compressed_length(srclen); let...Rust 的绑定,由 Rust 语言自己写 本篇代码,我们可以看到,整个 C 库的绑定层,都是 Rust 语言代码。可能你暂时还不熟悉那些指针转换什么的,但那确确实实是 Rust 代码。...如果你以前做过一些其它高级语言绑定 C 库的工作,那么你会对此深有体会,那些语言,都得用 C 语言来写绑定的。 看似简单的事情,其实反映了 Rust 的强大。

    1.8K31

    Windows Ubuntu Bash申请免费通配符证书(Let’s Encrypt)并绑定IIS

    什么是 Let’s Encrypt? 部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用。...如何申请 Let’s Encrypt 通配符证书 为了实现通配符证书,Let’s Encrypt 对 ACME 协议的实现进行了升级,只有 v2 协议才能支持通配符证书。...接下去就是命令行的输出: 上述有两个交互式的提示: 是否同意 Let's Encrypt 协议要求 询问是否对域名和机器(IP)进行绑定 确认同意才能继续。...看到服务器证书里面,就能发现我们申请的通配符证书了 接下来,我们给一个站点绑定随便一个二级域名,比如:a.51tcsd.com 首先把hosts文件把a.51tcsd.com解析到我本机127.0.0.1...然后在IIS里选择站点”Default Web Site"选择右边的“绑定” 输入相关信息,并选择证书 然后我们在浏览器里访问https://a.51tcsd.com/ 是不是看到惊喜了

    1.5K10

    Rust FFI 编程 - 手动绑定 C 库入门 02

    本篇是《手动绑定 C 库入门》的第二篇。了解第一篇后,我们知道在调用 C 库时,需要重新在 Rust 中对该 C 库中的数据类型和函数签名进行封装。...这篇我们将实践涉及到诸如数组,结构体等类型时,如何进行手动绑定。 备注:有自动生成绑定的工具,比如,bindgen可以自动生成 C 库和某些C ++库的 Rust FFI 绑定。...// ffi/rust-call-c/src/array.rs use std::os::raw::c_int; // 对 C 库中的 sum 函数进行 Rust 绑定: extern "C" {...#[repr(C)] pub struct OpaqueObject { _private: [u8; 0], } 同样的,对该 C 库中的函数进行 Rust FFI 手动绑定,示例如下: extern...总结 在 Rust 中调用 C 库,进行 Rust FFI 绑定: 传递结构体类型的参数时,可以使用repr属性#[repr(C)]确保有一致的内存布局。

    1.2K20

    Rust FFI 编程 - 手动绑定 C 库入门 06

    同时我们也知道 Rust 中的所有的闭包都实现了由标准库提供的 trait Fn、FnMut 或 FnOnce 中的一个。...; Rust 端,定义一个闭包,被调用时更新数据 user_data; Rust 端,调用 C 中定义的 sum_square_cb; 好,代码部分 C 端保持不变,我们看 Rust 端的两个函数hook...在函数体中的这一句 let closure = &mut *(user_data as *mut F); ,先通过把 *mut c_void 指针转换成 *mut F 指针,然后用 * 取得它的数据块,...接下来我们 Rust 端的主函数,代码如下: fn main() { let mut record = SumRecord::default(); unsafe {..., record); } 这个 let mut closure 语句意味着 closure 包含一个匿名函数的 定义,而不是调用后的 返回值,该函数接受一个c_int类型的参数。

    1.2K20

    Rust FFI 编程 - 手动绑定 C 库入门 03

    所有权是Rust中最核心的关注点之一。在Rust中,变量有严格的所有权关系,并于此之上建立了一整套上层建筑。 本篇,我们对Rust调用C场景下的一种数据所有权场景进行编程。.../src/array.rs use std::os::raw::c_int; // 对 C 库中的 sum 函数进行 Rust 绑定: extern "C" { fn sum(my_array...let format = b"%Y-%m-%d %H:%M:%S\0".as_ptr(); unsafe { // 调用 time::strftime_in_rust...可以看到,达到了我们的预期目标:在Rust中,修改C中创建的结构体数组内容。...所有权分析 整个Rust代码,实际就是调用了C导出的函数。C那边的数据资源,完全由C自己掌控,分配和释放都是C函数自己做的(这点非常重要)。Rust这边只是可变借用,然后填充了数据。

    1.6K10

    JavaScript 中的 不变性(Immutability)

    不变性(Immutability)是函数式编程的核心原理,也有很多面向对象的程序提供了这一特性。...在这篇文章中,我将展示什么是完全不变的,如何在JavaScript中使用这个概念,以及为什么它是有用的。 什么是不变性? 可变性的文本定义是可能会被改变的。...JavaScript中不变性的实践 JavaScript还没有不可变的列表和地图,所以我们现在需要一个第三方库。有两个很好的可用。...这要求我们跟踪保持状态的引用,但是整个问题现在已经减少到管理单个引用。 总结 我希望这篇文章给你提供了一些关于不变性如何帮助你改进你的代码的知识,所提供的例子可以说明这个工作的实际效果。...不变性这个概念正在持续升温。

    1K20

    深入 Rust 1.63 新特性 Scoped Thread

    “ 本文节选自「Rust 生态蜜蜂」。Rust 生态蜜蜂是觉学社公众号开启的一个付费合集。生态蜜蜂,顾名思义,是从 Rust 生态的中,汲取养分,供我们成长。...先来看看标准库中普通线程的限制: let greeting = String::from("Hello world!")...,为'env 和 'scope 设定了不变性(Invariance)[4],以便编译器可以识别生命周期收缩的情况。...所以这里违反了不变性,编译错误。 除了通过生命周期参数来让编译器安全检查保证 Scoped Thread 的引用正确性。内部还通过 Arc对运行的线程和panic的线程进行记录。.../nightly/std/thread/fn.scope.html [4] 不变性(Invariance): https://doc.rust-lang.org/nomicon/phantom-data.html

    1.8K10

    写对代码的利器——“循环不变性”

    本文就从”不变性“(invariants)的角度,给大家一些增加信心的”打开方式“。 循环不变性 如果大家看过算法导论,应该对这个词不陌生。...对于循环不变性来说,就是找到一种解决该问题的合适性质,然后通过在循环的三阶段中维持该性质,我们就不至于陷入海量的细节中去出不来。...其他的不变性 除了循环不变性之外,我们在工程中其实也常用到不变性的思想,只是我们没有往这边去靠。 接口 接口通常包含一组操作集,这些操作集就定义了某种“性质”。...而无论接口之下做何种实现,都要保证提供这些操作,这便是要维持“不变性”。有了这种不变性保证,所有接口的依赖方,就可以不必担心你如何实现,只需要面向接口进行编程即可。...如果测试用例覆盖足够完善,我们在进行代码重构时,即使进行了大幅度的修改,但只要保证测试都能跑过,我们就很有信心——我们的重构没有大问题。即,这些完善的测试集给我们的代码逻辑保证了逻辑上的“不变性”。

    9910

    【译】为 嵌入式 C 程序员编写的 Rust 指南

    粗略地说,语言中唯一的语句是创建一个绑定。 let x: u32 = foo(); :后面的类型是可选的,如果缺少,编译器将使用当前范围内的所有信息,包括let之前和之后的信息,来推断出一个类型。...let绑定在默认情况下是不可变的,但是let mut x = /* ... */;将使其成为可变的。 和C语言一样,重新赋值是一个表达式,但和C语言不同的是,它求值为()而不是赋值。...(注意,类型检查并不包括在内;模式不能表达式的类型)。 可以选择将表达式的值绑定到一个名字上。 可以选择递归到子模式中。 下面是几个模式的例子。请记住每个模式的匹配、绑定和递归属性。...绑定T:'a表示T中的每个引用都比'a长;每当一个通用的&'a T被传递时,这种绑定将被隐式插入。限定可以被组合: T: Clone + Default 和 T: Clone + 'a都是有效的限定。...每当 unsafe 的代码调用到一个unsafe 的函数时,它必须确保在安全的代码中观察不到违反的不变性,这些不变性可能会触发未定义行为。

    5.2K30
    领券