Rust语言核心竞争力-庄晓立零开销原则/zero-overhead principle • What you don't use, you don't pay for • What you do use, you couldn't hand code any better – Stroustrup, 1994 不为用不到的特性付出代价 仅为用到的特性付出最低代价 这是C++的设计原则,也是Rust的设计原则 No Ownership(所有权) pub struct Vec{ ptr: Unique , cap: usize, len: usize, } Very big data in the heap ... ptr cap len ptr cap len 栈(Stack) 堆(Heap) 浅拷贝(Shallow Copy) 附加Move语义 Drop 0 码力 | 51 页 | 1.09 MB | 1 年前3
Hello 算法 1.1.0 Rust版如果感觉以下内容理解困难,可以在读完“栈”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。根据此原则,可以总结出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 len(); /* 判断是否为空 */ let is_empty = stack.is_empty(); 5.1.2 栈的实现 为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。 栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和 删除元素,因此栈可以视为一种受限制的数组或链表。换句话说,我们可以“屏蔽”数组或链表的部分无关 操作,使其对外表现的逻辑符合栈的特性。0 码力 | 388 页 | 18.50 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Rust 版如果感觉以下内容理解困难,可以在读完“栈”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。根据此原则,可以总结出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 len(); /* 判断是否为空 */ let is_empty = stack.is_empty(); 5.1.2 栈的实现 为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。 栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和 删除元素,因此栈可以视为一种受限制的数组或链表。换句话说,我们可以“屏蔽”数组或链表的部分无关 操作,使其对外表现的逻辑符合栈的特性。0 码力 | 387 页 | 18.51 MB | 10 月前3
Hello 算法 1.0.0 Rust版”章节后再来复习。 那么,迭代和递归具有什么内在联系呢?以上述递归函数为例,求和操作在递归的“归”阶段进行。这意味 着最初被调用的函数实际上是最后完成其求和操作的,这种工作机制与栈的“先入后出”原则异曲同工。 事实上,“调用栈”和“栈帧空间”这类递归术语已经暗示了递归与栈之间的密切关系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。根据此原则,可以总结出以下计数简化技巧。 1. 忽略 ?(?) 中的常数项。因为它们都与 ? 无关,所以对时间复杂度不产生影响。 2. 省略所有系数。例如,循环 2? 次、5? + 1 次等,都可以简化记为 len(); /* 判断是否为空 */ let is_empty = stack.is_empty(); 5.1.2 栈的实现 为了深入了解栈的运行机制,我们来尝试自己实现一个栈类。 栈遵循先入后出的原则,因此我们只能在栈顶添加或删除元素。然而,数组和链表都可以在任意位置添加和 删除元素,因此栈可以视为一种受限制的数组或链表。换句话说,我们可以“屏蔽”数组或链表的部分无关 操作,使其对外表现的逻辑符合栈的特性。0 码力 | 383 页 | 17.61 MB | 1 年前3
Rust算法教程 The Algos (algorithms)组、 指针数组和结构数组等。数组还可以有⼀维、⼆维以及多维等表现形式。 2. 栈( Stack) 栈是⼀种特殊的线性表,它只能在⼀个表的⼀个固定端进⾏数据结点的插⼊和删 除操作。栈按照后进先出的原则来存储数据,也就是说,先插⼊的数据将被压⼊栈底,最后 插⼊的数据在栈顶,读出数据时,从栈顶开始逐个读出。栈在汇编语⾔程序中,经常⽤于重 要数据的现场保护。栈中没有数据时,称为空栈。 3. 队列(Queue) node_iter(&self) -> NodeIter{ let cap = self.root.as_ref().map_or(0, |n| n.height); let mut node_iter = NodeIter { stack: Vec::with_capacity(cap), }; // Initialize 0 码力 | 270 页 | 8.46 MB | 1 年前3
Comprehensive Rust(简体中文) 202412A destructor can run here to free up resources. 熟悉垃圾回收实现的学生知道,垃圾回收器从一组“根”开始查找所有可访问内存。Rust 的“单一所有者” 原则与此类似。 19.4 移动语义 An assignment will transfer ownership between variables: fn main() { let s1: String max_in - min_in; let range_out = max_out - min_out; 261 cap(min_out + range_out * (value - min_in) / range_in, min_out, max_out) } fn cap(value: i32, min_value: i32, max_value: i32) -> i32 { max(min_value0 码力 | 359 页 | 1.33 MB | 10 月前3
Rust 语言学习笔记slice_complete = &arr[..]; // 获取全部元素 let slice_middle = &arr[1..4]; // 获取中间元素,最后取得的 Slice 为 [2, 3, 4] 。切片遵循左 闭右开原则。 let slice_right = &arr[1..]; // 最后获得的元素为[2, 3, 4, 5, 6],长度为 5。 let slice_left = &arr[..3]; // 最后获得的元素为[1 // 匿名函数中的 FnOnce/FnMut/Fn // 首先 FnOnce/FnMut/Fn 这三个东西被称为 Trait, // 默认情况下它们是交给 rust 编译器去推理的, 大致的推理原则是: // FnOnce: 当指定这个 Trait 时, 匿名函数内访问的外部变量必须拥有所有权. // FnMut: 当指定这个 Trait 时, 匿名函数可以改变外部变量的值 FnMut 匿名函数. let pushed_data = || { b.push_str(" world!"); // 由于 rust 的 mutable 原则是, 只允许一个 mut 引用, 因此 变量 b 不能 // 再被其他代码引用, 所以这里要返回更改后的结果. b }; let c = pushed_data();0 码力 | 117 页 | 2.24 MB | 1 年前3
尝试用RUST写教学操作系统13 Rust的安全特征 • 类型安全: 远离void* 保安全. 远离隐式cast • 内存安全: 编译器自动推断变量的生命周期, 自动插 入free,防止程序员忘记写free. (原则上) 不会有null- pointer-dereference, double free, use-after-free 等内 存问题. rust 有runtime 检查ownership / buffer0 码力 | 23 页 | 1.53 MB | 1 年前3
Rust在Substrate 开发框架中的使用Self::deposit_event(RawEvent::Authenticated(sender, property_id, is_authenticated)); Ok(()) } 应用链开发 - 开发原则 ● 安全检查优先 ● 线下处理计算密集的任务 ● 文件存储采用其它方案,如 IPFS 应用源码 :kaichaosun/substrate-real-estate -node Demo0 码力 | 37 页 | 967.22 KB | 1 年前3
Comprehensive Rust(Português do Brasil) 202412Alguns assuntos que não são objetivos deste curso são: • Aprender a criar macros: por favor confira Capítulo 19.5 em Rust Book e Rust by Example para esse fim. Premissas O curso pressupõe que você já que o instrutor deve cobrir quanto respostas a perguntas típicas que surgem em sala de aula. 12 Capítulo 1 Conduzindo o Curso Esta página é para o instrutor do curso. Aqui estão algumas informações consulte nossas instruções sobre como proceder. As traduções são coordenadas no issue tracker. 18 Capítulo 2 Usando o Cargo Quando você começar a ler sobre Rust, logo conhecerá o Cargo, a ferramenta0 码力 | 389 页 | 1.05 MB | 10 月前3
共 25 条
- 1
- 2
- 3













