Rust 的智能指针太反人类的! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaopanzi
V2EX    Rust

Rust 的智能指针太反人类的!

  •  
  •   xiaopanzi 2020-06-12 21:01:32 +08:00 5084 次点击
    这是一个创建于 2015 天前的主题,其中的信息可能已经有所发展或是发生改变。

    吐个槽:这是第 3 次学习 Rust 。之前都是到了智能指针那里停住了,这次又是遇到智能指针有点晕乎乎的。是它设计得太反人类,还是我太蠢了?

    放一段让我今晚缺氧的代码:

    pub fn peek_front(&self) -> Option<Ref<T>> { self.head.as_ref().map(|node| { Ref::map(node.borrow(), |node| &node.elem) }) } 

    来自Too Many Lists

    6 条回复    2020-06-16 11:53:10 +08:00
    lance6716
        1
    lance6716  
       2020-06-12 21:45:03 +08:00 via Android
    rust 写链表还是到处 Copy 算了
    billlee
        2
    billlee  
       2020-06-12 21:46:00 +08:00
    n 层嵌套的函数式代码,大概你需要一个有类型提示的 IDE?
    xiaopanzi
        3
    xiaopanzi  
    OP
       2020-06-12 22:08:08 +08:00
    @billlee 倒不是类型提示的问题。vscode 里面添加插件后就能显示类似。主要让我难受的地方是,我就想 peek 一下,竟然不能返回&,非得借助 Ref,把人搞晕了。如果从其他语言转过来,完整实现 doube linked list 的话,难度不小。
    lance6716
        4
    lance6716  
       2020-06-13 11:25:45 +08:00
    @xiaopanzi 这个博客挺有风趣的,而且讲的很详细,感谢分享
    fakeshadow
        5
    fakeshadow  
       2020-06-14 13:54:04 +08:00
    RefCell 的安全就是靠这个来保证的。Ref 里包了个引用计数,当 Ref 销毁的时候会通知 RefCell 引用-1 。所以你的引用不能比 Ref 命还长。
    我倒是觉得这类 Rust 教程的问题在于刻意回避 unsafe 的应用,链表这类问题用 unsafe 和裸指针会容易许多。
    sssooonnnggg
        6
    sssooonnnggg  
       2020-06-16 11:53:10 +08:00
    这种情况一般就用 unsafe 直接操作指针了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     982 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 22:45 PVG 06:45 LAX 14:45 JFK 17:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86