Why in test2 there are compilation error and in test1 not? both read_to_end and S::f has &mut self. Both functions (test1,test2) have mut variable and immutable reference. I'm confused.
It's possible to call
read_to_end on a
&TcpStream implements the
Read trait that provides
read_to_end. Basically, reading from a
TcpStream doesn't require mutable access. On the other hand, calling the
f function on
S requires having a mutable reference because it's declared with a
&mut self argument.
mut s: &S doesn't do what you think it does. If you want to accept a mutable reference, you should write
s: &mut S. That would mean that
s will have
&mut S value.
mut s: &S means that
&S value (an immutable, shared reference), and
mut in that position allows you to reassign another reference to the
s local variable. That's usually not desirable.
Srequires having a mutable reference because it's declared with a
But read_to_end has &mut self too in signature. It must take s by mutable reference but s is behind immutable reference.
That would be correct for trait implementation on
TcpStream (which also exists). But in your code the implementation of
&TcpStream takes effect. In that implementation,
&mut self in the function signature expands to
&mut &TcpStream. Having a
&TcpStream, you can make a
&mut &TcpStream from it. Note that you won't be able to get a
&mut TcpStream out of
Now i understand. Thanks.