gpt4 book ai didi

generics - 如何返回具有单位数据类型的结构?

转载 作者:行者123 更新时间:2023-11-29 08:10:05 25 4
gpt4 key购买 nike

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

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

如何返回具有单位数据类型的结构?我做错了什么?

最佳答案

类型CustomSet<()>只有 CustomSet 才有意义是用类型参数定义的。类型参数是一个变量,而不是另一种类型,因此您的定义实际上没有意义。相反,你需要用一个变量来定义它:

struct CustomSet<T> {}

这意味着CustomSet为任何可能的类型定义 T (注意类型必须是 Sized ,这对大多数类型都是正确的)。

现在,上面的定义将无法正常工作,因为 Rust 会提示您没有使用变量 T在类型里面。您不使用的变量有什么意义?

作为hellow said , 你可以使用 PhantomData ,但这更像是一种解决方法,适用于当您需要变量但由于某种原因实际上不需要使用它时。由于您正在实现一个集合,因此您需要使用 T为了在某​​处存储值:

struct CustomSet<T> {
data: Vec<T>,
}

这种类型的行为仍然可以所有可能实现T ,不只是 () ,为您提供大量代码重用:

impl<T> CustomSet<T> {
pub fn new() -> CustomSet<T> {
CustomSet {
data: Vec::new(),
}
}
}

只有在实际使用类型时才需要约束T完全:

let my_set: CustomSet<()> = CustomSet::new();

甚至在实际程序中通常也不需要该类型注释,因为它可以从用法中推断出来。例如,如果您提供了 insert CustomSet 的方法,你可以这样使用它:

// type annotation not needed because it will be inferred from the next line
let mut my_set = CustomSet::new();
my_set.insert(());

关于generics - 如何返回具有单位数据类型的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52001160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com