在实现具有关联类型的关联常量时,Rust为什么希望调整Self的大小?
考虑以下代码:在实现具有关联类型的关联常量时,Rust为什么希望调整Self的大小?,rust,Rust,考虑以下代码: pub trait Trait { type Type; const CONST: Self::Type; } impl<T> Trait for T { type Type = u8; const CONST: u8 = 42; } 我的问题是: 为什么Rust认为T的大小不在这里 让我们假设T没有大小。为什么Rust会在意T是否在此处调整尺寸?据我所知,没有什么依赖于它(关联的类型和常量与t无关)。将代码更改为T:?Sized有效,因此显然T
pub trait Trait {
type Type;
const CONST: Self::Type;
}
impl<T> Trait for T {
type Type = u8;
const CONST: u8 = 42;
}
我的问题是:
- 为什么Rust认为
的大小不在这里李>T
- 让我们假设
没有T
。为什么Rust会在意大小
是否在此处调整尺寸?据我所知,没有什么依赖于它(关联的类型和常量与T
无关)。将代码更改为t
有效,因此显然T:?Sized
未调整大小实际上没有问题T
const VAL:Self::T=5
强制Rust在编译时执行一些奇特的计算类型,以便进行类型检查,但是这种计算的代码中有一个bug
有几种方法可以解决这个问题:
pub trait Trait {
// type Type; // no longer used
const CONST: u8;
}
T
超出大小:
impl<T: ?Sized> Trait for T {
type Type = u8;
const CONST: u8 = 42;
}
T的impl特征{
类型=u8;
常数:u8=42;
}
pub特征{
类型;
fn const_val()->Self::Type;
}
T的内隐性状{
类型=u8;
fn const_val()->Self::Type{42}
}
这似乎是一个错误。它有一个对应的属性。你是想为T编写
impl Trait吗?(这并不能解决问题,但更符合您的问题描述)@Timt:Sized
是多余的:。@kazemakase:谢谢!如果你把它作为一个答案,我会接受的。@cornstales“这是一只虫子”很难成为一个好答案。。。但显然这是唯一的解决办法:(作为一种解决办法,你不能只在trait中使用函数而不是常量吗?
?它应该内联到同一个东西上。@PeterHall你当然是对的。谢谢你指出这个疏忽。
pub trait Trait {
type Type;
fn const_val() -> Self::Type;
}
impl<T> Trait for T {
type Type = u8;
fn const_val() -> Self::Type { 42 }
}