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
Side note: it'd be better if you copied the code in question, not made a screenshot, so that we can check it ourselves.
The problem is not with conn.socket itself. Error message shows you three parts:
Place where conn is created. There, it's shown that you take an exclusive borrow of self's field and store it in conn, so conn is - indirectly - an exclusive borrow of self.
Place where self is borrowed again - in self.dispatch_by_type.
Place where the first borrow of self (stored in conn) is used.
The past part happens after the second borrow of self (because method arguments are evaluated after the receiver), so conn (and therefore &mut self) is forced to be alive at the point when &self is created. Exclusive reference coexisting with any other one is an error.
In the match, however, you doesn't touch self at all - you only use conn, and that's obviously valid.
Based on the signatures you noted, you can probably do...
let idx = tok.into();
let conn = &mut self.connections[idx];
// Do whatever you need `conn` to be a `&mut` for here, then...
// ...borrow anew as a `&`
let conn = &self.connections[idx];
self.dispatch_by_type(conn.socket(), tok, poll);