【发布时间】:2019-04-29 17:04:10
【问题描述】:
所以在 Rust 中,我对值与引用的类型推断能力感到困惑。例如,
fn main() {
let s1 = String::from("h1");
let s2 = &s1;
println!("string is {}", s1);
}
借用检查器允许编译,但我不知道为什么? s2 这里是一个值还是被推断为对 s1 的引用?
在 C++ 中,通过引用初始化新值会创建一个副本,除非该变量被显式声明为引用:
#include <string>
int main(int argc, char const* argv[]) {
std::string s1("Hello");
std::string& s2 = s1; // reference
std::string s3 = s2; // copy
}
所以在 rust 中,我的问题是,类型推断是否也适用于引用与值的情况?如果是这样,什么时候需要将变量显式声明为引用?
【问题讨论】:
-
从类型检查器的角度来看,结构值和对结构值的引用是两种不同的类型。这可能是让你失望的原因吗?
-
在 rust 示例中,s2 是推断为引用还是从引用创建的新值?
-
&s1表示你有一个引用类型。 -
我明白了,因此不需要在
let端显式声明。现在明白了。 -
要澄清的另一件事是,Rust 通常移动值而不是复制它们。如果您要在 Rust 示例中添加一行
let s3 = s1,例如 this,那么它将无法编译,因为该值已从s1移出并移至s3。Clone特征可用于显式创建值的新副本(例如let s3 = s1.clone()),Copy特征可用于允许隐式逐位复制(例如 i32 等原语)。
标签: rust