我从未尝试过像C、C++和Go等语言,我决定从Rust开始学起。我已经有点了解栈和堆是什么了,但是,移动变量到底意味着什么?文档中说这不是浅拷贝:
文档中提到“无效”指什么?这是否意味着Rust将使
据我所了解,这种检查发生在编译时,这让我想到
显然,此情况发生在大小未知的值(即,在堆中)中。
希望我能帮助你理解。 :)
例如:...听起来可能像是一个浅拷贝。但由于Rust还使第一个变量无效,而不是称其为浅拷贝,因此它被称为移动(move)。在这个例子中,我们会说
s1
被移动到s2
中...
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1);
文档中提到“无效”指什么?这是否意味着Rust将使
s1
无效,并将原来在s1
的值分配给s2
,所以...s1
不存在?还是说它仍然有任何价值?这是我不理解的主要内容,它真的被移到了吗?还是s1
在内存中仍然有任何价值?据我所了解,这种检查发生在编译时,这让我想到
s1
在内存中确实不存在,只有s2
,因为s1实际上已经移动到s2
。显然,此情况发生在大小未知的值(即,在堆中)中。
希望我能帮助你理解。 :)
cargo run
哈哈哈),实际上变量s1
没有被初始化,也就是说,在内存中没有给它一个值,因为该值在s2
中初始化,也就是说,它“转换”或理解为:let s1; let s2 = String::from("hello"); println!("{}, world!", s2);
所以,在s1
中没有引用或浅拷贝,我的理解正确吗?哈哈哈。 - Grizzlys1
拥有一个String
,它是指向堆分配的托管指针。将其移动到s2
将String
值(因此也是堆分配)的所有权转移给了s2
,但移动并不要求甚至存在堆分配。 - cdhowie