Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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
Rust 有没有办法让一个特征为它扩展的另一个特征中的关联类型指定它自己?_Rust_Traits_Associated Types - Fatal编程技术网

Rust 有没有办法让一个特征为它扩展的另一个特征中的关联类型指定它自己?

Rust 有没有办法让一个特征为它扩展的另一个特征中的关联类型指定它自己?,rust,traits,associated-types,Rust,Traits,Associated Types,我想定义一个特征,该特征具有另一个作为超级特征的特征,其自身的特征对象类型为关联类型: ///制造东西的特性。 特质制造{ 类型输出:?尺寸; fn make(self:Box)->Box; } ///Make的一个特例,它使事物具有相同的特征。 trait引导程序:Make{}//将不会编译。 然而,我不能这样做,因为它创造了一个无限循环。在上面的示例中,我需要为dyn Bootstrapper指定Output,它本身就是(dyn Bootstrapper)。但是,我需要为dyn引导程序指定

我想定义一个特征,该特征具有另一个作为超级特征的特征,其自身的特征对象类型为关联类型:

///制造东西的特性。
特质制造{
类型输出:?尺寸;
fn make(self:Box)->Box;
}
///Make的一个特例,它使事物具有相同的特征。
trait引导程序:Make{}//将不会编译。

然而,我不能这样做,因为它创造了一个无限循环。在上面的示例中,我需要为
dyn Bootstrapper
指定
Output
,它本身就是(
dyn Bootstrapper
)。但是,我需要为
dyn引导程序
指定
Output
,等等,例如
Make我最终得到的解决方案是:

///为“Make”的子集定义关联类型的meta-'trait'。
特质{
类型输出:?尺寸;
}
///制造东西的“特质”。包含一组“特征”,这些特征定义了
///'make()`函数的输出。
特质制造{
类型性状:性状;
fn make(self:Box)->Box;
}
通过将相关的
类型
分离为一个单独的
Traits
元接口,我能够为一个新的具体类型实现
Traits
,并将其传递到
Make

//`Traits`为'Bootstrapper'实现,它约束'Make'`
///“Bootstrapper”输出“Box”的实现。
结构引导程序;
BootstrapperTraits的impl特征{
//注意:在这里指定Self可以绕过循环依赖关系。
类型输出=dyn引导器;
}
///Make的一个特例,它制造与自身相同的东西,但是
///不一定是“自我”。
特质引导者:制造{
fn是最好的(自我)->bool;
}
具体类型(
BootstrapperTraits
)可以通过指定
Self
作为
输出的
类型特征
,绕过循环supertraits依赖关系。然后
BootstrapperTraits
被指定为
Bootstrapper
的特定
Traits
实现。因此,任何实现
Bootstrapper
的人现在都必须实现
Make
,这要求
Output
dyn Bootstrapper


完整的解决方案见此。

您真正需要关联的解决方案吗type@SvetlinZarev之所以不能,是因为
Make
是我库的一部分,但是
Bootstrapper
需要用户定义。我希望用户能够定义他们自己的
trait
,它扩展了
Make
,因为我有一些库方法,这些库方法使用这个
trait
绑定来操作泛型。但是,我不希望调用
make
仅仅返回一个
,并要求用户再次上下转换才能返回到
。我希望用户控制返回的
Box
的类型,同时仍然能够定义自己的
trait
,这需要
make
返回自身的
Box