作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
<分区>
我正在处理一个大文件,但这是一个导致同样问题的小玩具示例。抱歉,如果示例本身没有意义。
#![feature(nll)]
struct S(i32);
impl S {
fn foo(&mut self) -> Option<&i32> {
if let Some(val) = self.bar() {
return Some(val);
}
let y = &mut self.0;
None
}
fn bar(&mut self) -> Option<&i32> {
None
}
}
fn main() {
S(0).foo();
}
这没有通过借用检查器:
error[E0499]: cannot borrow `self.0` as mutable more than once at a time
--> test.rs:9:17
|
6 | if let Some(val) = self.bar() {
| ---- first mutable borrow occurs here
...
9 | let y = &mut self.0;
| ^^^^^^^^^^^ second mutable borrow occurs here
|
note: first borrowed value must be valid for the anonymous lifetime #1 defined on the method body at 5:5...
--> test.rs:5:5
|
5 | / fn foo(&mut self) -> Option<&i32> {
6 | | if let Some(val) = self.bar() {
7 | | return Some(val);
8 | | }
9 | | let y = &mut self.0;
10| | None
11| | }
| |_____^
这不应该是有效的(即使没有 #![feature(nll)]
)因为它在 if let
block 中返回吗?值得注意的是,如果我将 if let
block 更改为以下内容,它可以正常编译
if self.bar().is_some() {
return self.bar();
}
下面的代码涉及一个非常微妙的借用检查器躲避。代码本身描述了推理。问题: 这真的安全吗? 这是表示执行的不安全操作的推荐方式吗?我应该改用指针吗? 新的 Polonius 借用检查器能推理出这样的模式吗
假设我有如下示例中的几个结构,并且在 next() 方法中我需要使用用户提供的缓冲区提取下一个事件,但是如果此事件是注释,并忽略评论标志设置为真,我需要再次拉下一个事件: struct Parser
假设我有如下示例中的几个结构,并且在 next() 方法中我需要使用用户提供的缓冲区提取下一个事件,但是如果此事件是注释,并忽略评论标志设置为真,我需要再次拉下一个事件: struct Parser
假设我有如下示例中的几个结构,并且在 next() 方法中我需要使用用户提供的缓冲区提取下一个事件,但是如果此事件是注释,并忽略评论标志设置为真,我需要再次拉下一个事件: struct Parser
假设我有如下示例中的几个结构,并且在 next() 方法中我需要使用用户提供的缓冲区提取下一个事件,但是如果此事件是注释,并忽略评论标志设置为真,我需要再次拉下一个事件: struct Parser
我是一名优秀的程序员,十分优秀!