我是 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
中读取一个垃圾地址,以及一个垃圾 len
和 cap
。这将导致读取垃圾指针,这是未定义的行为,这是 rust 消除的第一要务。
所以,回顾一下:
✓ 每个变量都必须有一个运行时可确定的类型(包括删除类型,因为它们也是具体类型 [dyn Trait
和 impl Trait
],但 impl Trait
是特殊的。 )
✓ 每个变量都必须先赋值,然后才能读取它的值。
✓ Rust 非常努力地消除所有未定义的行为。
关于types - 如何在没有赋值的情况下注释 Rust 变量的数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56403266/