- 🌟🌟 你无法通过索引的方式去访问字符串中的某个字符,但是可以使用切片的方式
&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 字符串 - 🌟
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 的具体大小。 - 🌟
fn main() {
// 使 用 合 适 的 类 型 填 空
let arr: __ = [1, 2, 3, 4, 5];
// 修 改 以 下 代 码 , 让 它 顺 利 运 行
assert!(arr.len() == 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) == __);
} - 🌟 数组中的所有元素可以一起初始化为同一个值
fn main() {
// 填 空
let list: [i32; 100] = __ ;
assert!(list[0] == 1);
assert!(list.len() == 100);
} - 🌟 数组中的所有元素必须是同一类型
fn main() {
// 修 复 错 误
let _arr = [1, 2, ‘3’];
} - 🌟 数组的下标索引从 0 开始.
fn main() {
let arr = [‘a’, ‘b’, ‘c’];
let ele = arr[1]; // 只 修 改 此 行 来 让 代 码 工 作
assert!(ele == ‘a’);
} - 🌟 越界索引会导致代码的 panic .
// 修 复 代 码 中 的 错 误
fn main() {
let names = [String::from(“Sunfei”), “Sunface”.to_string()];
//get
返 回Option<T>
类 型 , 因 此 它 的 使 用 非 常 安 全
let name0 = names.get(0).unwrap();
// 但 是 下 标 索 引 就 存 在 越 界 的 风 险 了
let _name1 = &names[2];
}
Rust从入门到实战系列二百七十:字符串索引string index
最新推荐文章于 2024-08-04 12:24:40 发布