Rust学习杂记

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)

 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值