陈天 · Rust 编程第一课
陈天
Tubi TV 研发副总裁
新⼈⾸单¥59
2892 人已学习
课程目录
已更新 14 讲 / 共 41 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|让Rust成为你的下一门主力语言
免费
前置篇 (3讲)
01|内存:值放堆上还是放栈上,这是一个问题
02|串讲:编程开发中,那些你需要掌握的基本概念
加餐| Rust真的值得我们花时间学习么?
基础篇 (10讲)
03|初窥门径:从你的第一个Rust程序开始!
04|get hands dirty:来写个实用的CLI小工具
05|get hands dirty:做一个图片服务器有多难?
06|get hands dirty:SQL查询工具怎么一鱼多吃?
07|所有权:值的生杀大权到底在谁手上?
08|所有权:值的借用是如何工作的?
09|所有权:一个值可以有多个所有者么?
10|生命周期:你创建的值究竟能活多久?
11|内存管理:从创建到消亡,值都经历了什么?
加餐|愚昧之巅:你的Rust学习常见问题汇总
陈天 · Rust 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

加餐|愚昧之巅:你的Rust学习常见问题汇总

你好,我是陈天。
到目前为止,我们已经学了很多 Rust 的知识,比如基本语法、内存管理、所有权、生命周期等,也展示了三个非常有代表性的示例项目,让你了解接近真实应用环境的 Rust 代码是什么样的。
虽然学了这么多东西,你是不是还是有种“一学就会,一写就废”的感觉?别着急,饭要一口一口吃,任何新知识的学习都不是一蹴而就的,我们让子弹先飞一会。你也可以鼓励一下自己,已经完成了这么多次打卡,继续坚持。
在今天这个加餐里我们就休个小假,调整一下学习节奏,来聊一聊 Rust 开发中的常见问题,希望可以解决你的一些困惑。

所有权问题

Q:如果我想创建双向链表,该怎么处理?
Rust 标准库有 LinkedList,它是一个双向链表的实现。但是当你需要使用链表的时候,可以先考虑一下,同样的需求是否可以用列表 Vec<T>、循环缓冲区 VecDeque<T> 来实现。因为,链表对缓存非常不友好,性能会差很多。
如果你只是好奇如何实现双向链表,那么可以用之前讲的 Rc / RefCell (第 9 讲)来实现。对于链表的 next 指针,你可以用 Rc;对于 prev 指针,可以用 Weak
Weak 相当于一个弱化版本的 Rc,不参与到引用计数的计算中,而 Weak 可以 upgrade 到 Rc 来使用。如果你用过其它语言的引用计数数据结构,你应该对 Weak 不陌生,它可以帮我们打破循环引用。感兴趣的同学可以自己试着实现一下,然后对照这个参考实现
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/1000字
划线
笔记
复制
该试读文章来自付费专栏《陈天 · Rust 编程第一课》,如需阅读全部文章,
请订阅文章所属专栏新⼈⾸单¥59
立即订阅
登录 后留言

精选留言(7)

  • lisiur
    第一个,没有标注生命周期,但即使标注也不对,因为返回值引用了本地已经 drop 的 String,会造成悬垂指针问题;

    第二个,和第一个类似,因为参数是具有所有权的 String,该 String 会在函数执行完后被 drop,返回值不能引用该 String;

    第三个,因为 Chars 的完整定义是 Chars<'a>,根据生命周期标注规则,Chars 内部的引用的生命周期和参数 name 一致,所以不会产生问题。

    作者回复: 非常棒!

    2021-09-17
    1
  • 罗杰
    比较简单的问题,第一个 name 在函数里面创建的 String,函数返回时就释放掉了,这是最直白的悬垂引用。第二个 name 是从调用者 move 过来的 String,进入该函数,所有权就归函数了,返回时 name 也将被释放。第三个 name 不用加生命周期标注可以正常工作,参数是引用,返回的数据与该参数的生命周期相同,没有问题,可以编译通过。

    作者回复: 非常棒!

    2021-09-17
  • Hurt
    打卡 真的是愚昧之巅了 需要重头再来了

    作者回复: 加油!

    2021-09-17
  • 25ma
    1.返回是一个&str,但是name的生命周期在函数执行结束就已经drop掉了,所以会造成悬垂指针的问题
    2.同样也是犯规,一个&str,不同的地方是当name这个不可变变量传递进函数lifttime2的时候已经将值move,然而这时再返回一个&str,同样也会造成悬垂指针的问题

    作者回复: 对!

    2021-09-17
  • Do
    太慢了

    编辑回复: 啥太慢了,更新速度嘛?现在专栏都是一周更新三篇,因为也要考虑到老师高质量输出的频率和大家学习的频率。如果觉得慢,说明你的的Rust进度非常不错,学有余力嘛,推荐配套第一篇加餐里的资料来学习噢💪

    2021-09-17
  • hughieyu
    1. name drop了
    2. name drop了
    3. name的内存数据拷贝并转换到了一个新的拥有所有权的对象中

    作者回复: 对!

    2021-09-17
  • gnu
    lifetime1:
    返回的引用是在 lifetime1 里被分配,lifetime1 结束后引用就被回收,所以错误。
    改为转成 string 后返回。
    ```
    fn lifetime1() -> String {
        let name = "Tyr".to_string();
        name[1..].to_string()
    }
    ```


    lifetime2:
    函数参数是 String,编译器无法通过参数确定返回值 &str 的生命周期。
    修改为
    ```
    fn lifetime2(name: &String) -> &str {
        &name[1..]
    }
    ```

    lifetime3:
    返回 Chars 类型的生命周期与参数 name 关联,所以正确。

    作者回复: 非常棒!修改得也很棒!

    2021-09-17
收起评论
7
返回
顶部