我正在尝试实现自定义集。可以毫无问题地进行编译:
struct CustomSet {}
impl CustomSet {
pub fn new() -> CustomSet {
CustomSet {}
}
}
当我尝试将单元类型(空元组)添加到
CustomSet
类型时,它将无法编译。struct CustomSet<()> {}
impl CustomSet<()> {
pub fn new() -> CustomSet<()> {
CustomSet {}
}
}
以下错误
error: expected one of `>`, identifier, or lifetime, found `(`
--> src/lib.rs:1:18
|
1 | struct CustomSet<()> {}
| ^ expected one of `>`, identifier, or lifetime here
如何返回单位数据类型的结构?我做错什么了?
最佳答案
在这种情况下,您必须使用 PhantomData
use std::marker::PhantomData;
struct CustomSet<T> {
_phantom: PhantomData<T>,
}
impl CustomSet<()> {
pub fn new() -> CustomSet<()> {
CustomSet {
_phantom: PhantomData,
}
}
}
PhantomData“通知”编译器使用了
T
参数,因此它将不再对此提示。请注意,尽管您在结构中添加了一个成员,但它不会再占用任何大小。
fn main() {
println!("{}", std::mem::size_of::<CustomSet<()>>()); // 0
println!("{}", std::mem::size_of::<CustomSet<u32>>()); // 0
}