< 返回版块

Young-Flash 发表于 2023-01-28 11:56

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

评论区

写评论
作者 Young-Flash 2023-01-28 14:30

明白了,谢谢大佬!

--
👇
MrZLeo: 报错的原因很显然是你对self同时存在可变引用和不可变引用,违反了Rust的所有权规则。

这跟match无关,match没有对self产生引用,而你的conn在match中使用导致conn的生命周期至少维持到match结束,在conn的生命周期内(即self的一个可变引用),你调用了需要self不可变引用的方法,从而产生了另一个不可变引用,这两者的生命周期交叉,所以违反了所有权规则。

MrZLeo 2023-01-28 12:09

报错的原因很显然是你对self同时存在可变引用和不可变引用,违反了Rust的所有权规则。

这跟match无关,match没有对self产生引用,而你的conn在match中使用导致conn的生命周期至少维持到match结束,在conn的生命周期内(即self的一个可变引用),你调用了需要self不可变引用的方法,从而产生了另一个不可变引用,这两者的生命周期交叉,所以违反了所有权规则。

1 共 3 条评论, 1 页