下面的代码只有在我包含标有"?"的行时才能编译.如果我删除该行,我会收到很多关于参数"S"从未使用过的错误信息.我在一个更大的场景中偶然发现了这个"问题",并很难把它固定下来.据我所知,这是由于类型之间的循环引用造成的.

struct Question<S> {
    x: Vec<AnswerRef<S>>,
    _y: PhantomData<S>  // ???
}

struct QuestionRef<S>(Rc<Question<S>>);

struct Answer<S> {
    x: Option<QuestionRef<S>>
}

struct AnswerRef<S>(Rc<Answer<S>>);

PhantomData加起来就解决了问题,但我不明白为什么.我不明白在这种情况下这有什么不同.有人能给我解释一下吗?

推荐答案

Rust编译器在这里非常聪明,它检测S的循环使用,并确定可以完全删除它以获得相同的数据 struct .您可以使用PhantomData来"使用"在其他情况下未使用的类型参数.

Rust相关问答推荐

什么是谓词的简短和简洁类型

使用元组执行条件分支的正确方法

什么时候铁 rust FFI边界上的panic 是未定义的行为?

捕获FnMut闭包的时间不够长

使用极点数据帧时,找不到枚举结果的方法lazy()

如何模拟/创建ReqData以测试Actix Web请求处理程序?

我可以在不收集或克隆的情况下,将一个带有Item=(key,val)的迭代器拆分成单独的key iter和val iter吗?

不同类型泛型的映射

如何实现Deref;多次;?

为什么在 Allocator API 中 allocate() 使用 `[u8]` 而 deallocate 使用 `u8` ?

具有多个键的 HashMap

Rust编译器通过哪些规则来确保锁被释放?

如何刷新 TcpStream

使用自定义 struct 收集 Vec

哪些特征通过 `Deref` 而哪些不通过?

从现有系列和 map 值创建新系列

预期的整数,找到 `&{integer}`

为实现特征的所有类型实现显示

以下打印数组每个元素的 Rust 代码有什么问题?

在 Rust 中有条件地导入?