P.NAM.05 用于访问或获取数据的 getter
类方法通常不要使用 get_
前缀
【描述】
因为 Rust 所有权语义的存在,此例子中两个方法的参数分别是共享引用 &self
和 独占引用 &mut self
,分别代表了 getter 的语义。
也存在一些例外情况可以用 get_
前缀。
【反例】
#![allow(unused)] fn main() { pub struct First; pub struct Second; pub struct S { first: First, second: Second, } impl S { // 不符合:访问成员函数名字不用get_前缀。 pub fn get_first(&self) -> &First { &self.first } // 不符合: // 同样不建议 `get_mut_first`, or `mut_first`. pub fn get_first_mut(&mut self) -> &mut First { &mut self.first } // set_前缀是可以的 pub fn set_first(&mut self, f: First) -> &mut First { self.first = f; } } }
【正例】
#![allow(unused)] fn main() { pub struct First; pub struct Second; pub struct S { first: First, second: Second, } impl S { // 符合 pub fn first(&self) -> &First { &self.first } // 符合 pub fn first_mut(&mut self) -> &mut First { &mut self.first } // set_前缀是可以的 pub fn set_first(&mut self, f: First) { self.first = f; } } }
【例外】
但也存在例外情况:只有当需要显式的语义来通过getter
获取某种数据,才会使用get
命名。例如,Cell::get
可以访问一个Cell
的内容。
对于进行运行时验证的getter,例如边界检查,可以考虑添加一个 Unsafe 的_unchecked
配套方法。一般来说,会有以下签名。
#![allow(unused)] fn main() { // 进行一些运行时验证,例如边界检查 fn get(&self, index: K) -> Option<&V>; fn get_mut(&mut self, index: K) -> Option<&mut V>; // 没有运行时验证,用于在某些情况下提升性能。比如,在当前运行环境中不可能发生越界的情况。 unsafe fn get_unchecked(&self, index: K) -> &V; unsafe fn get_unchecked_mut(&mut self, index: K) -> &mut V; }
getter 和类型转换 (G.NAM.02) 之间的区别很小,大部分时候不那么清晰可辨。比如 TempDir::path
可以被理解为临时目录的文件系统路径的 getter ,而 TempDir::into_path
负责把删除临时目录时转换的数据传给调用者。
因为 path
方法是一个 getter ,如果用 get_path
或者 as_path
会造成信息冗余。
来自标准库的例子: