在 Rust 中,我想使用幻像类型来正确键入一个简单的 id:
struct Id<T> {
val: u32,
_type: PhantomData<T>,
}
在第一个草稿版本中,我使用了具体的结构T
,一切都很好。然后在使用不同数据源的更精细的版本中,这些结构变成了特征。比方说:
trait MyArticle {
fn get_id() -> Id<MyArticle>;
}
但是使用traits作为幻像类型会带来问题:
- 编译器让我声明
T: ?Sized
,好像T
是可能需要的大小。我可以忍受,但由于目的PhantomData<T>
是告诉它T
不会被使用,我想知道是否还有其他方法? - 我收到警告:“不推荐使用没有明确 'dyn' 的特征对象”。我可以用 global 摆脱它
#![allow(bare_trait_objects)]
,但是这个警告在其他方面很有用,我不想这样做。有没有办法bare_trait_object
只允许“当用作”的类型参数时Id<T>
?
我当前的解决方案是在空结构和特征之间复制名称类型:
struct MyArticle_ {};
trait MyArticle {
fn get_id() -> Id<MyArticle_>;
}
这很尴尬,但我找不到更好的。