Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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/url/2.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 如何从另一个trait对象创建trait对象?_Rust_Trait Objects - Fatal编程技术网

Rust 如何从另一个trait对象创建trait对象?

Rust 如何从另一个trait对象创建trait对象?,rust,trait-objects,Rust,Trait Objects,Rust的最新稳定版本(1.27)允许为trait对象实现trait(dyn trait),因此我尝试了以下方法: 上述代码导致错误: error[E0277]:未满足特征绑定“%T1:T2” -->src/main.rs:21:19 | 21 |设t2:&t2=&t12; | -^^^ | | |特性'T2'没有为`&T1实现` 帮助:考虑删除1个主要的“引用” | =帮助:找到了以下实现: 您正在为trait对象本身(d

Rust的最新稳定版本(1.27)允许为trait对象实现trait(
dyn trait
),因此我尝试了以下方法:

上述代码导致错误:

error[E0277]:未满足特征绑定“%T1:T2”
-->src/main.rs:21:19
|
21 |设t2:&t2=&t12;
|                   -^^^
|                   |
|特性'T2'没有为`&T1实现`
帮助:考虑删除1个主要的“引用”
|
=帮助:找到了以下实现:

您正在为trait对象本身(
dynt1
)实现
T2
),但尝试将其用于对trait对象的引用(
&dynt1


尝试
impl您正在为trait对象本身(
dynt1
)实现
T2
),但尝试将其用作trait对象的引用(
&dynt1


请尝试使用Rust(1.27)的最新稳定版本-这是自Rust 1.0以来允许的。唯一新的是literal
dyn
关键字。您的代码在没有它的情况下表现相同(
impl T2 for T1{/*…*/}
)。最新的稳定版本Rust(1.27)允许-这是自Rust 1.0以来允许的。唯一新的是literal
dyn
关键字。您的代码在没有它的情况下表现相同(
implt2 for T1{/*…*/}
)。这是有原因的:作为
T1
的“扩展”特性,我们可以从
T2
调用方法,而不是
T1
,就像我写
t12.f2()
那样。但是如果这是我们应该对T使用
implt2的唯一原因,其中T:T1
代替。这是有原因的:作为
T1
的“扩展”特性,我们可以从
T2
调用方法,而不是
T1
,就像我写
t12.f2()
那样。但是如果这是我们应该对T使用
implt2的唯一原因,其中T:T1
。。。
trait T1 {
    fn f1(&self);
}
trait T2 {
    fn f2(&self);
}
impl T2 for dyn T1 {
    fn f2(&self) {
        self.f1()
    }
}
struct S();
impl T1 for S {
    fn f1(&self) {}
}

fn main() {
    let t1 = S();
    let t12: &T1 = &t1;
    t12.f2();
    let t2: &T2 = &t12;
    t2.f2();
}