实际上有三种不同的作用域.块的作用域、变量的作用域和引用的引用的作用域.
一个块(花括号,{ ... }
)创建一个作用域.这个作用域意味着在块内(直接)声明的变量将一直存在到其结束.函数也以同样的方式创建作用域.
变量的作用域基本上是它的活性--它在哪里是活的.它通常从它的声明开始,直到声明它的块(或函数)的末尾.然而,变量可以被移动或删除,然后它的生命周期将在块之前或之后结束.它的范围是在那里结束还是在街区的尽头(value岁的S的活跃度更长/更短)还有待辩论.
所以当书上说:
作用域是程序中项有效的范围.
这里的"作用域"指的是变量的作用域.
当它说:
该变量从声明之时起有效,直到当前作用域结束为止.
这里所说的天平,是指S的百度天文.
第三个范围是引用的范围,本书在PG中提到了这个范围.75.通常,引用的作用域与它引用的项的作用域相同,但由于为Non-Lexical Lifetimes,它可能在引用的最后一次使用之后更早结束.由于Rust的borrow 规则(共享XOR变量),当可以使用对同一项的其他引用时,这种影响.
关于您的问题:
对于函数中定义的变量和传递给该函数的参数,"作用域"的定义是否不同?
两者都在函数的作用域中(如果变量没有在内部块中声明).但是,函数中定义的变量在参数之前被删除,因此我们可以认为它们的作用域更早结束.
引用的作用域处理与其他变量的作用域处理是否不同?
不完全是,但它们在最后一次使用后被认为不再活着,而不是当它们的块结束时.这并不是引用所特有的,但是,对于任何没有滴胶的变量来说,这都是正确的.
当一个函数参数或一个函数中声明的变量在函数结束前超出作用域时,变量的存储是否会在那时释放?在函数返回给调用者之前?
这取决于您如何定义"内存释放".
Rust所做的唯一保证是从函数返回后,堆栈指针将与进入它之前相同.通常,只有在函数返回时才会减少,一次完成而不是多次执行,从而节省CPU时间.
拉斯特做出的另一个保证是,Drop
是确定性的.变量的Drop
在其块作用域的末尾被调用,除非它是从.因此,resources owned by the variable个(例如堆分配)在那里被释放.
变量的堆栈内存是否被释放取决于您如何定义它.有时,如果变量的生存期不重叠,编译器可以重复使用变量的堆栈内存.有时它不会,但在变量的作用域结束后不会使用它.