pub fn accept(&mut self, poll: &mut Poll, sock: Stream) -> Result<()> {
// ...
let conn = &mut self.connections[tok.into()];
self.dispatch_by_type(conn.socket(), tok, poll); // 编译错误 cannot borrow `*self` as immutable because it is also borrowed as mutable
let result = match conn.socket() { // 为什么这里不会报同样的错误
Stream::Tcp(tcp) => {
// ...
},
Stream::Unix(unix) => {
// ...
},
};
// ...
}
error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable
--> src/io.rs:545:9
|
535 | let conn = &mut self.connections[tok.into()];
| ---------------- mutable borrow occurs here
...
545 | self.dispatch_by_type(conn.socket(), tok, poll);
| ^^^^^^^^^^^^^^^^^^^^^^-------------^^^^^^^^^^^^
| | |
| | mutable borrow later used here
| immutable borrow occurs here
dispatch_by_type 定义:fn dispatch_by_type(&self, stream: &Stream, tok: Token, poll: &Poll) -> std::io::Result<()>
socket 方法定义:pub fn socket(&self) -> &Stream
1
共 3 条评论, 1 页
评论区
写评论明白了,谢谢大佬!
--
👇
MrZLeo: 报错的原因很显然是你对self同时存在可变引用和不可变引用,违反了Rust的所有权规则。
这跟match无关,match没有对self产生引用,而你的conn在match中使用导致conn的生命周期至少维持到match结束,在conn的生命周期内(即self的一个可变引用),你调用了需要self不可变引用的方法,从而产生了另一个不可变引用,这两者的生命周期交叉,所以违反了所有权规则。
Same question on URLO: https://users.rust-lang.org/t/why-does-the-same-expression-as-a-function-argument-cant-compiled-but-get-compiled-in-the-match-structure/88300
报错的原因很显然是你对self同时存在可变引用和不可变引用,违反了Rust的所有权规则。
这跟match无关,match没有对self产生引用,而你的conn在match中使用导致conn的生命周期至少维持到match结束,在conn的生命周期内(即self的一个可变引用),你调用了需要self不可变引用的方法,从而产生了另一个不可变引用,这两者的生命周期交叉,所以违反了所有权规则。