Skip to content

Latest commit

 

History

History
141 lines (95 loc) · 5.21 KB

Day4(10.4).md

File metadata and controls

141 lines (95 loc) · 5.21 KB

继续rust继承语言的学习,并且完成了String题目练习

所有权:

每一个值在任意时刻都只能有一个所有者,当所有者离开作用域,该值会被丢弃

对于函数参数,如果直接传参会转移所有权,返回值也会返回所有权

对于只在栈上面的大小固定的简单类型,通过自动拷贝完成无需发生所有权转移;只有涉及到堆(即动态的大小,不确定时)才会发生所有权转移;例如string类型涉及到堆。但是 &str不涉及堆

Rust 基本类型都是通过自动拷贝的方式来赋值的:数值,字符,布尔,单元(),元组,当且仅当其包含的类型也都是 Copy 的时候,不可变引用 &T

对于堆上面的可以深拷贝:clone;不改变所有权

let s1 = String::from("hello");
let s2 = s1.clone();

println!("s1 = {}, s2 = {}", s1, s2);

获取变量的引用叫借用(不改变所有权,但是能够使用这个变量)

引用:常规引用是一个指针类型,指向了对象存储的内存地址;&表示引用
let x=5;
let y=&x;//引用x
assert_eq!(5,x);
assert_eq!(5,*y);//解引用

可变的引用: &mut  前提是所有权允许修改!
fn main() {
    let mut s = String::from("hello");

    change(&mut s);
}

fn change(some_string: &mut String) {
    some_string.push_str(", world");
}

同一个作用域,同一变量只能拥有一个可变引用;且它的可变和不可变引用不能同时存在
引用的作用域 s 从创建开始,一直持续到它最后一次使用的地方,这个跟变量的作用域有所不同,变量的作用域从创建持续到某一个花括号

简答来说,引用就是去读所有权下的内容,看能拥有什么权限,不可变引用就是只能读,可变引用就是写,但是只能一个人写

字符串

切片:引用集合中部分连续的元素序列,而不是引用整个集合

let s=String::from("hello,world");
let hello=&s[0..5];//创建切片的语法,左闭右开区间
[0..5]等价于[..5]
同理:[4..len]等价于[4..]
完整的切片:[..]

字符串切片标识符: &str

字符串字面量是切片!!!即&str: let s="hello,word"

String类型是可变字符串类型

&str变成String:
String::from("hello,world")"hello,world".to_string()

对于字符串类型用索引操作极易报错!!!

操作字符串(String类型):

追加:

在字符串尾部可以使用 push() 方法追加字符 char,也可以使用 push_str() 方法追加字符串字面量。这两个方法都是在原有的字符串上追加,并不会返回新的字符串。由于字符串追加操作要修改原来的字符串,则该字符串必须是可变的,即字符串变量必须由 mut 关键字修饰

fn main() {
    let mut s = String::from("Hello ");

    s.push_str("rust");
    println!("追加字符串 push_str() -> {}", s);

    s.push('!');
    println!("追加字符 push() -> {}", s);
}

插入:可以使用 insert() 方法插入单个字符 char,也可以使用 insert_str() 方法插入字符串字面量,与 push() 方法不同,这俩方法需要传入两个参数,第一个参数是字符(串)插入位置的索引,第二个参数是要插入的字符(串),索引从 0 开始计数,如果越界则会发生错误。

fn main() {
    let mut s = String::from("Hello rust!");
    s.insert(5, ',');
    println!("插入字符 insert() -> {}", s);
    s.insert_str(6, " I like");
    println!("插入字符串 insert_str() -> {}", s);
}

替换:

1.replace():仅适用于String和&str类型:结果会返回一个新字符串String类型!let new_s=old_s.replace(”旧字符串”,”新字符串”)

2.replacen():与replace一样就是多了一个参数表示替换个数

let new_s=old_s.replace(”旧字符串”,”新字符串”,number);

3.replace_range():直接操作原来的字符串,不会返回新的字符串。该方法需要使用 mut 关键字修饰,接收两个参数,第一个参数是要替换字符串的范围(Range),第二个参数是新的字符串

fn main() {
    let mut string_replace_range = String::from("I like rust!");
    string_replace_range.replace_range(7..8, "R");
    dbg!(string_replace_range);
}

删除:pop()remove()truncate()clear()仅适用于String类型

pop —— 删除并返回字符串的最后一个字符,直接操作原来的字符串 remove —— 删除并返回字符串中指定位置的字符,直接操作原来的字符串,使用remove(索引值) truncate —— 删除字符串中从指定位置开始到结尾的全部字符,直接操作原来的字符串。无返回值,也是用索引 clear —— 清空字符串,直接操作原来的字符串

trim():删除字符串首位空白字符,返回一个新字符串&str类型

字符串连接

使用+链接但是 + 右边的参数必须为&str类型!

+ 是返回一个新的字符串String类,所以变量声明可以不需要 mut 关键字修饰

使用format!(返回值为String类型)连接与print!格式相似