我正在尝试实现自定义集。可以毫无问题地进行编译:

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
}

10-08 14:34