Why is it possible to implement Read on an immutable reference to File?

拜拜、爱过 提交于 2019-11-27 16:06:36

As @kennytm pointed out, a.read_to_end(vec) is equivalent to Read::read_to_end(&mut a, vec), so (&file).read_to_end(vec) expands to Read::read_to_end(&mut &file, vec). In the latter expression, &file is a new temporary value of type &File. There is no problem with taking mutable references to an expression (e.g. &mut 42). This is exactly what happens here. The fact that the expression is a reference to an immutable value doesn't matter because we cannot actually mutate the value through a &mut &T.

Regarding the question why we don't need the File to be mutable: File is basically just a newtyped file descriptor, i.e. an index into an open-file table that is managed by the OS. read and friends will not change this descriptor at all, which is why the File does not need to be mutated. There is of course mutation going on, but that is done by the operating system on its own data structures and not in your user-land rust code.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!