Rust从入门到实战系列二百七十:字符串索引string index

  1. 🌟🌟 你无法通过索引的方式去访问字符串中的某个字符,但是可以使用切片的方式
    &s1[start…end] ,但是 start 和 end 必须准确落在字符的边界处.
    fn main() {
    let s1 = String::from(“hi,中 国”);
    let h = s1[0]; // 修 改 当 前 行 来 修 复 错 误 , 提 示: h 字 符 在 UTF-8 格 式 中 只 需 要 1 个 字 节 来
    assert_eq!(h, “h”);
    let h1 = &s1[3…5];// 修 改 当 前 行 来 修 复 错 误 , 提 示: 字 符 在 UTF-8 格 式 中 需 要 3 个 字
    assert_eq!(h1, “中”);
    }
    操作 UTF-8 字符串
  2. 🌟
    fn main() {
    // 填 空 , 打 印 出 “你 好 , 世 界” 中 的 每 一 个 字 符
    for c in “你 好 , 世 界”.__ {
    println!(“{}”, c)
    }
    }
    utf8_slice
    我们可以使用三方库 utf8_slice 来访问 UTF-8 字符串的某个子串,但是与之前不同的是,该库索引的是字
    符,而不是字节.
    Example
    use utf8_slice;
    fn main() {
    let s = “The 🚀 goes to the 🌑!”;
    let rocket = utf8_slice::slice(s, 4, 5);
    // 结果是 “🚀”
    }
    你可以在这里找到答案(在 solutions 路径下)
    数组
    数组的类型是 [T; Length] ,就如你所看到的,数组的长度是类型签名的一部分,因此数组的长度必须在
    编译期就已知,例如你不能使用以下方式来声明一个数组:
    fn create_arr(n: i32) {
    let arr = [1; n];
    }
    以上函数将报错,因为编译器无法在编译期知道 n 的具体大小。
  3. 🌟
    fn main() {
    // 使 用 合 适 的 类 型 填 空
    let arr: __ = [1, 2, 3, 4, 5];
    // 修 改 以 下 代 码 , 让 它 顺 利 运 行
    assert!(arr.len() == 4);
    }
  4. 🌟🌟
    fn main() {
    // 很 多 时 候 , 我 们 可 以 忽 略 数 组 的 部 分 类 型 , 也 可 以 忽 略 全 部 类 型 , 让 编 译 器 帮 助 我 们 推 导
    let arr0 = [1, 2, 3];
    let arr: [_; 3] = [‘a’, ‘b’, ‘c’];
    // 填 空
    // 数 组 分 配 在 栈 上 , std::mem::size_of_val 函 数 会 返 回 整 个 数 组 占 用 的 内 存 空 间
    // 数 组 中 的 每 个 char 元 素 占 用 4 字 节 的 内 存 空 间 , 因 为 在 Rust 中 , char 是 Unicode 字 符
    assert!(std::mem::size_of_val(&arr) == __);
    }
  5. 🌟 数组中的所有元素可以一起初始化为同一个值
    fn main() {
    // 填 空
    let list: [i32; 100] = __ ;
    assert!(list[0] == 1);
    assert!(list.len() == 100);
    }
  6. 🌟 数组中的所有元素必须是同一类型
    fn main() {
    // 修 复 错 误
    let _arr = [1, 2, ‘3’];
    }
  7. 🌟 数组的下标索引从 0 开始.
    fn main() {
    let arr = [‘a’, ‘b’, ‘c’];
    let ele = arr[1]; // 只 修 改 此 行 来 让 代 码 工 作
    assert!(ele == ‘a’);
    }
  8. 🌟 越界索引会导致代码的 panic .
    // 修 复 代 码 中 的 错 误
    fn main() {
    let names = [String::from(“Sunfei”), “Sunface”.to_string()];
    // get 返 回 Option<T> 类 型 , 因 此 它 的 使 用 非 常 安 全
    let name0 = names.get(0).unwrap();
    // 但 是 下 标 索 引 就 存 在 越 界 的 风 险 了
    let _name1 = &names[2];
    }
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值