文章目录
Rust语言- Slice(切片)类型(&[u8])
slice是一个没有所有权的数据类型,其允许你引用集合中一段连续的元素序列,而不引用整个集合,通用语义如下:
slice是一种动态类型DST(Dynamically Sized Types),无法直接使用slice,都需要将其隐藏在指针后面使用,常用的方式如下:
- &[T]:shared slice
- &mut [T]:mutable slice
- Box:boxed slice
动态类型(Dynamically Sized Types)
大部分类型在编译时都有确定的大小,并且编译器会自动为类型实现trait Sized。如果一个类型只能在运行时才能确定大小,则该类型称为 DST(Dynamically Sized Type),也可以说unsized type 。Slices和Trait Objects是两种常见的DSTs。
字符串字面值
原文链接:https://www.cnblogs.com/microwang/p/16029155.html
字符串字面值被直接存储在二进制程序中
let s = "Hello,World!";
变量 s 的类型是 &str ,它是一个指向二进制程序特定位置的切片, &str 是不可变引用,所以字符串字面值也是不可变的
将字符串切片作为参数传递:
fn main() {
let my_string = String::from("Hello world");
let wordIndex = first_word(&my_string[..]);
let my_string_literal = "hello world";
let wordIndex = first_word(my_string_literal);
}
fn first_word(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[..i];
}
}
&s[..]
}
关于:
fn first_word(s: &String) -> &str {
fn first_word(s: &str) -> &str {
使用 &str作为参数类型,可以同时接受String和&str类型的参数。
定义函数时,使用字符串切片代替字符串引用会使用我的API更加通用。
Rust中的String与str
Rust中的String,&str和str都是什么?
参考URL: https://zhuanlan.zhihu.com/p/384496181
String和str完全不同两个东西。
-
String是什么?
String可以看作由三个变量所组成的结构体,第一个变量为指向一块堆上连续内存的指针,第二个变量为这块内存里已经使用的总大小。第三个变量为这块内存的总长度capacity。
String在new的时候从堆里申请内存,在drop的时候释放内存。
String内部的指向的连续内存可以看作为u8的数组,String的使用接口确保了内部存储的确实为合法的UTF-8编码的字节。 -
&str是什么?
&str是对String的一种借用形式,被称为字符串切片。
由于&str的特殊性让其与普通的引用区分开,这种携带了元数据的特殊引用也被称为胖指针。
&str非常有用,它能够引用String类型的多个不同子字符串而无需复制,避免复制。
let heap_string:String =“Hello World” .to_string();
let substring1:&str =&string [1..3];
let substring2:&str =&string [2..4];
字符串切片
最简单、最常用的数据切片类型是字符串切片(String Slice):
fn main() {
println!("字符串切片----->");
let s = String::from("broadcast");
let part1 = &s[0..5];
let part2 = &s[5..9];
println!("{}={}+{}", s, part1, part2);
}
这就是创建切片的语法,使用方括号包括的一个序列: [开始索引…终止索引。
切片并不是Rust独有的概念,在Go语言中就非常流行,它允许你引用集合中一段连续的元素序列,而不是引用整个集合。
part1 没有引用整个String s,而是引用了s的一部分内容,通过[0…5]的方式来指定。
对于let part2= &s[5…9];来说,part2是一个切片,该切片的指针指向s的第6个字节(索引从0开始,5是第6个字节),且该切片的长度是4个字节。
非字符串切片
除了字符串以外,其他一些线性数据结构也支持切片操作,例如数组:
fn main() {
//非字符串切片
println!("非字符串切片----->");
let arr = [1, 3, 5, 7, 9];
let part = &arr[0..3];
for i in part.iter() {
println!("{}", i);
}
}
&[u8]
Rust从&[u8] bytes中读取任意类型的整数(如i32, u32等多种类型)
参考URL: https://blog.csdn.net/qq_26373925/article/details/111087884
u8
Rust 原始类型。8位无符号整数类型。它可以存放从零到 255 的值。