gpt4 book ai didi

dynamic - 是否可以将特征对象转换为另一个特征对象?

转载 作者:行者123 更新时间:2023-11-29 08:30:54 28 4
gpt4 key购买 nike

<分区>

我尝试了以下代码:

trait TraitA {
fn say_hello(&self) {
self.say_hello_from_a();
}
fn say_hello_from_a(&self);
}

trait TraitB {
fn say_hello(&self) {
self.say_hello_from_b();
}
fn say_hello_from_b(&self);
}

struct MyType {}

impl TraitA for MyType {
fn say_hello_from_a(&self) {
println!("Hello from A");
}
}

impl TraitB for MyType {
fn say_hello_from_b(&self) {
println!("Hello from B");
}
}

fn main() {
let a: Box<dyn TraitA> = Box::new(MyType {});
let b: Box<dyn TraitB>;

a.say_hello();
b = a;
b.say_hello();
}

我得到以下编译错误:

error[E0308]: mismatched types
--> src/main.rs:34:9
|
34 | b = a;
| ^ expected trait `TraitB`, found trait `TraitA`
|
= note: expected struct `std::boxed::Box<dyn TraitB>`
found struct `std::boxed::Box<dyn TraitA>`

我声明了两个特征和一个名为 MyType 的类型并为 MyType 实现了这两个特征.我创建了一个新的特征对象 TraitA类型 MyType我称之为a .自 a还实现了 TraitB , 我认为它应该可以被转换为 TraitB .

我还没想好这是否可行。如果是,我如何转换特征对象 a进入TraitB

在 C++ 中,我会使用类似于 std::dynamic_pointer_cast<TraitB>(a); 的东西出于同样的目的。

这是一个我可以使用横向转换的例子:我有一个结构,里面有一些数据代表一些现实生活中的实体:

struct MyType {
a: i32,
b: i32,
}

这种类型的实例至少可以在代码库的两个不同部分中使用。在这两个部分,我都需要一个名为 get_final_value 的行为.

有趣的是get_final_value应该根据调用者的不同做出不同的响应。

  • 为什么我不将类型分成两个不同的类型?:技术上,设计使然,ab属于一起,不是说get_final_value()使用这两个值来计算结果。

  • 为什么不使用泛型/静态调度?因为MyType只是一个例子。在真实情况下,我有不同的结构,它们都以不同的方式实现这两个特征。

  • 为什么不使用 Any特征?老实说,直到最近我才知道它的存在。我不记得 The Rust Programming Language 提到过它。无论如何,您似乎需要知 Prop 体类型才能从 Any 进行转换。到那个具体类型,然后到特征对象。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com