rust 笔记

# Stringvs&Stringvs&str

互相转换:

# iter()vsiter_mut()vsinto_iter()

let v = vec!(47);
for i in v.iter() {
	assert_eq!(i, &47);
}

let mut v = vec!(47);
for i in v.iter_mut() {
	*i = 48;
	assert_eq!(i, &48);
}

let v = vec!(47);
for mut i in v.into_iter() {
	i += 1;
	assert_eq!(i, 48);
}

# clone()vsto_owned()

参考资料: In Rust, what is the difference between clone() and to_owned()?

# AsRefvsAsMut

参考资料: https://wiki.jikexueyuan.com/project/rust-primer/intoborrow/asref.html

共同点:二者都是Trait

区别:

fn is_hello<T: AsRef<str>>(s: T) {
	assert_eq!("hello", s);
}

let s = "hello";
is_hello(s);

let s2 = "hello".to_string();
is_hello(s2);

# &&&&&&str.len()

这个表达式之所以能调用,是因为rust的自动解引用特性:解引用 函数使用引用参数时,参数不会发生move的, 因为引用会自动按位复制给函数使用

# 指针

# 常见智能指针

默认情况下分配内存都是在栈中,Box 可以将值放置在堆中,然后在栈中留下一个指向堆的引用(引用所占用的内存是大小固定的)

通常一个值只能由一个变量所有,使用 Rc 可以让一个值被多个变量所有,内被是计数引用的形式来记录被多少个变量拥有,当计数为 0 的时候会自动释放内存

Rc 只能用于单线程,不能用于多线程

跨线程安全的计数引用,可以用于多线程,除此之外和Rc<T>是一样的

用于对象实现内部可变性,对象不可变,但是里面的内容是可变的

Rust 的包装类型

# match 的引用

Rust的pattern match

Rust中match随处可见,但是其中有一些细节值得注意:被match的对象可以是值也可以是引用,pattern可以是值也可以是引用,这就有4种组合,各自是什么行为呢?

# & vs ref

作用是基本一样的,只是使用的地方不一样

rust 的引用与借用