V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
v2defy
V2EX  ›  程序员

rust 里 unwrap 用起来真方便,但如果不用 unwrap

  •  
  •   v2defy · 2022-10-28 11:28:10 +08:00 · 3237 次点击
    这是一个创建于 790 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果不用 unwrap, 就需要 if let 判断是不是个正常值, 感觉和 go 的 if err != nil 区别不大了就.

    虽然可以使用 ? 把错误抛往上层, 但一直往上抛也不是办法, 总要找个恰当的时机把它判断处理了.

    unwrap 真的方便, 但是会导致程序退出, 你们写 rust 的时候什么使用用 unwrap, 什么时候不用呢?

    23 条回复    2022-10-28 19:23:26 +08:00
    fengjianxinghun
        1
    fengjianxinghun  
       2022-10-28 11:32:11 +08:00
    这么多东西可以处理。。。
    ?
    ok_or
    unwrap_or_*
    and_then
    BBCCBB
        2
    BBCCBB  
       2022-10-28 11:32:53 +08:00
    unwrap 只有在确定没问题的时候才能用吧.
    不想每个都处理, 就用?抛到外面, 总有个地方要处理..

    但 Error 类型不同的时候也比较麻烦, 虽然可以通过 From 来处理, 但还是麻烦. 优点就是性能好, 比 go 的 if err!=nil 高明些..
    BBCCBB
        3
    BBCCBB  
       2022-10-28 11:33:41 +08:00
    要说方便, 还得是 try catch.
    alexsunxl
        4
    alexsunxl  
       2022-10-28 12:08:24 +08:00
    .map_err()?
    map_err 关键错误加点 log ,处理还是抛给上层。我是专门有一层有一块专门处理 error 的,还有分发逻辑的 dispatch handler 之类的概念。
    测试代码就直接抛到 main 。
    Kasumi20
        5
    Kasumi20  
       2022-10-28 12:24:31 +08:00
    如果 try catch 方便的话,Kotlin 为什么不保留
    learningman
        6
    learningman  
       2022-10-28 12:26:44 +08:00
    @Kasumi20 #5 kt 有 try catch 啊
    Jwyt
        7
    Jwyt  
       2022-10-28 12:35:09 +08:00
    这么多组合器你都没用过?
    map_or*
    ok_or*
    unwrap_or*
    and*
    还有 matches!宏,比 try-catch 方便多了
    LaTero
        8
    LaTero  
       2022-10-28 12:40:58 +08:00 via Android
    能确保不会忘记,用一个'?'就能向上 propagate 很方便,而且一般都是用楼上说的 ok_or*之类的吧,需要 if let 的情况很少。
    @BBCCBB 我就很讨厌 try catch ,经常忘记,而且长。有的语言看字典里有没有这个键都要 try catch 搞个 5 行出来。
    TWorldIsNButThis
        9
    TWorldIsNButThis  
       2022-10-28 12:44:44 +08:00 via iPhone
    根据业务,如果无法处理就爆掉啊
    比如业务上一定会有的数据但是数据库里数据缺失了
    不 panic 还能干嘛
    BBCCBB
        10
    BBCCBB  
       2022-10-28 13:00:49 +08:00
    @LaTero c#这种不是强制性捕获异常的会忘记, 但强制性捕获的就不会. k in dict 这个你说的是哪个语言?
    LaTero
        11
    LaTero  
       2022-10-28 13:12:12 +08:00 via Android
    @BBCCBB 好像是 python (我可以肯定是个动态语言)的一个解析某种格式的文件的库。我记得自己之前写的一个小脚本,只能自己写个函数 try catch 判断有没有这个 key 。如果是像 rust 这样就方便多了。
    LaTero
        12
    LaTero  
       2022-10-28 13:15:20 +08:00 via Android
    @BBCCBB 好像是切换代理的脚本,那个库是解析机场订阅的
    v2defy
        13
    v2defy  
    OP
       2022-10-28 13:17:07 +08:00
    @Jwyt 请问这些你们是怎样从哪学到的呢? 翻文档吗? the book 里没讲这些
    BBCCBB
        14
    BBCCBB  
       2022-10-28 13:17:33 +08:00
    @LaTero 哈哈, 可能是对 python 的写法不熟悉, 他有 key in dict 的判断方法,
    LaTero
        15
    LaTero  
       2022-10-28 13:19:48 +08:00 via Android
    @BBCCBB 它应该不是 python 的 dict ,是一个自定义的类。不过也是很久以前写的了,可能确实是我刚学太菜。
    kujio
        16
    kujio  
       2022-10-28 13:29:54 +08:00


    kotlin 写法,,受 rust 启发。
    Jwyt
        17
    Jwyt  
       2022-10-28 13:37:22 +08:00
    @v2defy 我也是后来自己搜的;在 option 和 result 后面打上点,vscode 给出很多方法提示,之后自己搜才知道这些
    lmshl
        18
    lmshl  
       2022-10-28 13:41:47 +08:00   ❤️ 2
    Either(Result) Monad 的最佳用法是 Railway Oriented Programming
    https://fsharpforfunandprofit.com/rop/
    理论基础都在函数式编程里😏

    steins2628
        19
    steins2628  
       2022-10-28 13:44:09 +08:00
    默默学习
    DeWjjj
        20
    DeWjjj  
       2022-10-28 13:47:06 +08:00 via iPhone
    一律都外部处理,函数就是个黑箱。
    哪有在黑箱里面做判断的,那就变成两层黑箱了。
    而且拿到数据,或者报错处理肯定都建议在函数体外做。一个成熟的函数肯定要重复利用,就会导致 result 类枚举里面夹的也是多种类型。
    seansong
        21
    seansong  
       2022-10-28 16:38:13 +08:00
    unwrap 是你接触的第一个异常处理方式

    除非你确认结果一定不会异常,或者这个异常完全没有捕获并恢复的必要,可以考虑用 unwrap

    if let 相当于只是 match 的语法糖,大部分时候,还是得用 match 来处理
    skies457
        22
    skies457  
       2022-10-28 17:12:47 +08:00
    andyJado
        23
    andyJado  
       2022-10-28 19:23:26 +08:00
    切肤体会最贴心的是 expect

    程序读起来像是在许愿.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5711 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:35 · PVG 14:35 · LAX 22:35 · JFK 01:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.