引用和借用
- 参数的类型是 &String 而不是 String
- & 符号就表示引用:允许你引用某些值而不取得其所有权
借用
- 我们把引用作为函数参数这个行为叫做借用。
- 是否可以修改借用的东西?
- 不行
- 和变量一样,引用默认也是不可变的
可变引用
- 可变引用有一个重要的限制: 在特定作用域内,对某一块数据,只能有一个可变的引用。
- 这样做的好处是可在编译时防止数据竞争
- 以下三种行为下会发生数据竞争:
- 两个或多个指针同时访问同一个数据
- 至少有一个指针用于写入数据
- 没有使用任何机制来同步对数据的访问l
- 可以通过创建新的作用域,来允许非同时的创建多个可变引用
另外一个限制
- 不可以同时拥有一个可变引用和一个不变的引用。
- 多个不变的引用是可以的
悬空引用 Dangling References
- 悬空指针(Dangling Pointer):一个指针引用了内存中的某个地址,而这块内存可能已经释放并分配给其它人使用了。
- 在Rust 里,编译器可保证引用永远都不是悬空引用:
- 如果你引用了某些数据,编译器将保证在引用离开作用域之前数据不会离开作用域
引用的规则
- 在任何给定的时刻,只能满足下列条件之一
- 一个可变的引用
- 任意数量不可变的引用
- 引用必须一直有效
切片
字符串切片
- 字符串切片是指向字符串中一部分内容的引用
- 形式:[开始索引..结束索引]
- 开始索引就是切片起始位置的索引值
- 结束索引是切片终止位置的下一个索引值
注意
- 字符串切片的范围索引必须发生在有效的 UTF-8 字符边界内。
- 如果尝试从一个多字节的字符中创建字符串切片,程序会报错并退出
字符串字面值是切片
- 字符串字面值被直接存储在二进制程序中。
- let s =“Hello,World!”.
- 变量 s的类型是 &str,它是一个指向二进制程序特定位置的切片
- &str 是不可变引用,所以字符串字面值也是不可变的
将字符串切片作为参数传递
- fn first_word(s:&String)-> &str [
- 有经验的 Rust 开发者会采用 &str 作为参数类型,因为这样就可以同时接收 String和 &str 类型的参数了:
- fn first_word(s: &str) -> &str [
- 使用字符串切片,直接调用该函数
- 使用 string,可以创建一个完整的 String 切片来调用该函数
- 定义函数时使用字符串切片来代替字符串引用会使我们的 API 更加通用,且不会损失任何功能。