首页 > 解决方案 > 如何在结构上存储元数据?

问题描述

Rust 有没有办法在不更改其字段的情况下存储结构的元数据?

我想编写一个库,它使用宏来存储有关可以在运行时写入的结构的元数据。

特征允许我定义访问器函数,但我认为它们不会让我存储状态?

我想存储每个结构实例的状态。

在 JS 中,我可能会将此状态存储在闭包中或使用 Wea​​kMap(因此元数据附加到对象但不会更改其键)。

我认为这样做的唯一方法是将结构包装在另一个 MetaData 结构中,但我更喜欢只传递原始结构并使用特征方法来读取/写入数据。

谢谢。

标签: rust

解决方案


Rust 有没有办法在不更改其字段的情况下存储结构的元数据?

不是真的,说实话。除非结构总是存储在RcorArc之后,否则我猜你可以创建一个以弱指针为键的映射,你可以通过删除强指针已死的弱指针来定期获取它,类似于this example的内容。

在 JS 中,我可能会将此状态存储在闭包中或使用 Wea​​kMap(因此元数据附加到对象但不会更改其键)。

如果您Pin在内存中构建结构(并将元数据与结构的内存位置相关联),您可以按照这些方式做一些事情,但是与适当的弱映射不同,内存几乎会被泄漏,因为您无法收到通知被销毁的对象(据我所知,与 C++ Rust 不同,Rust 不提供自定义 drop inBox或 in Pin)。

堆分配也有非常不安全的技巧,在这些技巧中,您分配的数量超过了要求,并在返回指针之前存储元数据(以及要求您在之后分配的东西)。我知道它在 C 中有些常见(例如,这就是 antirez' SDS 如何提供更安全的 C 兼容字符串,长度字段存储在字符串缓冲区旁边但在指针位置之前),但我不知道是否有任何 Rust 包处理那个。


推荐阅读