我正在读“这本书”,想测试一下我对章节切片借阅规则的理解。
我对借用检查器如何将我传入的内容与函数返回的内容关联起来(我的假设)印象深刻。所以我尝试了一些示例来测试我的理解,并且我正在努力弄清楚借用检查器的规则。
- 为什么
test1
编译失败,在哪里test5
可以找到? - 我的理解哪里错了?(见下面的思考过程)
- “这本书”在哪里涵盖了我所不了解的内容?
该代码始终相同:
fn tmp() {
let mut s = String::from("hello world");
let thing = testX(&s);
s.clear(); // error!
let tmp = thing.len();
println!("the first word is: {tmp}");
}
测试 1:
fn test1(s: &String) -> &str {
"Slice"
}
这里我传入了一个可变字符串的不可变引用,但没有在函数中使用它。我返回了一个不同的切片(在我看来,是一个不同的不可变字符串)。我相信一旦test1
返回,它就不再持有对 的借用&s
。我期望这段代码能够编译,但事实并非如此,我仍然以某种方式持有对 的不可变借用s
。
所以我想知道借用检查器是否将返回的类型与传入的类型相关联。
测试2:
fn test2(s: &String) -> Vec<&str> {
let mut vec = Vec::new();
vec.push(s.as_str());
vec
}
我尝试使用更多间接方式来发挥创造力。我不知道as_str()
所有权方面有什么用,但我有兴趣了解。在这里,我传回了传入内容的一部分,因此我并不惊讶它无法编译,但我已经怀疑我对规则的理解是错误的。
测试 3
fn test3(s: &String) -> Vec<&str> {
let mut vec = Vec::new();
vec.push("Slice");
vec
}
我遵循了与 类似的原理test1
,但也无法编译。这告诉我,它与返回传入类型的引用类型无关,除非它将推理扩展到拥有向量的类型。。?
测试 4
fn test4(s: &String) -> Vec<&usize> {
let mut vec = Vec::new();
vec.push(&1);
vec
}
现在我变得狡猾起来,我创建的代码我认为与 相当test3
,但返回的却是不相关的类型。但编译器仍然不允许这样做。所以看起来,由于某种原因,该函数在返回后仍保留着 的借用?!&String
测试 5
fn test5(s: &String) -> Vec<String> {
let mut vec = Vec::new();
vec.push(String::from("something new"));
vec
}
我尝试了这个,完全预料到它也无法编译,但它有效!
test1
我认为它在逻辑上与借用相同s
。在这两种情况下,我都没有对 做任何事情s
,但test1
保留借用,而 则test5
没有。
帮助!