首页 > 其他分享 >04.引用与借用

04.引用与借用

时间:2022-11-27 19:24:29浏览次数:37  
标签:String 04 切片 索引 引用 str 借用 字符串

引用和借用

  • 参数的类型是 &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 更加通用,且不会损失任何功能。

标签:String,04,切片,索引,引用,str,借用,字符串
From: https://www.cnblogs.com/huiteresa/p/16930371.html

相关文章