「Rust」3 字符串、切片与元组
字符串
切片(Slice)
let s = String::from("hello,world");
let hello = &s[0..5];
let world = &s[6..11];
和 Go 一样,引用String
的一部分内容,存储一个ptr
和一个len
字符串切片时,索引必须落在字符的边界
切片作为对集合的部分引用,数组等类型也有相应的切片
字符串字面量是切片
let s: &str = "Hello, world!";//不可变引用
什么是字符串
字符是Unicode类型,每个字符四个字节;字符串是UTF-8 编码,么个字符的字节数是变化的。
字符串通常指的是 String
类型和&str
字符串切片类型,都是UTF8编码。
操作字符串
fn main(){
let mut s = String::new();//创建空String
s.push_str("hello");//添加&str类型的字符串
s.push("!");//添加字符
let mut s = "hello".to_string();//从现有的切片创建
s.push("!");
let mut s = String::from("hello!");
let s1 = String::from("hello,");
let s2 = String::from("world!");
let s3 = s1 + &s2;//这里s1的所有权转移了
}
上面的字符串相加使用add
方法,
fn add(self, s: &str) -> String{}
相当于String = String + &str + &str + ...
String 和 &str 的转换
String
-> &str
deref
隐式强制转换
fn main(){
let s = String::from("hello, world!");
say(&s);
say(&s[..]);
say(s.as_str());
}
fn say(s: &str){
println!("{}", s);
}
字符串索引
由于UTF8,原生只支持使用chars
和 bytes
方法返回迭代器
for c in "你好".chars(){
println!("{}", c);
}
for b in "你好".bytes(){
println!("{}", b);
}
获取子串可以考虑尝试下这个库:utf8_slice 。
元组
元组组合起了多种类型,它的长度和元素的顺序是固定的。
fn main(){
let tup:(i32, f64, u8)=(500,6.4,1)
}
- 可以使用模式匹配解构元组
let (x,y,z) = tup;
- 可以使用
.
来访问元组,索引从0开始
结构体
定义
struct User {
active: bool,
username: String,
email: String,
sign_in_count: u64,
}
创建结构体实例时,每个字段都需要初始化
顺序则不重要
使用.
操作符来访问字段
简化结构体创建
fn build_user(email: String,username:String) -> User {
User {
email,
username,
active: true,
sign_in_count: 1,
}
}
结构体更新
fn main() {
let user2 = User {
email: String::from("[email protected]"),
..user1
};
}
这里
user1
的部分复杂字段发生了所有权转移
元组结构体
和元组很像的结构体
struct Point(i32,i32,i32)