我很难理解拉斯特对"范围"的定义.或者,它可能与《无淀粉出版社》一书中对"范围"的定义相同(我实际上是买了这本书).

在得分最高的位置.62:

作用域是程序for which an item is valid内的范围.

在下一段中:

从它被声明的点到 当前作用域的结尾.

在我看来,"范围"的定义是递归的.

现在翻开"参考资料和借阅"一节第72页:

变量(参数)"S"的有效作用域与任何函数参数的作用域相同.

因此,参数的范围就是参数的范围.这对我没什么帮助.

现在转到关于PG的第二段.75:

...引用的作用域从它被引入的地方开始,一直延续到上次使用该引用的时候.

啊哈 所以一个变量可以在它的"上下文"(函数)结束之前退出作用域.

Q1:在函数中定义的变量的"作用域"定义与传递给该函数的参数是否不同?

Q2:引用的作用域处理与其他变量的作用域处理是否不同?

Q3:当一个函数参数或一个函数中声明的变量在函数结束前超出作用域时,变量的存储是否会在那时释放? 在函数返回给调用者之前?

推荐答案

实际上有三种不同的作用域.块的作用域、变量的作用域和引用的引用的作用域.

一个块(花括号,{ ... })创建一个作用域.这个作用域意味着在块内(直接)声明的变量将一直存在到其结束.函数也以同样的方式创建作用域.

变量的作用域基本上是它的活性--它在哪里是活的.它通常从它的声明开始,直到声明它的块(或函数)的末尾.然而,变量可以被移动或删除,然后它的生命周期将在块之前或之后结束.它的范围是在那里结束还是在街区的尽头(value岁的S的活跃度更长/更短)还有待辩论.

所以当书上说:

作用域是程序中项有效的范围.

这里的"作用域"指的是变量的作用域.

当它说:

该变量从声明之时起有效,直到当前作用域结束为止.

这里所说的天平,是指S的百度天文.

第三个范围是引用的范围,本书在PG中提到了这个范围.75.通常,引用的作用域与它引用的项的作用域相同,但由于为Non-Lexical Lifetimes,它可能在引用的最后一次使用之后更早结束.由于Rust的borrow 规则(共享XOR变量),当可以使用对同一项的其他引用时,这种影响.

关于您的问题:

对于函数中定义的变量和传递给该函数的参数,"作用域"的定义是否不同?

两者都在函数的作用域中(如果变量没有在内部块中声明).但是,函数中定义的变量在参数之前被删除,因此我们可以认为它们的作用域更早结束.

引用的作用域处理与其他变量的作用域处理是否不同?

不完全是,但它们在最后一次使用后被认为不再活着,而不是当它们的块结束时.这并不是引用所特有的,但是,对于任何没有滴胶的变量来说,这都是正确的.

当一个函数参数或一个函数中声明的变量在函数结束前超出作用域时,变量的存储是否会在那时释放?在函数返回给调用者之前?

这取决于您如何定义"内存释放".

Rust所做的唯一保证是从函数返回后,堆栈指针将与进入它之前相同.通常,只有在函数返回时才会减少,一次完成而不是多次执行,从而节省CPU时间.

拉斯特做出的另一个保证是,Drop是确定性的.变量的Drop在其块作用域的末尾被调用,除非它是从.因此,resources owned by the variable个(例如堆分配)在那里被释放.

变量的堆栈内存是否被释放取决于您如何定义它.有时,如果变量的生存期不重叠,编译器可以重复使用变量的堆栈内存.有时它不会,但在变量的作用域结束后不会使用它.

Rust相关问答推荐

为什么幻影数据不能自动推断?

borrow 和内部IntoIterator

如何将元素添加到向量并返回对该元素的引用?

在Rust中有没有办法在没有UB的情况下在指针和U64之间进行转换?

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

使用铁 rust S还原对多个数组执行顺序kronecker积

用于判断整数块是否连续的SIMD算法.

try 创建随机数以常量

Rust中WPARAM和VIRTUAL_KEY的比较

Rust将String上的迭代器转换为&;[&;str]

从管道读取后重置标准输入

Rust Axum 框架 - 解包安全吗?

Nom 解析器无法消耗无效输入

为什么我们有两种方法来包含 serde_derive?

我可以在 Rust 中 serde struct camel_case 和 deserde PascalCase

在运行时在 Rust 中加载字体

将原始可变指针传递给 C FFI 后出现意外值

如何在 nom 中构建负前瞻解析器?

当值是新类型包装器时,对键的奇怪 HashMap 生命周期要求

为什么这里需要类型注解?