如何在Rust中不显式注释类型来拒绝 int 变量?

4

我经常在不使用类型注释的情况下使用整数类型:

let mut counter = 0

如果没有限制,rustc将推断x是一个i32。(rfcs/0212-restore-int-fallback.md at master · rust-lang/rfcs)。

有时会出现问题:溢出。

for _ in 0..1_000_000_000_000usize {
    counter += 1; # overflow!
    ...
}

我希望rustc能够拒绝没有明确类型注释的整数变量:

let mut counter = 0; # Deny
let mut counter: u64 = 0; # OK, because `counter` is explicitly annotated with `u64`

如何做到这一点?


2
如果你想要一种类似于编译器lint的东西来拒绝没有明确类型的整数字面量,我相信目前还不可能。然而,我非常确定如果你在rust存储库中提交一个问题,这个功能是可以实现的。 - Gymore
1
惰性类型推断是 Rust 的一个特性,而不是一个 bug。这很不可能成为官方编译器的 lint。然而,它可能会作为 Clippy 中的可选 lint 实现,所以我建议先尝试一下。 - pretzelhammer
请注意,OP并不反对整数字面量的懒惰类型推断 - 请参见最终片段。 OP希望有一个禁用回退到i32的lint,这只是一个回退,并且与推断完全无关。 - user4815162342
2
我已经在Clippy的存储库中打开了一个问题:https://github.com/rust-lang/rust-clippy/issues/6634 - tamuhey
有一个比等待问题被实现更简单的方法,那就是在需要的地方直接包含您的类型。 - TheCoolDrop
1
@TheCoolDrop 当然,任何警告或lint都可以通过在第一次避免犯错来替换!OP确实想要包括类型,并进一步询问有关在忘记这样做的地方发出警告的lint。 - user4815162342
1个回答

3

有一个新的lint: default_numeric_fallback

#[warn(clippy::default_numeric_fallback)]

pub fn is_yelled(s: &str) -> bool {
    let (n_upper, n_lower) = s.chars().fold((0, 0), |(n_upper, n_lower), c| {
        if c.is_uppercase() {
            (n_upper + 1, n_lower)
        } else if c.is_lowercase() {
            (n_upper, n_lower + 1)
        } else {
            (n_upper, n_lower)
        }
    });
    
    n_upper > n_lower
}

将输出:

warning: default numeric fallback might occur
 --> src/lib.rs:4:46
  |
4 |     let (n_upper, n_lower) = s.chars().fold((0, 0), |(n_upper, n_lower), c| {
  |                                              ^ help: consider adding suffix: `0_i32`
  |
note: the lint level is defined here
 --> src/lib.rs:1:8
  |
1 | #[warn(clippy::default_numeric_fallback)]
  |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#default_numeric_fallback

warning: default numeric fallback might occur
 --> src/lib.rs:4:49
  |
4 |     let (n_upper, n_lower) = s.chars().fold((0, 0), |(n_upper, n_lower), c| {
  |                                                 ^ help: consider adding suffix: `0_i32`
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#default_numeric_fallback

warning: default numeric fallback might occur
 --> src/lib.rs:6:24
  |
6 |             (n_upper + 1, n_lower)
  |                        ^ help: consider adding suffix: `1_i32`
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#default_numeric_fallback

warning: default numeric fallback might occur
 --> src/lib.rs:8:33
  |
8 |             (n_upper, n_lower + 1)
  |                                 ^ help: consider adding suffix: `1_i32`
  |
  = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#default_numeric_fallback

不幸的是,现在lint只能以严格模式列出警告,并不会发出警告。同时建议使用usize而不是i32作为默认值似乎有点奇怪。例如,这段代码应该使用usize

来源:https://github.com/rust-lang/rust-clippy/issues/6064


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接