P.NAM.05 The getter
family of methods used to access or retrieve data should not normally have the prefix get_
[Description]
Because of Rust's ownership semantics, both methods' parameters in following cases use shared reference &self
or exclusive reference &mut self
, which represent getter
semantics.
getter
semantics always mean to return an object but a reference in Rust's ownership conventions.
There are also some exceptions to use get_
prefix.
[Bad Case]
#![allow(unused)] fn main() { pub struct First; pub struct Second; pub struct S { first: First, second: Second, } impl S { // Bad: Shouldn't use 'get_' prefix to name accesssing member function. pub fn get_first(&self) -> &First { &self.first } // Bad: // `get_mut_first`, or `mut_first` are also not good. pub fn get_first_mut(&mut self) -> &mut First { &mut self.first } // set_ prefix is fine. pub fn set_first(&mut self, f: First) -> &mut First { self.first = f; } } }
[Good Case]
#![allow(unused)] fn main() { pub struct First; pub struct Second; pub struct S { first: First, second: Second, } impl S { // Ok pub fn first(&self) -> &First { &self.first } // Ok pub fn first_mut(&mut self) -> &mut First { &mut self.first } // set_ prefix is fine. pub fn set_first(&mut self, f: First) -> &mut First { self.first = f; } } }
[Exception]
However, there are also some exceptions: Only in cases to retrieve data by getter
explicitly, could name with get_
prefix. For example, Cell::get
could access the data in one Cell
.
For getter
checked in runtime, such as bounds checking, we could consider to add an Unsafe _unchecked
methods. Generally, there would be following function signatures.
#![allow(unused)] fn main() { // Do some checks in runtime, such as bounds checking. fn get(&self, index: K) -> Option<&V>; fn get_mut(&mut self, index: K) -> Option<&mut V>; // No runtime checking, use to improve performance in some case. // For example, when executed in an execution environment,which is impossible to trigger bounds checking. unsafe fn get_unchecked(&self, index: K) -> &V; unsafe fn get_unchecked_mut(&mut self, index: K) -> &mut V; }
There is almost no such distinction between getter
and type conversion (G.NAM.02). For instance, TemDir::path
could be regarded as a getter
, which represents the filesystem's path of temporary directory, and TemDir::into_path
is in charge of sending converted data when deleting temporary directory
to callee.
There would not result for redundancy with naming the method as path
, because path
itself is a getter
, otherwise if you name it as get_path
or as_path
.
Implementations in StandardLibrary
: