V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bli22ard
V2EX  ›  Rust

rust 中的 pub trait Borrow<Borrowed: ?Sized>是什么意思,什么情况下使用

  •  
  •   bli22ard · 248 天前 · 1292 次点击
    这是一个创建于 248 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT
    还有一些,比如 AsRef 这些在什么情况下使用

    7 条回复    2024-03-21 14:43:05 +08:00
    Binwalker
        1
    Binwalker  
       248 天前
    看标准库,已经说得很清楚了
    Borrow: https://rustwiki.org/zh-CN/std/borrow/trait.Borrow.html
    AsRef 等一系列用于类型转换的: https://rustwiki.org/zh-CN/std/convert/index.html
    PTLin
        2
    PTLin  
       247 天前
    我感觉,Borrow 就作为泛型 map key 的时候才能用上,自己写函数的话这种场景也少。
    AsRef 也就会作为文件路径参数里会出现,例如,p: impl AsRef<Path>。
    nebkad
        3
    nebkad  
       246 天前
    譬如说,我要实现一个 RingBuffer ,可以 RingBuffer 自己分配 buffer 的内存,也可以接受外部输入的 buffer 。
    我们可以发现,无论自己分配还是外部输入,RingBuffer 的大部分功能代码都是一样的,不太可能为此写两种不同的 RingBuffer 。那么,RingBuffer 就可以这么定义:

    ```Rust
    pub struct RingBuffer<B: BorrowMut<[u8]>>(B);
    ```
    bli22ard
        4
    bli22ard  
    OP
       245 天前
    @nebkad 这两天看了一下,有点理解 AsRef 了,那 pub struct RingBuffer<B: AsRef<[u8]>>(B); 应该也可以。这样 Borrow 存在的意义感觉又小了
    nebkad
        5
    nebkad  
       245 天前
    @bli22ard #4 你会这么想是不是因为你没有注意到 这段代码
    https://doc.rust-lang.org/src/core/borrow.rs.html#208-241

    不可能有别的代码能替代这段标准库里的效果
    bli22ard
        6
    bli22ard  
    OP
       245 天前
    @nebkad 意思是这些提供了 引用的基础?
    nebkad
        7
    nebkad  
       245 天前
    @bli22ard #6
    标准库里为所有 T &T &mut T [自] [动] [地] 实现了 Borrow 和 BorrowMut 。
    你不妨试试“自动地”实现一个 trait 在某个 feature 没有 stable 之前是不是允许的。

    AsRef 和 AsMut 可没有这个待遇。
    并且,其实 AsRef 和 AsMut 更符合设计用途的用法是类似于 OO 里面的子类隐式向父类引用转换。
    而 Borrow 和 BorrowMut 在理解了 “有所有权” 和 “有使用权” 的细微差异后就会发现真的很有用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3395 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:28 · PVG 19:28 · LAX 03:28 · JFK 06:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.