资源:内存区块。不同的内存区块位置和大小就是不同的资源。
str
let a = "xxx".to_string();
含义:a绑定到字符串资源A上,拥有资源A的所有权
let mut a = "xxx".to_string();
含义:a绑定到字符串资源A上,拥有资源A的所有权,同时a还可绑定到新的资源上面去(更新绑定的能力,但新旧资源类型要同);
value
let b = a;
含义:a绑定的资源A转移给b,b拥有这个资源A
let b = &a;
含义:a绑定的资源A借给b使用,b只有资源A的读权限
let b = &mut a;
含义:a绑定的资源A借给b使用,b有资源A的读写权限
let mut b = &mut a;
含义:a绑定的资源A借给b使用,b有资源A的读写权限。同时,b可绑定到新的资源上面去(更新绑定的能力)
String
fn do(c: String) {}
含义:传参的时候,实参d绑定的资源D的所有权转移给c
fn do(c: &String) {}
含义:传参的时候,实参d将绑定的资源D借给c使用,c对资源D只读
fn do(c: &mut String) {}
含义:传参的时候,实参d将绑定的资源D借给c使用,c对资源D可读写
fn do(mut c: &mut String) {}
含义:传参的时候,实参d将绑定的资源D借给c使用,c对资源D可读写。同时,c可绑定到新的资源上面去(更新绑定的能力)
函数参数里面,冒号左边的部分,mut c,这个mut是对函数体内部有效;冒号右边的部分,&mut String,这个 &mut 是针对外部实参传入时的形式化(类型)说明。
下面的例子输出是什么:
fn concat_literal(s: &mut String) { s.extend("world!".chars()); } fn main() { let mut s = "hello, ".to_owned(); concat_literal(&mut s); println!("{}", s); }