0x01 ownership
rust中,调用方法时,把参数传递给方法, 会引发ownership切换,
除了四种基础类型都是值拷贝以外, 其他的复杂对象都类似于指针传递,
要注意的是, 这个"指针"进入方法后, 外面的"指针"就不可以再进行读写了.
那么如何才能使用呢?
只要在方法的最后, 再把这个"指针"return 回来就可以了.
好处 就是一个对象同时, 只有一个代码可以修改其内容.
不好的地方 就是, "真j麻烦"
fn main() {
let s = String::from("hello");
let t = takes_ownership(s);
println!("{}", t);
}
fn takes_ownership(some_string: String) -> String {
println!("{}", some_string);
some_string
}
0x02 reference and borrowing
对于第一条规则的使用, 我们发现体验极其不佳,而且还有很多冗余代码产生.
于是, 自然的就产生 "引用传递" 的做法, 也就是, 把地址传进去, 可以修改信息,
而且外部 还可以继续读写.
- read in and out of method
fn main() {
let a = String::from("hello");
let len = do_something(&a);
println!("{} {}", a, len);
}
fn do_something(s: &String) -> usize {
s.len()
}
- append string in sub method
fn main() {
let mut cache: String = String::from("hello");
add(&mut cache, &String::from(" world"));
println!("{}", cache);
}
fn add(c: &mut String, t: &String) {
c.push_str(t);
}
0x03 Dangling reference
这里要说明的一种场景: 如何从方法返回一个对象 ,
答案是 直接把对象返回出来, 鉴于第一条原则, 这个方法的onwership就移交到外层方法了.
fn main() {
let rf = dangle();
println!("{}", rf);
}
fn dangle() -> String {
let s = String::from("hello");
s
}
网友评论