Rust has a bunch of different naming patterns for the opposite of mut
:
Where? | Mutable | Not-Mutable |
---|---|---|
Borrowing syntax | &mut |
& |
Pattern syntax | ref mut |
ref |
Collections | get_mut() |
get() |
std::io wrappers |
get_mut() |
get_ref() |
AsRef , ptr dereference |
as_mut() |
as_ref() |
Slice to a pointer | as_mut_ptr() |
as_ptr() |
Deref , Index , Borrow |
deref_mut() |
deref() |
Array from a reference | from_mut() |
from_ref() |
Slice from a pointer | from_raw_parts_mut() |
from_raw_parts() |
MaybeUninit | assume_init_mut() |
assume_init_ref() |
Raw pointer syntax | *mut |
*const |
Raw reference syntax | &raw mut |
&raw const |
Raw pointer cast | cast_mut() |
cast_const() |
Pin API |
map_unchecked_mut() |
map_unchecked() |
Also Pin API |
get_mut() |
get_ref() |
Proposed pin reference syntax | &pin mut |
&pin const |
mut
vs nothing naming scheme seems to be preferred, except cases where it causes ambiguity due to limitations of the syntax or where the no-suffix names are used for by-value/owned types.
Generally it's mut
vs ref
for references, and mut
vs const
for raw pointers.
Use of const
for pointer types is understandable given their connection with C, but the const
keyword is also used for const fn
, which is an increasingly large part of Rust. It has grown beyond simple constants, and can use mutable types now. The standard library doesn't have const_*
methods yet, but methods like const_new
are already used in the Rust ecosystem for const fn
, not *const
.
This makes the experimental &pin const
an odd one out, because these references are not raw pointers, and are not related to const
-eval, but use the mut
/const
naming scheme. I assume that &pin T
, like &raw T
was not an option due to syntax backwards compatibility, but it seems to me that the not-mut
Pin
references should be &pin ref
.