代码之家  ›  专栏  ›  技术社区  ›  Tim Robinson

我可以用局部变量隐藏常量绑定吗?

  •  6
  • Tim Robinson  · 技术社区  · 6 年前

    我想这会管用的:

    const x: &str = "10";            // declare a const
    let x: i32 = x.parse().unwrap(); // reuse the same name for a let binding
    assert_eq!(10, x);
    

    error[E0308]: mismatched types
     --> src/main.rs:3:9
      |
    3 |     let x: i32 = x.parse().unwrap(); // reuse the same name for a let binding
      |         ^ expected i32, found reference
      |
      = note: expected type `i32`
                 found type `&'static str`
    
    error[E0277]: the trait bound `{integer}: std::cmp::PartialEq<&str>` is not satisfied
     --> src/main.rs:4:5
      |
    4 |     assert_eq!(10, x);
      |     ^^^^^^^^^^^^^^^^^^ can't compare `{integer}` with `&str`
      |
      = help: the trait `std::cmp::PartialEq<&str>` is not implemented for `{integer}`
      = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info)
    

    这是有效的:

    const x: &str = "10";
    let y: i32 = x.parse().unwrap();
    assert_eq!(10, y);
    

    这也是:

    let x: &str = "10";
    let x: i32 = x.parse().unwrap();
    assert_eq!(10, x);
    

    是我做错了什么,还是不可能遮蔽一个存在? const let 用同一个名字?

    1 回复  |  直到 6 年前
        1
  •  5
  •   Shepmaster Tim Diekmann    6 年前

    我想我明白了。。。当我使用 let SOME_CONST ,编译器认为我是模式匹配。

    当我修复类型时:

    const x: i32 = 10;
    let x: i32 = x + 1;
    assert_eq!(11, x);
    

    我得到一个不同的错误:

    error[E0005]: refutable pattern in local binding: `_` not covered
     --> src/main.rs:3:9
      |
    3 |     let x: i32 = x + 1;
      |         ^ interpreted as a constant pattern, not new variable
    

    好像我把所有 x 在程序中把它们扩展到常数 10

    let 10: i32 = 10 + 1;
    assert_eq!(11, x);