gpt4 book ai didi

rust - 只有当 impl 标记为 `default` 时关联类型和类型参数不匹配

转载 作者:行者123 更新时间:2023-11-29 07:46:48 24 4
gpt4 key购买 nike

以下代码会导致错误 ( Playground )

#![feature(specialization)]

trait Foo {
type Assoc;
fn foo(&self) -> &Self::Assoc;
}

default impl<T> Foo for T {
type Assoc = T;
fn foo(&self) -> &Self::Assoc {
self
}
}

错误:

error[E0308]: mismatched types
--> src/main.rs:20:9
|
20 | self
| ^^^^ expected associated type, found type parameter
|
= note: expected type `&<T as Foo>::Assoc`
found type `&T`

这很奇怪,因为 <T as Foo>::Assoc T ,所以它应该工作。甚至更陌生:当我删除 default 时来自 impl 的关键字,它有效(但当然,在我的真实代码中,我需要将 impl 标记为 default )。

在特征定义(Playground)中提供默认值时会发生同样的错误:

#![feature(specialization)]
#![feature(associated_type_defaults)]

trait Foo {
type Assoc = Self;
fn foo(&self) -> &Self::Assoc {
self
}
}

这是怎么回事?这是编译器错误吗?或者——这就是我问这个问题的原因——这个错误是否有意义,因为我还没有理解特化的一些特殊之处?如果这是一个错误,mem::transmute肯定安全,riiiight?

最佳答案

特化 功能没有显示出稳定的迹象,主要是因为 soundness concerns , 所以你应该预料到一些问题。

你有这个:

#![feature(specialization)]

trait Foo {
type Assoc;
fn foo(&self) -> &Self::Assoc;
}

default impl<T> Foo for T {
type Assoc = T;
fn foo(&self) -> &Self::Assoc {
self
}
}

但想象一下,您添加了另一个具有自己关联类型但没有实现 foo 的实现。此实现的 foo 将从其他不太具体的实现“继承”:

impl<T: SomeConstraint> Foo for T {
type Assoc = NotT;
}

那就麻烦了。您的 foo 将返回一个 T 但是,只要 T 是 SomeConstraint 就会出现类型不匹配,因为它应该返回一个 不是

RFC 2532 — associated type defaults在其 Future Work section 中提到了一个可能的解决方案.假设的 default block 可用于指示关联的类型和方法需要一起专门化。但是,没有迹象表明何时会考虑包含这样的功能。

关于rust - 只有当 impl 标记为 `default` 时关联类型和类型参数不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51022636/

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