继续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!格式相似