gpt4 book ai didi

rust - 在 Box 中指定通用实现以使用匹配项

转载 作者:行者123 更新时间:2023-11-29 08:17:57 25 4
gpt4 key购买 nike

<分区>

我想编写一个函数,它返回实现共同特征的结构。

如果我的函数指定返回类型 -> impl MyTrait,我在使用匹配时不符合要求,因为匹配必须返回相同的类型。示例:

fn get_a_struct(an_enum: MyEnum) -> impl MyTrait {
match an_enum {
MyEnum::MyEnumFoo => MyStruct1 {},
MyEnum::MyEnumBar => MyStruct2 {},
}
}

产生:

error[E0308]: match arms have incompatible types
--> src/main.rs:22:5
|
22 | / match an_enum {
23 | | MyEnum::MyEnumFoo => MyStruct1{},
24 | | MyEnum::MyEnumBar => MyStruct2{},
| | ------------- match arm with an incompatible type
25 | | }
| |_____^ expected struct `MyStruct1`, found struct `MyStruct2`
|
= note: expected type `MyStruct1`
found type `MyStruct2`

如果我尝试使用 Box,如下所示:

trait MyTrait {
fn my_func() {}
}

enum MyEnum {
MyEnumFoo,
MyEnumBar,
}

struct MyStruct1 {}
struct MyStruct2 {}

impl MyTrait for MyStruct1 {
fn my_func() {
println!("Hello world from MyStruct1")
}
}

impl MyTrait for MyStruct2 {
fn my_func() {
println!("Hello world from MyStruct2")
}
}

fn get_a_struct(an_enum: MyEnum) -> Box<MyTrait> {
match an_enum {
MyEnum::MyEnumFoo => Box::new(MyStruct1 {}),
MyEnum::MyEnumBar => Box::new(MyStruct2 {}),
}
}
error[E0038]: the trait `MyTrait` cannot be made into an object
--> src/main.rs:21:1
|
21 | fn get_a_struct(an_enum: MyEnum) -> Box<MyTrait> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `MyTrait` cannot be made into an object
|
= note: method `my_func` has no receiver

我不知道在这种情况下如何使用特征。

我如何编写一个返回实现相同特征的结构的函数?

可以在 Why can impl trait not be used to return multiple / conditional types? 中找到部分响应,但没有一个答案解决对象安全问题。

OOP 中的类似行为可以通过接口(interface)指定返回类型。

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