Rust之所有权(三):切片类型

本文介绍了Rust中的字符串切片,它允许程序员引用字符串的连续部分,而不是整个字符串。通过示例,展示了如何使用切片找到字符串中的第一个单词,并讨论了切片与字符串所有权的关系,以及其在内存安全中的作用。此外,还提到了字符串字面量实际上是不可变的字符串切片。最后,强调了切片如何简化API并提高代码的健壮性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发环境

  • Windows 10
  • Rust 1.56.0

 

  •  VS Code 1.61.2

 


项目工程

这里继续沿用上次工程rust-demo

切片类型

另一个没有所有权的数据类型是切片。切片允许您引用集合中的连续元素序列,而不是整个集合。

下面是一个小的编程问题:编写一个函数,该函数接受一个字符串并返回它在该字符串中找到的第一个单词。如果函数在字符串中找不到空格,则整个字符串必须是一个单词,因此应该返回整个字符串。

首先我们考虑一下这个函数:

fn first_word(s: &String) -> ?

这个函数first_word有一个&String作为参数。我们不想要所有权,所以这没问题。但我们应该返回什么呢?我们没有办法谈论字符串的一部分。但是,我们可以返回单词末尾的索引。可以看下面的代码:

fn first_word(s: &String) -> usize {
    let bytes = s.as_bytes();     // 将字符串转换成一个字节数组,以便下面逐个遍历

    for (i, &item) in bytes.iter().enumerate() {  // 使用iter()方法在字节数组上创建一个迭代器
        if item == b' ' {
            return i;        // 返回字符的索引
        }
    }

    s.len()
}

现在,iter()是一个方法,它返回集合中的每个元素,enumerate()枚举封装iter()的结果,然后将每个元素作为元组的一部分返回。enumerate()枚举返回的元组的第一个元素是索引,第二个元素是对元素的引用。这比自己计算索引要方便一些。

因为enumerate()枚举方法返回一个元组,所以我们可以使用模式来重构该元组。因此,在for循环中,我们指定了一个模式,它在元组中为索引指定了i,对于元组中的单个字节指定了&Item。因为我们从.iter().enumerate()获得了对元素的引用,所以我们在模式中使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值