Rust 学习笔记

Rust - ownership - reference

2020-01-18  本文已影响0人  国服最坑开发

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

对于第一条规则的使用, 我们发现体验极其不佳,而且还有很多冗余代码产生.
于是, 自然的就产生 "引用传递" 的做法, 也就是, 把地址传进去, 可以修改信息,
而且外部 还可以继续读写.

fn main() {
    let a = String::from("hello");
    let len = do_something(&a);
    println!("{} {}", a, len);
}

fn do_something(s: &String) -> usize {
    s.len()
}
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
}

上一篇 下一篇

猜你喜欢

热点阅读