若干次的事实:一个具体的原生 reference 类型是由“指向的值的类型”和 lifetime 共同构成的,只不过 lifetime 不会显式写在类型里。lifetime 对于编译器的 borrowchecker 来说非常重要,borrow checker 就是因为能计算出每个 reference 的 lifetime,才能在编译时期检查到很多潜在的内存安全问题。 注意,这一节的...
一种叫做unique reference,唯一引用,或者排他引用(exclusive),顾名思义,仅一个这样的引用可以存在。 fnmain(){letmutv="hello".into();// 默认通过 let 创建的变量都是只读的,加上 mut 表示 v 是一个可修改变量leta:&String=&v;// a 是 v 的一个共享引用letb:&String=&v;// b 也是 v 的一个共...
error[E0596]: cannot borrow `*some_string` as mutable, as it is behind a `&` reference -->src/main.rs:19:5 | 19 | some_string.push_str(", world"); | ^^^ `some_string` is a `&` reference, so the data it refers to cannot be borrowed as mutable | help: consider changing ...
借用规则 引用(reference)不获取所有权,坚持单一所有者和单一职责,解决了共享访问障碍。按引用传递对象的方式称作借用 (borrow), 这比转移所有权更有效 一个引用的生命周期,一定不会超过其被引用的时间。这显而易见的,为了防止悬垂引用 如果存在一个值的可变借用,那么在该借用作用域内,不允许有其它引用(读或写) ...
error[E0515]: cannot return reference to local variable `result` --> main.rs:15:5 | 15 | result.as_str() | ^^^ returns a reference to data owned by the current function result 在函数结束后就被释放,但是仍然存在对 result 的引用,无法指定合适的生命周期(好处是避免了悬垂引用),为了解决这...
return i; } } s.len() 现在有了一个找到字符串中第一个单词结尾索引的方法,不过这有一个问题。我们返回了一个独立的 usize,不过它只在 &String 的上下文中才是一个有意义的数字。换句话说,因为它是一个与 String 相分离的值,无法保证将来它仍然有效。考虑一下示例 8 中使用了示例 7 中 first_word 函...
returnsome_string; // some_string 被当作返回值移动出函数 } fntakes_and_gives_back(a_string:String)->String{ // a_string 被声明有效 a_string// a_string 被当作返回值移出函数 } 被当作函数返回值的变量所有权将会被移动出函数并返回到调用函数的地方,而不会直接被无效释放。
我们通过一个小调整就能修复示例 6 代码中的错误,允许我们修改一个借用的值,这就是可变引用(mutable reference): 文件名: src/main.rs fn main() { let mut s = String::from("hello"); change(&mut s); } fn change(some_string: &mut String) { ...
在Rust中,模式(Pattern)是一种强大的语法,用于匹配和解构不同的数据结构。模式可以应用于各种场景,例如匹配枚举、元组、结构体、引用、切片以及自定义类型等。本篇博客将深入探索Rust的模式语法,包括各种模式的定义、使用和搭配使用的技巧,帮助您更好地理解和运用Rust的模式匹配。
// return the answer 42 } let v1 = vec![1, 2, 3]; let v2 = vec![1, 2, 3]; let answer = foo(&v1, &v2); // we can use v1 and v2 here! 这段代码中,使用了&Vec< i32 > 作为参数类型,当然了现在不需要在意Vec< i32>是什么类型,我们把形如&T的都叫做"reference(引用)", ...