如果我的模块是 public,为什么一些 clippy lints 消失了?
Why are some clippy lints gone if my modules are public?
我的代码大致如下所示:
// 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 要我做什么。但是我不明白为什么当我的模块声明为public时它不提示这个。有什么想法吗?
P.S.: 我正在使用 rustc 1.60.0, clippy 0.1.60.
编辑:我还应该补充一点,这不是我从模块中删除 pub
时发生的唯一额外 lint。例如,我还有 1 个新 clippy::upper_case_acronyms 和 1 个新 clippy::enum_variant_names.
编辑 2:根据要求,我提供了更多示例来展示发生在 clippy::upper-case_acronyms 和 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.
因为像这样更改 public API 是一个重大更改。
如果它是一个内部方法,将参数更改为像 clippy 推荐的那样按值传递很容易,因为您可以控制使用它的所有代码。但是,如果参数是作为 public API 的一部分公开的函数或方法,更改它需要所有其他使用它的项目也进行更改,这对于像这样的小事情来说通常是不可接受的通过引用传递一个小的 Copy
值。
我的代码大致如下所示:
// 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 要我做什么。但是我不明白为什么当我的模块声明为public时它不提示这个。有什么想法吗?
P.S.: 我正在使用 rustc 1.60.0, clippy 0.1.60.
编辑:我还应该补充一点,这不是我从模块中删除 pub
时发生的唯一额外 lint。例如,我还有 1 个新 clippy::upper_case_acronyms 和 1 个新 clippy::enum_variant_names.
编辑 2:根据要求,我提供了更多示例来展示发生在 clippy::upper-case_acronyms 和 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.
因为像这样更改 public API 是一个重大更改。
如果它是一个内部方法,将参数更改为像 clippy 推荐的那样按值传递很容易,因为您可以控制使用它的所有代码。但是,如果参数是作为 public API 的一部分公开的函数或方法,更改它需要所有其他使用它的项目也进行更改,这对于像这样的小事情来说通常是不可接受的通过引用传递一个小的 Copy
值。