【Rust】006-Rust 枚举与match、if let、let else 一、简介 在编程中,我们经常需要处理一组有限的、明确的值。例如,在游戏中,角色的移动方向只有上、下、左、右四种选择。...这种场景下,枚举(Enum)是一种非常合适的数据类型。Rust中的枚举不仅可以定义一组可能的值,还可以携带数据,使得代码更具表达力和安全性。...二、使用场景 枚举在Rust中有广泛的应用场景,特别是在以下情况下: 状态管理:如定义有限状态机中的状态。 数据分类:如处理不同类型的消息或事件。 错误处理:如定义可能出现的错误类型。...三、基本使用 1、定义枚举 在Rust中,定义枚举非常简单。...2、用if let简化代码 对于只关心某个变体的情况,可以使用if 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
变量绑定默认是不可变的(immutable),但加上 mut 修饰语后变量就可以改变。作用域和遮蔽变量绑定有一个作用域(scope),它被限定只在一个代码块(block)中生存(live)。...// 此绑定生存于 main 函数中 let spend = 1; // 这是一个代码块,比 main 函数拥有更小的作用域 { // 此绑定只存在于本代码块...("inner short: {}", target); // 此绑定*遮蔽*了外面的绑定 let spend = 2.0; println!...// 声明一个变量绑定 let spend; { let x = 2; // 初始化一个绑定 spend = x * x; } println...("spend: {}", spend); let spend2; // 报错!使用了未初始化的绑定 println!
("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 的模块。
JavaScriptCore 引擎的 Rust 绑定 rusty_jsc,这个库为 JavaScriptCore 引擎提供了一个 Rust API,主要目标: 用于 Swift 的 JavaScriptCore...V4L 公开的所有图像设置。...GitHub 链接,https://github.com/donkeyteethUX/kcam Wrapped_mono,在 Rust 中嵌入 mono 运行时 Wrapped_mono,是一个围绕 mono...库的安全轻量级包装器。...它允许在 Rust 代码中嵌入 mono 运行时(一个开源 .NET 运行时),并运行 .NET 框架中编写的代码。Wrapped_mono 允许在托管代码和非托管代码之间轻松互操作。
("Rust miscellaneous device sample (init)\n"); let state = SharedState::try_new()?...Rust for Linux 中的简单抽象 Rust 对 clk.h 对绑定相对比较简单,只绑定了部分控制clock的接口,比如 prepare_enable/disable_unprepare 和 get_rate...,还有很多接口没有绑定。...usize { // SAFETY: The pointer is valid by the type invariant. // 安全性说明:这个指针已经有上嘛结构体定义时的不变性来保证安全了...安全绑定代码虽然简单,但它反映出了 Rust for Linux 中 Unsafe Rust 安全抽象的一种规范:利用文档注释中不变性声明,强调了对依赖的内核 C 代码的信任,从而减少了检查达到零成本抽象
let chains 有望在 1.62 到达稳定状态 如果下面的 pull 通过, let chains 的语法支持有望在 1.62 到到达稳定. 届时,下面的语法将会被支持....("Peek a boo"); } } 原文链接:https://github.com/rust-lang/rust/pull/94927 veloren: 一个 Rust 编写的多人像素风游戏...《Veloren》是一款用 Rust 写的多人像素 RPG 游戏。...原文链接:https://www.veloren.net/ savage: Rust 编写的全新的计算机代数系统 Savage是一个全新的计算机代数系统,用纯Rust从头编写而成。...它的目标依次是正确性、简单性和可用性。整个系统编译成一个单独的、没有依赖关系的可执行文件,大小只有2.5 MB。
背景 本篇为一个新的章节《手动绑定 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 的强大。
什么是 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/ 是不是看到惊喜了
本篇是《手动绑定 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)]确保有一致的内存布局。
本篇,咱们一起来研究 Rust 与 C 之间的回调函数传递。...本篇的目标如下: 被调函数在 C 端,接收一个函数指针作为回调函数,并调用; 主函数在 Rust 中,在 Rust 中调用 C 端的这个函数; 在 Rust 中,传递一个 Rust 中定义的函数,到这个...),进行打印; Rust 端,定义一个回调函数 cb_func,在这个回调函数中,打印上述平方和; Rust 端,引入 C 中定义的 sum_square_cb01; 在 Rust 的 main 中,调用...); fn 是 Rust 中的函数指针类型。...从标准库页面可以学习到,Rust 中的 *const c_void 等于 C 的 const void*,Rust 中的 *mut c_void 等于 C 的 void*。
同时我们也知道 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类型的参数。
本篇,我们说明 Rust 调用 C 的另外一种场景:内存在 Rust 这边分配,在 C 中进行填充。...,初始化,并打印; 在 Rust 中,调用 C 中的 fill_data 填充结构体,并调用 C 中的 print_data 打印; 在 Rust 中,再次打印 C 填充后的结构体数据。..., new_stu); let box_new_stu = Box::new(new_stu); let p_stu = Box::into_raw(box_new_stu);...:在 Rust 中分配内存创建的结构体,在 C 中填充其内容并返回。...在 Rust 中初始化的结构体,要将其传递到 C 函数中进行数据填充时,我们使用了 Rust 的智能指针 Box。
所有权是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这边只是可变借用,然后填充了数据。
不变性(Immutability)是函数式编程的核心原理,也有很多面向对象的程序提供了这一特性。...在这篇文章中,我将展示什么是完全不变的,如何在JavaScript中使用这个概念,以及为什么它是有用的。 什么是不变性? 可变性的文本定义是可能会被改变的。...JavaScript中不变性的实践 JavaScript还没有不可变的列表和地图,所以我们现在需要一个第三方库。有两个很好的可用。...这要求我们跟踪保持状态的引用,但是整个问题现在已经减少到管理单个引用。 总结 我希望这篇文章给你提供了一些关于不变性如何帮助你改进你的代码的知识,所提供的例子可以说明这个工作的实际效果。...不变性这个概念正在持续升温。
强制不变性: 构造函数有助于强制类型的不变性。在Rust中,可能失败的构造函数返回Result。...可平凡复制类型: C++中的可平凡复制类型概念类似于Rust的Copy trait,允许进行字节对字节的复制。 移动构造函数: Rust的移动语义消除了C++中移动构造函数的需求。...这让在 Rust 中编写一些 typescript 的代码生成有了个多的选择. 下面是一些例子: let ts: String = ts_string!...{ const foo: number = 42; } // 生成的 typescript代码是: "const foo: number = 42;" let name = "foo"; let value...: u32 = 7; let ts: String = ts_string!
“ 本文节选自「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
问题描述 之前是搞java,平常判断都是用的if和else进行判断,这样稍微复杂的逻辑就要嵌套好多层 swift 1.x版本可以用if let稍微解决这个问题,swift2.x 则有了更好的解决方法(...guard),下面就用例子分别说明 例子 假设我们要根据本地推送通知中的type属性进行不同的处理, 三种不同的实现方式 只用if-else func application(application:...= nil){ let userinfo = notification.userInfo!; if(userinfo["type"] !...= nil){ let type = userinfo["type"] as!...第三种方法相对于第二种方法就没了复杂的嵌套关系, guard可以理解为if的意思,但if中定义的变量只能在{}中使用,guard中定义的变量则可以在同级使用
本文就从”不变性“(invariants)的角度,给大家一些增加信心的”打开方式“。 循环不变性 如果大家看过算法导论,应该对这个词不陌生。...对于循环不变性来说,就是找到一种解决该问题的合适性质,然后通过在循环的三阶段中维持该性质,我们就不至于陷入海量的细节中去出不来。...其他的不变性 除了循环不变性之外,我们在工程中其实也常用到不变性的思想,只是我们没有往这边去靠。 接口 接口通常包含一组操作集,这些操作集就定义了某种“性质”。...而无论接口之下做何种实现,都要保证提供这些操作,这便是要维持“不变性”。有了这种不变性保证,所有接口的依赖方,就可以不必担心你如何实现,只需要面向接口进行编程即可。...如果测试用例覆盖足够完善,我们在进行代码重构时,即使进行了大幅度的修改,但只要保证测试都能跑过,我们就很有信心——我们的重构没有大问题。即,这些完善的测试集给我们的代码逻辑保证了逻辑上的“不变性”。
粗略地说,语言中唯一的语句是创建一个绑定。 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 的函数时,它必须确保在安全的代码中观察不到违反的不变性,这些不变性可能会触发未定义行为。
领取专属 10元无门槛券
手把手带您无忧上云