我有一个看起来像这样的代码:
// src/bitboard.rs
#[derive(Copy, Clone, Debug)]
pub struct Bitboard {
value: u64
}
impl Bitboard {
pub const fn new(value: u64) -> Self {
Self { value }
}
pub const fn get_bit(&self, k: u64) -> u64 {
((1u64 << k) & self.value) >> k
}
}
// src/main.rs
pub mod bitboard;
use crate::bitboard::Bitboard;
fn main() {
let bitboard = Bitboard::new(0);
dbg!(bitboard);
}
如果我完全像这样编译它,它可以工作,没有任何错误或警告。
然而,如果我将pub mod bitboard
更改为mod bitboard
,那么clippy开始给我这个警告:
warning: this argument (8 byte) is passed by reference, but would be more efficient if passed by value (limit: 8 byte)
pub const fn get_bit(&self, k: u64) -> u64 {
^^^^^ help: consider passing by value instead: `self`
= note: `-W clippy::trivially-copy-pass-by-ref` implied by `-W clippy::pedantic`
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#trivially_copy_pass_by_ref
我明白clippy让我做什么。但我不明白为什么它不建议这当我的模块被声明为公共。什么好主意吗?
注::我用的是rustc 1.60.0, clippy 0.1.60。
编辑:我还应该补充说,这不是我从模块中移除pub
时发生的唯一额外的lint。例如,我也有一个新的clippy::upper_case_acronym,和一个新的clippy::enum_variant_names。
编辑2:根据要求,我包括更多的例子来显示clippy::upper- case_首字母缩略词和clippy::enum_variant_names:
发生的相同行为// src/fen.rs
pub struct FEN; // upper case acronyms happens here
pub enum FENValidationError { // enum variant names happens here
InvalidFieldsCount,
InvalidPiecePlacement,
InvalidRankSize,
}
// src/main.rs
mod fen; // same thing here. If this becomes `pub mod fen`, the two lint warnings above disappear.
因为这样改变一个公共API是一个破坏性的改变。
如果它是一个内部方法,那么像clippy建议的那样将参数更改为按值传递是很容易的,因为您可以控制使用它的所有代码。但是如果参数是作为公共API的一部分公开的函数或方法上的,更改它将要求使用它的所有其他项目也更改,这通常是不可接受的,因为通过引用传递一个小的Copy
值。