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

Rust for Rustaceans》 样章试译 | 第二章 Rust 基础

我们可以通过解引用(dereference)指针来访问存储它所指向内存位置值。也可以多个变量存储相同指针,这些变量正确地指向内存同一个位置,从而指向相同值。...构成函数局部变量字节不会被立即清除,但是访问它们并不安全,因为它们可能已经被后续与回收栈帧重叠函数调用栈帧所覆盖了。即便它们没有被覆盖,也可能包含了非法使用值,例如在函数返回时被移动值。...如果该值是函数返回值,调用函数可以在其栈留下一些空间,让被调用函数返回前将该值写入其中。但是,如果你想将该值发送给不同线程,而当前线程可能根本不与之共享栈帧,那么你可以将其存储堆上。... Rust ,当保存值变量不在作用内时,会自动析构。类型通常会递归地析构它们包含值,因此析构复杂类型变量可能会导致析构很多值。...“析构顺序 当值超出作用时, Rust 会自动析构它们,比如清单 2-3 内部作用 x1 和 x2 。析构顺序规则相当简单:变量(包括函数参数)按相反顺序析构,嵌套值按源代码顺序析构。

5.4K31

Rust学习笔记之所有权

假设有这样一个变量: let s = "hello"; 这里变量s指向了一个字符串字面量,它值被硬编码到了当前程序。「变量声明位置开始直到当前作用结束都是有效」。...Rust变量离开作用时,会调用一个叫做drop特殊函数。「Rust会在作用结束地方自动调用drop函数」。...---- 变量和数据交互方式:移动 Rust多个变量可以采用一种独特方式与同一数据进行交互。 let x = 5; let y = x; 将变量x绑定值重新绑定到变量y上。...之前我们提到过当变量离开作用后,Rust 「自动调用」 drop 函数并清理变量堆内存。不过上图展示了「两个数据指针指向了同一位置」。...不会有特殊操作 当尝试调用 takes_ownership 后使用 s 时,Rust 会抛出一个编译时错误。 ---- 返回值与作用返回值也可以转移所有权。

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

RUST 语言特性之所有权

研究上面的代码,可以发现一个很适合用来回收内存给操作系统地方:变量 s 离开作用地方。Rust 变量离开作用时,会调用一个叫作 drop 特殊函数。...String 类型作者可以在这个函数编写释放内存代码。 注:Rust会在作用结束地方(即 } 处)自动调用 drop 函数。...对,技术就是这样传承。 根据前面的规则,当一个变量离开当前作用时,Rust 会自动调用 drop 函数,并将变量使用堆内存释放回收。...其实在 C++ ,设计对象深拷贝和浅拷贝同样存在考量。 所有权与函数 C++ ,将指针问题复杂化一个因素就是各种函数调用返回RUST 语言同样如此。...这些不用特别去记忆,RUST 可以通过静态检查使我们免于犯错。 对于返回值,同样如此。 总结起来,变量所有权转移总是遵循相同模式: 将一个值赋值给另一个变量时就会转移所有权。

75060

rust所有权系统

当程序需要访问堆内存时候,必须通过指针去访问,这就导致访问堆内存比访问慢。栈数据好管理,当你代码调用一个函数时,传递给函数值和函数局部变量被压入栈调用结束后,这些数据出栈。...("{x}"); // error,变量x作用仅限于上面的{}之中,当离开作用之后,无法访问。 } 转移所有权 前面说过rust每一个值有且仅有一个所有者。...浅拷贝时候只拷贝堆指针、字符串长度、字符串容量。现在假定一个值可以拥有两个所有者。当变量离开作用后,Rust 会自动调用 drop 函数并清理变量堆内存。...不过由于两个 String 变量指向了同一位置。这就有了一个问题:当 x 和 y 离开作用它们都会尝试释放相同内存。...("{y}"); } 这段代码调用了clone,和前文没有调用clone运行结果是一致Rust 有一个叫做 Copy 特征,可以用在类似整型这样存储类型。

54310

Rust入坑指南:核心概念

Ownership规则 Rust,每一个值都有对应变量,这个变量称为值owner 一个值某一时刻只能有一个owner 当owner超出作用后,值会被销毁 这三条规则非常重要,记住他们会帮助你更好理解本文...变量作用 Ownership规则,有一条是owner超过范围后,值会被销毁。那么owner范围又是如何定义呢?Rust,花括号通常是变量范围作用标志。...最常见一个函数变量s范围定义开始生效,直到函数结束,变量失效。...("{}", some_string); } // some_string 超出作用调用了drop函数 // 内存被释放 那有没有办法执行takes_ownership函数使s继续生效呢?...如果需要使用多个可修改引用,我们可以自己创建新作用: let mut s = String::from("hello"); { let r1 = &mut s; } // r1 超出作用

83120

听GPT 讲Rust源代码--compiler(28)

作用可以函数、模块、循环、条件语句等代码块,也可以是代码某个片段。作用映射表每一项都包含了作用起始位置和结束位置,以及该作用作用列表。...通过作用映射表,调试器可以准确地还原源代码层次结构并提供准确变量作用create_scope_map函数实现,它首先会创建一个根作用,并将其作为初始的当前作用。...这些选项用于控制在编译期间如何访问函数。以下是VCallVisibility枚举常见选项: Public - 公共可见性,表示任何代码都可以访问函数。...通过生成正确元数据,开发人员可以调试器查看变量值、函数调用堆栈和源代码位置等信息,便于分析和解决问题。...它主要作用是提供对Builder借用和访问使代码生成过程更加安全和高效。

7010

Rust作用作用规则

所有权是 Rust 最独特特性,它使 Rust 能够不需要 GC 情况下保证内存安全。本章,我们将讨论所有权以及几个相关特性:借用/切片,以及 Rust 如何在内存布局数据。...下图展示了一个字符是如何存储在内存变量 s 保存在栈,其值是一个指向堆地址,堆则保存了字符串具体内容。 所有权实际规则 Rust 每个值都绑定有一个变量,称为该值所有者。...("{}", value1); { let value2 = 2; } // 无法value2作用之外使用该变量 // println!...生命周期注解 绝大多数情况下,Rust 编译器可以自动推导每个变量生命周期。但有时候也需要我们手动代码中注明生命周期,例如存在两个不同引用变量,而编译器又无法自动推导情况。...我们试图编写一个函数,该函数返回一个字符串 &str。但问题来了,字符串内容 “Hello World!” 作用函数体,而函数却试图返回引用。

3.9K30

一名Java开发Rust学习笔记

、这块内存所有者; 每个值一个时间点上只有一个管理者; 当变量所在作用结束时候,变量以及它代表值将会被销毁。...注意,longest函数本身并不需要知道x与y具体存活时长,只要某些作用可以被用来替换'a并满足约束就可以了。 当我们函数中标注生命周期时,这些标注会出现在函数签名而不是函数。...7.2.3 Currying(柯里化) 计算机科学,柯里化是把接受多个参数函数变换成接受一个单一参数(原函数第一个参数)函数,并返回接受余下参数和返回结果函数技术。...Rust编译器规则,它需要知道每个函数返回类型需要多少空间,这就意味着类型需要被确定。那么该如何解决呢?...C/C++宏只预处理阶段起作用,因此只能实现类似文本替换功能。而Rust语法解析之后起作用,因此可以获取更多上下文信息,而且更加安全。

14210

Rust闭包虫洞穿梭

可以闭包内直接捕获并使用定义所处作用值(独有); 神奇是最后一点,理解起来也比较别扭,习惯就好了。...最后神奇事情出现了:函数display调用闭包居然打印出了函数main作用域中变量name。 ?...Rust闭包捕获上下文方式 如本篇题目,Rust闭包如何捕获上下文? 换个问法,main作用域中变量name是以何种方式进入闭包作用(第1节例子)?转移or借用?...,还有一个目的,我们想让闭包捕获函数内部环境值,但这次有些不同: 第1节代码示例,我们把外层环境上下文,通过将闭包传入内层函数,这个不难理解,因为外层变量生命周期更长,内层函数访问时,外层变量还活着...后者总会给人一丝不安:内部函数调用都结束了,居然局部变量还活着。 代码所有权转移,这里使用了关键字move,它可以构建闭包时,强制将要捕获变量所有权转移至闭包内部特别存储区。

1.3K20

听GPT 讲Rust源代码--librarystd(13)

这些stat结构体作用是提供了对文件描述符、文件以及文件系统状态进行查询和操作能力。它们通常会在系统调用作为参数传递,或者作为返回返回调用者。...例如,open函数用于打开指定文件,并返回一个文件描述符;read函数用于文件读取数据等。...通过引入这些头文件,Rust代码可以与底层FreeBSD系统进行交互。 定义与系统调用相关函数 mod.rs 文件,会定义一系列函数用于调用和处理FreeBSD操作系统提供系统调用。...它允许多个Unix套接字连接,并返回UnixStream用于进行通信。...这些子模块函数和类型提供了对底层操作系统功能封装和抽象,使开发者可以更方便地 Unix 平台上进行系统级别的编程。

16820

Rust学习笔记之基础概念

常量「不仅是默认不可变,它还总是不可变」 使用const关键字而不是let关键字来声明一个常量 声明同时,「必须显示地标注值类型」 常量可以被声明在任何作用域中,甚至包括全局作用。...❝Rust是一门「静态类型语言」,这意味着它在「编译程序」过程需要知道所有变量具体类型。 ❞ 大部分情况下,编译器都可以根据我们如何绑定、使用变量值来「自动推导」出变量类型。...("函数调用") } ❝Rust函数定义以fn关键字开始并紧随函数名称与一对圆括号,还有一对花括号用于标识函数体开始和结尾地方。❞ 可以使用函数名加圆括号方式来调用函数。...Rust不关心何处定义函数,只要这些定义对于「使用区域」是可见既可。 ---- 函数参数 还可以函数声明定义参数Argument,它们是一种「特殊变量,并被视作函数签名一部分」。...调用函数是表达式 调用宏是表达式 用创建新作用花括号({})同样也是表达式 fn main(){ let x =5; ①let y = {② let x =3; ③

67610

一网打尽 Rust 语法

变量类型 ❝ Rust ,默认情况下「变量是不可变」,这意味着一旦给变量赋值,其值就不会改变。 ❞ 所以如果想要一个可变,即可改变值,使用 mut。...元组 为了元组获得单个值,可以使用「模式匹配」来解构元组 还可以通过「索引」并使用点号(.)来访问元组值 let tup = (500, 6.4, 1); let (x, y, z) =...函数Rust代码使用「蛇形命名法」来作为规范函数变量名称风格。蛇形命名法「只使用小写字母进行命名,并以下画线分隔单词」。 ❞ 参数,它们是一种「特殊变量,并被视作函数签名一部分」。...当函数存在参数时,你需要在「调用函数时为这些变量提供具体值」 Rust,「函数返回值等同于函数最后一个表达式」。...Shadowing Rust,一个「新声明变量可以覆盖掉旧同名变量」,我们把这一个现象描述为:「第一个变量被第二个变量遮蔽Shadow了」。

10110

rust引用和借用

它不具备所有权,因此函数调用结束时候,s作用虽然结束了,但是不会调用drop。...("{}, {}", r1, r2); } 两个可变引用,可能会出现“同时写入”这种情况,导致内存不安全情形发生。如果在不同作用可以多个可变引用,但是它们不能同时被拥有。...s引用,函数结束,s移出作用调用drop函数清理内存,那么返回引用将会变成悬垂引用,从而引发错误。...Rust 编译器一直优化,早期时候,引用作用变量作用是一致,这对日常使用带来了很大困扰,你必须非常小心去安排可变、不可变变量借用,免得无法通过编译,例如以下代码: fn main(...但是编译器,该代码将顺利通过,因为 引用作用结束位置花括号变成最后一次使用位置,因此 r1 借用和 r2 借用在 println! 后,就结束了,此时 r3 可以顺利借用到可变引用。

47320

第5章 | 对值引用,使用引用,引用安全

为了传达基本思想,我们将从最简单案例开始,展示 Rust 如何确保单个函数体内正确使用引用。然后我们会看看如何函数之间传递引用并将它们存储到数据结构。...这是另一个约束:如果将引用存储变量 r ,则引用类型必须在变量 r 初始化到最后一次使用整个生命周期内都可以访问,如图 5-4 所示。...可变静态变量本质上不是线程安全(毕竟,任何线程都可以随时访问静态变量),即使单线程程序它们也可能成为一些另类可重入性问题牺牲品。由于这些原因,你只能在 unsafe 块访问可变静态变量。...它们大多数是 'static ,这意味着这些类型可以一直存续下去,例如,Vec 是自包含,在任何特定变量超出作用之前都不需要丢弃它。...笔记 JavaScript中有作用概念,生命周期和作用本质上是类似的,都是定义变量变量什么时候可以用,什么时候不可用 但是,如果函数是某个类型方法,并且具有引用类型 self 参数,那么

4610

听GPT 讲Rust源代码--librarystd(16)

notify_all(&self):通知所有正在等待线程,使它们等待状态恢复。 WaitTimeoutResult 是一个枚举类型,表示条件变量等待超时结果。...这些结构体和枚举Rustpanic处理机制起到了至关重要作用它们提供了处理panic时信息、收集panic数据以及设置钩子函数功能。...以上就是rust/library/std/src/env.rs文件定义主要结构体和枚举类型作用。这些类型提供了操作环境变量和命令行参数一些实用函数和功能,方便在Rust程序中进行相关操作。...而Scope使用了"scoped thread"概念,可以在当前作用域中创建线程,并在作用结束时等待线程完成,确保线程生命周期作用内。...总结来说,scoped.rs文件Scope结构体和相关结构体提供了一种线程作用机制,允许在当前作用域中创建线程,并确保线程作用结束时完成。

22030

Rust学习笔记之泛型、trait 与生命周期

Rust 生命周期功能允许很多场景下借用值同时仍然使编译器能够检查这些引用有效性。...("r: {}", r); } 「外部作用」声明了一个没有初值变量 r,而「内部作用」声明了一个初值为 5 变量 x。在内部作用域中,我们尝试将 r 值设置为一个 x 引用。...接着在内部作用结束后,尝试打印出 r 值。这段代码不能编译因为 r 引用尝试使用之前就离开了作用变量 x 并没有 “存在足够久”。其原因是 x 在到达内部作用结束时就离开了作用。...这是因为 Rust 能够分析函数中代码而不需要任何协助,不过当函数引用或被函数之外代码引用时,让 Rust 自身分析出参数或返回生命周期几乎是不可能。这些生命周期每次函数调用时都可能不同。...出现问题是 result longest 函数结尾将离开作用并被清理,而我们尝试函数返回一个 result 引用。

1.5K20

听GPT 讲Rust源代码--compiler(13)

这些结构体和枚举Rust代码美化和格式化扮演重要角色,通过它们协调和使用,可以将原始并可能杂乱代码转换为更易读和统一代码形式。...作用链是一个表示作用嵌套关系数据结构,用于确定变量可见性和访问权限。 变量引用生命周期分析:分析Rust程序引用变量生命周期,即变量活跃范围。...通过这个分析,可以检查程序是否存在悬垂指针(dangling pointer)或引用非法内存情况。 变量作用判断:确定每个变量作用范围,即变量程序生存周期。...check.rs文件包含了多个实现类型检查函数。其中一些函数用于检查函数体内表达式、语句和模式,确保它们类型上是正确。...ReturnStmtOutsideOfFnBody: 表示函数体外出现了返回语句。 RustCallIncorrectArgs: 表示Rust函数调用参数错误。

7610

Rust 易学教程】第 1 天:Rust 基础,基本语法

今天,我们正式进入 Rust 基础学习。本文内容,我会为大家介绍以下内容: 基本 Rust 语法: 变量、标量和复合类型、枚举、结构、引用、函数和方法。...卫生宏和普通宏区别有点类似词法作用函数和动态作用函数区别。...Rust 需要可变数量参数(不允许函数重载)情况下使用宏。 宏是“卫生”,意味着它们不会意外地它们所使用范围捕获标识符。Rust 宏实际上只是部分卫生Rust 是多范式。...—— Safe Rust 使所有这些 bug 都不可能出现,例如以下: 不支持if子句中赋值。 格式字符串在编译时进行检查。 资源通过 Drop 特性作用结束时被释放。...当相应 Box 离开作用时,通过 Drop 特性释放堆分配内存。 越界访问会导致 panic,或者可以通过切片 get 方法进行检查。 match 会要求所有 case 都要得到处理。

26320

rustpackage,crate,module

假设我们希望调用 add_to_waitlist 函数,该如何做?...use 路径 如果需要使用某个模块函数,那么惯例是使用 use 将函数父模块引入作用,我们必须在调用函数时指定父模块,这样可以清晰地表明函数是不是本地定义,同时使完整路径重复度最小化。...,这个名称在此作用域中就可以使用了,但它对此作用之外还是私有的。...Glob 会使得我们难以推导作用域中有什么名称和它们何处定义。 glob 运算符经常用于测试模块 tests ,这时会将所有内容引入作用。...eat_at_restaurant 函数调用也无需修改继续保持有效,即便其定义存在于不同文件。这个技巧让你可以模块代码增长时,将它们移动到新文件

54350

第3章 | 基本数据类型 | 布尔类型,字符,元组,指针类型

给定一个元组值 t,可以通过 t.0、t.1 等访问其元素。 元组有点儿类似于数组,即这两种类型都表示值有序序列。许多编程语言混用或结合了这两个概念,但在 Rust 它们是截然不同。...Rust 代码通常会用元组类型从一个函数返回多个值。...它们非常像 C 和 C++ & 运算符和 * 运算符,并且和 C 指针一样,当超出作用时引用不会自动释放任何资源。...你可以同时拥有多个对给定值共享引用,但它们是只读:禁止修改它们所指向值,就像 C const T* 一样。 &mut T 一个可变、独占引用。...对 Box::new 调用会分配足够内存以堆上容纳此元组。当 b 超出作用时,内存会立即被释放,除非 b 已被移动(move),比如返回它。

7310
领券