Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何告诉编译器内部字段实现了trait或者泛型trait只有两个变体?_Generics_Rust_Traits_Typing - Fatal编程技术网

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即可