Generics 如何告诉编译器内部字段实现了trait或者泛型trait只有两个变体?
我有两种低级类型,Generics 如何告诉编译器内部字段实现了trait或者泛型trait只有两个变体?,generics,rust,traits,typing,Generics,Rust,Traits,Typing,我有两种低级类型,State和Base状态s可以是观察d,但根据视点的不同,一些可以看到完整的状态,而另一些只能看到基 State构成了更高级类型的基础,但我找不到一种方法来检查这种矛盾的观察行为 下面是一个简单的尝试,以实现它的泛型和一个简单的impltrait绑定: //这两件事是可以观察到的。。 结构状态; 结构基础; // .. 但是从两个不同的角度来看。 可观察性状{ fn观察(&self)->Obs; } //有些人将状态视为状态。 状态的可观测impl{ fn观察(&self)->
State
和Base
<代码>状态s可以是观察
d,但根据视点的不同,一些可以看到完整的状态
,而另一些只能看到基
State
构成了更高级类型的基础,但我找不到一种方法来检查这种矛盾的观察
行为
下面是一个简单的尝试,以实现它的泛型和一个简单的impl
trait绑定:
//这两件事是可以观察到的。。
结构状态;
结构基础;
// .. 但是从两个不同的角度来看。
可观察性状{
fn观察(&self)->Obs;
}
//有些人将状态视为状态。
状态的可观测impl{
fn观察(&self)->状态{
州{}
}
}
//有些人认为国家是基础。
状态的可观测impl{
fn观察(&self)->基础{
碱基{}
}
}
//州是其他类型的基础。。
结构容器{
字段:State,
} // .. 有很多像这样的。
//现在,观察容器内部状态的时间到了。。
fn流程(状态:&impl可观察,容器:&container)->(Obs,Obs){
(
state.observe(),/(此类型检查正常)
//…如何对此进行注释,使编译器确信
//container.field*是否实现了可观察性?
container.field.observe(),
)
}
fn main(){
//建立数据。
设s=状态{};
设c=Container{field:State{};
//并观察它。
让o_满:(状态,状态)=进程(&s,&c);
设o_部分:(基,基)=过程(&s,&c);
}
产生错误
error[E0277]:未满足特征绑定'State:Observable'
-->src/main.rs:33:25
|
33 |容器。字段。观察(),
|^^^^^^^^未为“状态”实现特征“可观察”`
我相信这可以通过泛型和单态化实现,因为一切都是静态已知的
我也有点理解为什么编译器担心任何Obs
类型的observer
可能无法在State
上实现
但是编译器在这里缺少信息,因为我知道的仍然比它多:
- 如何告诉编译器
泛型类型将仅为
或State
Base
- 如何让编译器清楚地知道
的第二个参数的类型是进程
,因此容器
的类型是容器.field
,这确实实现了状态
可观察
状态
实现了可观察的
?即:
fn process<Obs>(state: &impl Observable<Obs>, container: &Container) -> (Obs, Obs)
where State: Observable<Obs> // <--- tell compiler that State satisfies Observable<Obs>
{
(
state.observe(),
container.field.observe(),
)
}
fn流程(状态:&impl可观察,容器:&container)->(Obs,Obs)
where State:Observable//没有泛型在我的所有项目中传播-这就是它的工作原理。看起来你的问题可能会由你的答案来回答。如果没有,请回答您的问题以解释差异。否则,我们可以将这个问题标记为已回答。@Shepmaster就是这样工作的---啊,太糟糕了:')谢谢你的指示,我正在着手,并将尽快更新。@Shepmaster好吧,尽管两篇文章都抱怨“仿制药到处传播”,但我不确定情况是否相同。另一篇文章在泛型结构B
上实现了固定的特征a
,而我需要在固定的结构B
上实现泛型特征a
的变体。我将编辑这篇文章,让它更加关注“如何告诉编译器…”方面。太棒了!谢谢:D出于某种原因,我刚刚确信where
子句中列出的类型只能是泛型类型(因此T
或此处Obs
),而不能是具体类型(如State
)。记录在哪里?此外,请注意,第一个参数只需键入状态
:D即可