String 类型的字符串是分配在堆上内存的可变字节缓冲区,由内存地址、容量、当前值的长度,这三部分构成。
&String 是String类型的引用,实际上保存的是内存地址,
str是一个不可变的固定长度的字符串,如果是从String解引用而来的,则指向堆上,如果是字面值,则指向静态内存。例如 let s:&str="abcd"; s的类型是&str,而“abcd”是str类型,这里的“abcd”就是字符串字面值,存放在Stack上的。s 是切片,切片是一个结构体,包含两个字段,一个是指向数据的指针,另一个是数据的长度。
&str
表示指向内存中str类型的指针,该内存保存 str类型的变量值:"abcd",&str
是String
的切片类型。切片 &str 虽然可以安全使用,其地址、长度都是固定的。很难修改其内容。
Rust 希望在数组容量不会变化的时候,用 &str。在数组长度可能发生变化的情况下,使用 String。String 总是 “有效的” UTF-8,Rust字符串只能是UTF-8的类型。另外,不能用索引访问 String,因为有些字符的编码可能是多个字节,取到中间就是没有意义的。
let s = String::from("hello");
// s[0..1] 的类型为 str是string 的切片类型,不能直接切片,
let s1 = &s[0..1];
let s2 = &s[0..3];
let s3 = &s[3..];
&str或str转String
let s: String = "hello".to_string();
et t: String = String::from("hello");
在 Rust 中,凡是需要用 &str 的地方,都可以直接用 &String 类型的数据。&String和&str其实也是差不多的。
enumerate是一个迭代器,返回的迭代器产生对 (i, val)
,其中 i
是迭代的当前索引,而 val
是迭代器返回的值。
let records = penguin_data.lines();
for (i, record) in records.enumerate() {
if i == 0 || record.trim().len() == 0 {
continue;
}
}
原文链接:https://blog.csdn.net/2301_79967122/article/details/133722340
let a = ['a', 'b', 'c'];
let mut iter = a.iter().enumerate();
assert_eq!(iter.next(), Some((0, &'a')));
assert_eq!(iter.next(), Some((1, &'b')));
assert_eq!(iter.next(), Some((2, &'c')));
assert_eq!(iter.next(), None);
lines是字符串行上的迭代器,作为字符串切片,以换行符 (\n
) 或带有换行符的回车符 (\r\n
) 结束。
let text = "foo\r\nbar\n\nbaz\n";
let mut lines = text.lines();
assert_eq!(Some("foo"), lines.next());
assert_eq!(Some("bar"), lines.next());
assert_eq!(Some(""), lines.next());
assert_eq!(Some("baz"), lines.next());
assert_eq!(None, lines.next());
trim只是“边裁”。或两边,或右边,或左边。默认裁掉两边的空格
let s = " Hello\tworld\t";
assert_eq!("Hello\tworld", s.trim())
let s = " Hello\tworld\t";
assert_eq!("Hello\tworld\t", s.trim_left());
let s = " Hello\tworld\t";
assert_eq!(" Hello\tworld", s.trim_right());
split方法:以传入的符号分割字符串,并返回迭代器,
map方法:对迭代器中的数据进行转换,即为迭代器中的每个元素调用map中的闭包
collect方法:将迭代器中的元素收集到一个向量中。因为迭代器不会立即计算它们的值,而是在调用next方法时才会计算。这意味着需要调用collect或其他消耗迭代器的方法来获取最终结果
什么是迭代器
Rust中的迭代器是一种强大的工具,它提供了一种灵活、通用的方法来遍历序列。迭代器是实现了Iterator trait的类型,并需要至少实现一个next函数,用于让迭代器指向下一个迭代对象,并返回一个Option用于指示对象是否存在。
rust
复制代码
fn next (&mut self) -> Option<Self::Item>;
迭代器相比于for循环有一些优势。首先,迭代器提供了一种灵活、通用的方法来迭代序列。它允许你使用各种方法来处理序列中的元素,例如map、filter、fold等。这些方法可以让你更简洁、更清晰地表达你的意图。
此外,迭代器和Rust的所有权系统密切相连。这意味着你可以使用迭代器来安全地处理序列中的元素,而不必担心内存安全问题。
迭代器是Rust
的零抽象之一,这意味着迭代器抽象不会引入运行时开销,不会有任何性能上的影响
什么是迭代器
Rust中的迭代器是一种强大的工具,它提供了一种灵活、通用的方法来遍历序列。迭代器是实现了Iterator trait的类型,并需要至少实现一个next函数,用于让迭代器指向下一个迭代对象,并返回一个Option用于指示对象是否存在。
fn next (&mut self) -> Option<Self::Item>;
迭代器允许使用各种方法来处理序列中的元素,例如map、filter、fold等。Rust中的迭代器可以通过实现Iterator trait来创建,也可以通过调用现有类型的iter方法来获取。例如,Vec提供了一个iter方法,可以返回一个迭代器,用于遍历Vec中的元素。
参考文章:Rust中的迭代器的使用:map转换、filter过滤、fold聚合、chain链接 - 掘金 (juejin.cn)