- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在和借阅检查员打架。我有两段相似的代码,一段按我的预期工作,另一段不正常。
如我所料的:
mod case1 {
struct Foo {}
struct Bar1 {
x: Foo,
}
impl Bar1 {
fn f<'a>(&'a mut self) -> &'a Foo {
&self.x
}
}
// only for example
fn f1() {
let mut bar = Bar1 { x: Foo {} };
let y = bar.f(); // (1) 'bar' is borrowed by 'y'
let z = bar.f(); // error (as expected) : cannot borrow `bar` as mutable more
// than once at a time [E0499]
}
fn f2() {
let mut bar = Bar1 { x: Foo {} };
bar.f(); // (2) 'bar' is not borrowed after the call
let z = bar.f(); // ok (as expected)
}
}
没有的:
mod case2 {
struct Foo {}
struct Bar2<'b> {
x: &'b Foo,
}
impl<'b> Bar2<'b> {
fn f(&'b mut self) -> &'b Foo {
self.x
}
}
fn f4() {
let foo = Foo {};
let mut bar2 = Bar2 { x: &foo };
bar2.f(); // (3) 'bar2' is borrowed as mutable, but who borrowed it?
let z = bar2.f(); // error: cannot borrow `bar2` as mutable more than once at a time [E0499]
}
}
我希望我可以调用 Bar2::f
两次而不会激怒编译器,就像情况 1 一样。
问题在评论(3)中:谁借用了bar2
,而没有做作?
这是我的理解:
在情况 1 中,f2
调用:生命周期参数 'a
是接收的 &Foo
值之一,所以这没有做作时lifetime为空,Bar1::f
调用后bar
不被借用;
在情况2中,bar2
借用了foo
(作为不可变的),所以Bar2中的生命周期参数
结构是 'b
foo
引用生命周期,它在 f4
体的末尾结束。调用 Bar2::f
在该生命周期内借用 bar2
,即到 f4
的末尾。
但问题依旧:bar2
是谁借的?可以是 Bar2::f
吗? Bar2::f
在调用后如何持有借用的所有权?我在这里缺少什么?
我在 x86_64-pc-windows-msvc 上使用 Rust 1.14.0-nightly (86affcdf6 2016-09-28)。
最佳答案
啊……你基本上是自己借的。
问题取决于这样一个事实,即您有相同的生命周期 ( 'b
) 用于 Foo
的生命周期。和 Bar
的生命周期.然后,编译器尽职尽责地统一了这些生命周期,你最终会遇到一种奇怪的情况,即本应在语句末尾结束的借用生命周期突然在值应该超出范围之后结束。
根据经验:始终为 self
使用新的生命周期.其他任何事情都很奇怪。
有趣的是,这个模式实际上很有用(尽管更可能是不可变借用):它允许锚定一个值到栈帧,防止调用函数后的任何移动,这(有时)可用于表示 Rust 未很好建模的借用(例如将指向值的指针传递给 FFI)。
关于rust - 谁借用了一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39827244/
我正在使用 tcod-rs。用于绘制到 RootConsole 的每个方法都采用一个可变引用。中央循环是一个 while 循环,它等待窗口关闭、清除屏幕、绘制,然后刷新。 “检查窗口关闭”方法也采用可
This question already has answers here: How to return a reference to a sub-value of a value that is
我是新手,我已经阅读了有关所有权和借用的文档。显然,我开始为这个概念而苦苦挣扎... 这是我的代码: #[derive(Serialize, Deserialize, Debug)] pub stru
我在借阅检查器上遇到了问题。我有一个特征(Physics),它具有getters(例如velocity)和setters(例如velocity_mut)。它还具有使用getter和setter的默认方
我正在用 Rust 编写 Rogue-like。我有一个 Player,它有一个 Vec 的盒装 TimedEffects。定时效果有一个 activate(&mut Player) 和 deacti
我觉得 rc::Weak可以使用(某种)AsRef特征实现。我试图从弱指针借用一些共享内容,但这不会编译: use std::rc::Weak; struct Thing(Weak); impl Th
我正在学习Rust。对于我的第一个程序,我编写了以下代码来维护有关部分排序的数据: use std::collections::{HashMap, HashSet}; struct Node {
这个问题在这里已经有了答案: Cannot borrow as immutable because it is also borrowed as mutable in function argume
在尝试实现一个迭代器以产生对链表元素的可变引用时,我偶然发现了一个奇怪的问题。 这很好用: impl Iterator for LinkedListIterator{ fn next(&mut
我有this minimal example code : use std::borrow::BorrowMut; trait Foo {} struct Bar; impl Foo for Bar
struct State { x: i32 } trait A { fn a(&mut self, b: &i32); } impl A for State { fn a(&m
我有一个 Element 结构,它实现了一个更新方法,该方法需要一个滴答持续时间。该结构包含一个组件向量。允许这些组件在更新时修改元素。我在这里遇到借用错误,我不确定该怎么做。我尝试用 block 修
我正在尝试做这样的事情 use std::cell::{RefCell,Ref,RefMut}; use std::rc::Rc; struct Entity; struct Tile { e
我已连接到 Deribit websocket 以获取选项数据,但以下代码片段仅获得一个有效的数据响应,然后停止更新,但表示它仍在运行。 该网站建议使用 asyncio 模块,但能够使用以下代码片段提
我是一名优秀的程序员,十分优秀!