Rust 程序设计语言 简体中文版 1.85.0
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.1. 变量与可变性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 12.5. 处理环境变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . rustc x.y.z (abcabcabc yyyy-mm-dd) 如果看到了这样的信息,就说明 Rust 已经安装成功了!如果没看到,请按照下面说明的方法 检查 Rust 是否在您的 %PATH% 系统变量中。 在 Windows CMD 中,请使用命令: > echo %PATH% 在 PowerShell 中,请使用命令: > echo $env:Path 在 Linux 和 macOS0 码力 | 562 页 | 3.23 MB | 10 天前3Rust 语言学习笔记
的包管理系统非常明显地体现了它的与众不同。 1.3 版本管理工具 作为一门更新快速的语言,rust 开发了专用的版本管理工具 rustup。 对于 go 而言,不需要对这些东西进行了解,只需要下载包安装到环境变量中即 可。 而 rust 的开发中经常会遇到配置不同的 toolchain 等需求,因此官方开发了 rustup。rustup 功能如下: 1.管理安装多个官方版本的 Rust 二进制程序。 ("x: {}, y: {}", x, y); } } 2.4 Rust 类型系统 2.4.1 可变性 rust 在声明变量时,在变量前面加入 mut 关键字,变量就会成为可变绑定的 变量。 通过可变绑定可以直接通过标识符修改内存中的变量的值。 在绑定后仍然可以重新修改绑定类型。 例子: fn main() { let mut a: f64 = 1.0; // 变量 a 的作用域开始 a = 100; char *c = "xyz"; // 变量 c 的作用域开始 return &a; } // 变量 a 和 c 的作用域结束 尽管可以编译通过,但这是一段非常糟糕的代码,变量 a 和 c 都是局部变量, 函数结束后将局部变量 a 的地址返回,但局部变量 a 存在栈中,在离开作用域0 码力 | 117 页 | 2.24 MB | 1 年前3Comprehensive Rust(简体中文) 202412
类型和值 25 5.1 Hello, World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 5.2 变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 5.3 值 . . . . 30.2 解引用裸指针 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 30.3 可变的静态变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 30.4 联合体 . . . . . . . . . 197 34.2.3 特征对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 34.2.4 变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 34.2.5 Sending Files0 码力 | 359 页 | 1.33 MB | 10 月前3Hello 算法 1.1.0 Rust版
代码,直到这个条件不再满足。 1. for 循环 for 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 : // === File: iteration mut i = 1; // 初始化条件变量 // 循环求和 1, 2, ..., n-1, n while i <= n { res += i; i += 1; // 更新条件变量 } res } while 循环比 for 循环的自由度更高。在 while 循环中,我们可以自由地设计条件变量的初始化和更新步 骤。 例如在以下代码中,条件变量 ? 每轮进行两次更新,这种情况就不太方便用 while_loop_ii(n: i32) -> i32 { let mut res = 0; let mut i = 1; // 初始化条件变量 // 循环求和 1, 4, 10, ... while i <= n { res += i; // 更新条件变量 i += 1; i *= 2; } res } 总的来说,for 循环的代码更加紧凑,while 循环更加灵活,两者都可以实现迭代结构。选择使用哪一个应该0 码力 | 388 页 | 18.50 MB | 1 年前3Hello 算法 1.2.0 简体中文 Rust 版
代码,直到这个条件不再满足。 1. for 循环 for 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 : // === File: iteration res = 0; let mut i = 1; // 初始化条件变量 // 循环求和 1, 2, ..., n-1, n while i <= n { res += i; i += 1; // 更新条件变量 } res } while 循环比 for 循环的自由度更高。在 while 循环中,我们可以自由地设计条件变量的初始化和更新步 骤。 第 2 章 复杂度分析 www.hello‑algo com 21 例如在以下代码中,条件变量 ? 每轮进行两次更新,这种情况就不太方便用 for 循环实现: // === File: iteration.rs === /* while 循环(两次更新) */ fn while_loop_ii(n: i32) -> i32 { let mut res = 0; let mut i = 1; // 初始化条件变量 // 循环求和 1, 4, 100 码力 | 387 页 | 18.51 MB | 10 月前3Hello 算法 1.0.0 Rust版
段代码,直到这个条件不再满足。 1. for 循环 for 循环是最常见的迭代形式之一,适合在预先知道迭代次数时使用。 以下函数基于 for 循环实现了求和 1 + 2 + ⋯ + ? ,求和结果使用变量 res 记录。需要注意的是,Python 中 range(a, b) 对应的区间是“左闭右开”的,对应的遍历范围为 ?, ? + 1, … , ? − 1 : // === File: iteration 初始化条件变量 // 循环求和 1, 2, ..., n-1, n while i <= n { res += i; i += 1; // 更新条件变量 } res } while 循环比 for 循环的自由度更高。在 while 循环中,我们可以自由地设计条件变量的初始化和更新步 骤。 第 2 章 复杂度分析 hello‑algo.com 21 例如在以下代码中,条件变量 ? 每轮进行两次更新,这种情况就不太方便用 while_loop_ii(n: i32) -> i32 { let mut res = 0; let mut i = 1; // 初始化条件变量 // 循环求和 1, 4, 10, ... while i <= n { res += i; // 更新条件变量 i += 1; i *= 2; } res } 总的来说,for 循环的代码更加紧凑,while 循环更加灵活,两者都可以实现迭代结构。选择使用哪一个应该0 码力 | 383 页 | 17.61 MB | 1 年前3Rust语言核心竞争力-庄晓立
Drop & RAII 变量(bindings)和资源(resources)的关系 Resources: memories, objects, connections, files, sockets, threads, ... 因为有“所有权转移”的存在: 同一个资源可能由变量A持有或变量B持有; 同一个变量可能持有资源也可能不持有资源; 同一时刻有且只有一个变量唯一持有(Owns)某个资源。 源。 持有资源的变量超出作用域或被另赋新值时,自动调用 资源析构函数(Drop),无论该资源在堆上还是栈上。 Rust的RAII青出于蓝而胜于蓝(蓝=C++) (std::unique_ptr) Borrowing(租借使用权) Shared borrow (多人共享/只 读) Mutable borrow (独家修改和使用权) &T &mut T &T Owners Clients0 码力 | 51 页 | 1.09 MB | 1 年前3尝试用RUST写教学操作系统
unsafe块是一个精妙的设计,在你 想偷懒破坏安全性时给你带来⼩ 小的骚扰 13 Rust的安全特征 • 类型安全: 远离void* 保安全. 远离隐式cast • 内存安全: 编译器自动推断变量的生命周期, 自动插 入free,防止程序员忘记写free. (原则上) 不会有null- pointer-dereference, double free, use-after-free 等内 存问题 有runtime 检查ownership / buffer overflow -> 缓冲区溢出不会导致system compromise • 并发安全: 对于全局变量, 它自带一个锁. 访问全局变 量的过程必须取得锁 -> C里面全局变量和锁时分离 的, 时常会忘记加锁,当锁离开作用域时自动释放, 防 止造成死锁 • Rust 提供了unsafe 这种块能够做不安全但必须的事 情如指针算术.0 码力 | 23 页 | 1.53 MB | 1 年前3基于静态分析的Rust内存安全缺陷检测研究
▪ Rust在语法设计中引入所有权机制,简化指针分析问题 Rust所有权模型 => XOR Mutability ❑ 一个对象有且只有一个所有者 ❑ 所有权可以转移给其它变量 ▪ 用完不用还 ❑ 所有权可以被其它变量借用 ▪ 用完自动归还 ▪ 只读(immutable)借用:& ▪ 可变(mutable )借用:& mut fn main(){ let mut alice = Box::new(1); normal execution Bad drop of exception handling drop(_0) 返回值 Auto Memory Reclaim问题:示例2 创建未初始化的变量foo Panic将导致访问未初始化内存 大纲 一、问题背景 二、Rust指针缺陷检测方法 三、实验结论 四、论文发表心得 研究挑战和思路 ❑ 研究挑战:指针分析是NP-hard问题0 码力 | 28 页 | 1.55 MB | 1 年前3Rust 异步并发框架在移动端的应用 - 陈明煜
成。 Structured concurrency 结构化并发带来的好处: 更高的易用性,用户不再需要显示调用 await 提高程序的可读性和可维护性 保证了变量生命周期合法,使子任务可以捕获父任务的变量 结构化并发 Structured concurrency Scope Rust 线程中的结构化并发 阻塞等待所有 Scope 内的子线程任务完成 子线程执行的闭包中可以捕获0 码力 | 25 页 | 1.64 MB | 1 年前3
共 13 条
- 1
- 2