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 会造成信息冗余。

来自标准库的例子: