rust - 如何在结构上存储元数据?
问题描述
Rust 有没有办法在不更改其字段的情况下存储结构的元数据?
我想编写一个库,它使用宏来存储有关可以在运行时写入的结构的元数据。
特征允许我定义访问器函数,但我认为它们不会让我存储状态?
我想存储每个结构实例的状态。
在 JS 中,我可能会将此状态存储在闭包中或使用 WeakMap(因此元数据附加到对象但不会更改其键)。
我认为这样做的唯一方法是将结构包装在另一个 MetaData 结构中,但我更喜欢只传递原始结构并使用特征方法来读取/写入数据。
谢谢。
解决方案
Rust 有没有办法在不更改其字段的情况下存储结构的元数据?
不是真的,说实话。除非结构总是存储在Rc
orArc
之后,否则我猜你可以创建一个以弱指针为键的映射,你可以通过删除强指针已死的弱指针来定期获取它,类似于this example的内容。
在 JS 中,我可能会将此状态存储在闭包中或使用 WeakMap(因此元数据附加到对象但不会更改其键)。
如果您Pin
在内存中构建结构(并将元数据与结构的内存位置相关联),您可以按照这些方式做一些事情,但是与适当的弱映射不同,内存几乎会被泄漏,因为您无法收到通知被销毁的对象(据我所知,与 C++ Rust 不同,Rust 不提供自定义 drop inBox
或 in Pin
)。
堆分配也有非常不安全的技巧,在这些技巧中,您分配的数量超过了要求,并在返回指针之前存储元数据(以及要求您在之后分配的东西)。我知道它在 C 中有些常见(例如,这就是 antirez' SDS 如何提供更安全的 C 兼容字符串,长度字段存储在字符串缓冲区旁边但在指针位置之前),但我不知道是否有任何 Rust 包处理那个。
推荐阅读
- makefile - Makefile.am 创建一个空的 D 库
- docker - 无法从 Jenkins 登录私有 Docker 注册表
- docker - 如何配置 docker 容器代理?
- python - 为模型中的每个条目创建一个表
- python - 从 pandas 数据框中获取值,拆分列表
- reactjs - 我应该在我的应用程序中使用的所有状态都使用 redux 吗?或者我有时必须与 setState 一起去?
- mongodb - $lookup 无法在 mongodb 中显示非相关记录
- java - 手机进入睡眠状态约 20 秒后,我的 MediaPlayer 停止播放
- autodesk-forge - 是否可以使用 API 删除或覆盖 BIM360 Docs 中的文档?
- android-fragments - 从 Adapter 向 Fragment 发送数据并在 Fragment 中获取