types - 如何在没有赋值的情况下注释 Rust 变量的数据类型?

标签 types rust variable-assignment

我是 Rust 的新手,我想声明一个类型变量而不初始化它。这在 Rust 中可能吗?如果是这样,它是否可取,或者是否有更好、更像 rust 菌的方法来做到这一点?

我正在查看来自 rustlings 的以下代码编译失败,因为它无法推断 x 的类型:

    let x;
    if x == 10 {
        println!("Ten!");
    }

所以,我尝试了这个:

let x: i32;

但是,现在编译器将在比较行上抛出一个错误,指出 x 尚未声明。

这工作正常,但我想知道是否可以在没有赋值的情况下声明类型。

let x: i32 = 10;

或者说正确的做法是首先设计您的代码来避免这种情况?我来自 C 背景,我可能对懒惰类型感到有点太自在了。

最佳答案

在 Rust 中,变量的类型通常是从​​上下文中推断出来的。
上下文可以包括以下任何内容:

  • 被赋值的类型:
let x = String::new(); //x is now a String
  • 被调用函数的返回类型:
fn foo() -> usize {
    40
}
let x = foo(); //x is now usize

但是如果您没有要推断的类型,因为没有对变量的赋值:

let x;

然后 Rust 无法推断类型。因此,it will get mad at you .

另一个需要在这个答案中解决的问题; Rust 不允许读取未初始化变量的事实。以下值 x 未初始化:

let x: u32;

读取未初始化的 u32 的值可能不会做太多,但请考虑以下几点:

struct MyString {
    ptr: *const u8,
    len: usize,
    cap: usize,
}

如果我们为此提供一个安全的包装器,那就太好了,毕竟,这本质上就是 stdlib String 的内容。归结为。但是,如果我们拥有一个未初始化的 MyString 并试图读取它的内容,我们最终会从 ptr 中读取一个垃圾地址,以及一个垃圾 lencap。这将导致读取垃圾指针,这是未定义的行为,这是 rust 消除的第一要务。

所以,回顾一下:
✓ 每个变量都必须有一个运行时可确定的类型(包括删除类型,因为它们也是具体类型 [dyn Traitimpl Trait ],但 impl Trait 是特殊的。 )
✓ 每个变量都必须先赋值,然后才能读取它的值。
✓ Rust 非常努力地消除所有未定义的行为。

关于types - 如何在没有赋值的情况下注释 Rust 变量的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56403266/

相关文章:

haskell - 依赖类型 'ZipVector' 应用程序

rust - 如何处理 HashMap 中的每个值并选择性地拒绝一些值?

function - 为什么不能将变量移出闭包?

javascript - 数组声明和赋值 (JavaScript)

c++ - 在声明中为类赋值不编译

c++ - 制作一个包装器 dll 让 gamemaker 处理 C++ 标准库

c# - 如何将值四舍五入到小数点后三位?

typescript - 如何定义仅接受某些用户定义类的实例的 Typescript 类型

rust - 在Rust中实现超时

Java - 为什么将 F 附加到 `float a=0.32F` 告诉它在 a 中存储 32 位 float ,但执行 `float a = 0.32` 却告诉它你想存储 64 位 double ?