如果我的模块是公共的,为什么一些clippy lint消失了?



我有一个看起来像这样的代码:

// 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值。

最新更新