美文网首页Rust 学习笔记
Rust - ownership - reference

Rust - ownership - reference

作者: 国服最坑开发 | 来源:发表于2020-01-18 17:37 被阅读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

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

    • 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
    }
    
    

    相关文章

      网友评论

        本文标题:Rust - ownership - reference

        本文链接:https://www.haomeiwen.com/subject/nfakzctx.html