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

260 天前
 bli22ard

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

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

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

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

AsRef 和 AsMut 可没有这个待遇。
并且,其实 AsRef 和 AsMut 更符合设计用途的用法是类似于 OO 里面的子类隐式向父类引用转换。
而 Borrow 和 BorrowMut 在理解了 “有所有权” 和 “有使用权” 的细微差异后就会发现真的很有用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1024819

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX