- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了一些 Rust 代码的问题,在某些情况下我被允许多次借用可变的东西(第一个令人困惑的部分),但其他情况下则不行。
我写了下面的例子来说明:( Playground )
struct NoLifetime {}
struct WithLifetime <'a> {
pub field: &'a i32
}
fn main() {
let mut some_val = NoLifetime {};
borrow_mut_function(&mut some_val);
borrow_mut_function(&mut some_val); // Borrowing as mutable for the second time.
let num = 5;
let mut life_val = WithLifetime { field: &num };
borrow_lifetime(&mut life_val);
borrow_lifetime(&mut life_val); // Borrowing as mutable for the second time.
let num_again = borrow_lifetime(&mut life_val); // Borrow, assign lifetime result
borrow_lifetime(&mut life_val); // Compiler: cannot borrow `life_val` as mutable more than once
}
fn borrow_mut_function(val_in: &mut NoLifetime) -> String {
"abc".to_string()
}
fn borrow_lifetime<'a>(val_in: &'a mut WithLifetime) -> &'a i32 {
val_in.field
}
如果你看到了,我可以多次借用 some_val
和 life_val
作为可变的。但是,给borrow_lifetime
的返回值赋值后,我就不能再借了。
我的问题如下:
borrow_
函数时,我都将借用为可变的。如有任何帮助,我们将不胜感激。我想这里发生的事情是我误解了“借用为可变”的真正含义,以及何时确定某些东西被借用为可变。
最佳答案
Chris already gave the gist of it ,但我认为值得进一步解释。
在 Rust 中有2转移所有权的方法:
与许多其他语言一样,Rust 使用一堆词法作用域 对时间流逝进行建模。因此,目前,借用从创建它的地方开始,一直延伸到其作用域的末尾。
因此,借用何时结束的问题类似于询问借用是在什么范围内创建的。
让我们用带编号的行回顾一下您的示例:
fn main() {
let mut some_val = NoLifetime {}; // 1
borrow_mut_function(&mut some_val); // 2
borrow_mut_function(&mut some_val); // 3
//
let num = 5; // 4
let mut life_val = WithLifetime { field: &num }; // 5
borrow_lifetime(&mut life_val); // 6
borrow_lifetime(&mut life_val); // 7
//
let num_again = borrow_lifetime(&mut life_val); // 8
borrow_lifetime(&mut life_val); // 9
}
调用函数时,借用参数:
那么,让我们看看这个:
在第 (2) 和 (3) 行调用 borrow_mut_function
返回一个 String
:结果不与参数共享任何生命周期,因此参数仅在函数调用的生命周期内借用。
在第 (6) 和 (7) 行调用 borrow_lifetime
返回 &'a i32
:结果与参数共享生命周期,因此参数被借用到结果范围的末尾...这是因为结果未被使用而立即结束。
在第 (8) 行调用 borrow_lifetime
,它返回一个 &'a i32
并将结果分配给 num_again
:结果与参数共享一个生命周期,因此参数被借用到 num_again
范围结束。
在第 (9) 行你调用了 borrow_lifetime
但是它的参数仍然被 num_again
借用所以这个调用是非法的。
就是这样,这就是 Rust 今天的工作方式。
以后有电话non-lexical borrows .也就是说,编译器会意识到:
num_again
从未使用过num_again
没有特定的析构函数(没有Drop
实现)因此可以决定它的借用结束早于词法范围的结束。
关于Rust 借用检查器仅在返回具有相同生命周期的引用的函数时多次提示借用是可变的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38006421/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!