问题标签 [enum-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
inheritance - 如何使用组合而不是继承?枚举调度?
我知道我应该使用组合而不是继承。
在 Java/C++ 中,我有一个抽象基类Vehicle
(带有属性和常用方法)和实现它的类,例如Car
和Bike
.
我发现enum_dispatch
,它在将方法调用从父级转发到子“类”方面做得很好。
- 我应该在哪里存储公共数据,例如
num_wheels
哪些是 的属性Vehicle
? - 我应该在哪里定义
Vehicle
使用公共数据的方法?
目前,我必须将所有Vehicle
数据和方法复制到每个枚举变体中,这越来越令人厌烦,因为它随着“方法”的数量和“类”的数量而扩展。
- 我如何在 Rust 中惯用地做到这一点?
rust - 如何使用 enum_dispatch 的两个特征?
我试过了:
它似乎忽略了第一个之后的任何特征,默默地。
这会导致错误,因为在这种情况下,编译器似乎不相信 Foo 实现了 BazTrait。
更新:@kmdreko 的代码只要BazTrait
与Foo
.
When BazTrait
is 在另一个 crate 中,它也使用enum_dispatch
,BazTrait
被忽略并导致以下形式的两个错误:
#[enum_dispatch(BarTrait, BazTrait)]
重要的是要注意或都没有错误pub enum Foo {
。
rust - TryInto trait 要求更多类型注释,即使所有注释都已到位
我有以下代码(受限示例)。有一个串行协议,使用crate 建模Command
和枚举- 枚举中的每个变体都用一个结构表示。struct 任务负责 s 的序列化、执行和反序列化,用通用枚举(generic impl)或特定结构(templated impl)返回s。通用实现工作得很好,但模板化的实现无法编译。Responce
enum_dispatch
Transport
Command
TransportResult
Responce
当我尝试编译与上面相同的代码时,我收到以下错误:
我不明白,这里的错误是什么 - 我以为我已经在Transport::command_with_addr
成员函数中说明了所有必要的类型注释。
注意,enum_dispatch
使用以下代码生成try_into
转换,在上面的代码中使用: