在Rust中是否可以扩展一个结构体?

3

我不太熟悉Rust,只有在需要检查其类型系统是否可以实现一些有趣的功能时才会关注它。我有一个问题,是否可能将以下用TS编写的类型定义转换为Rust。

type Data = {
    path: String
    name: String
}

enum Type {
    CSV,
    JPG,
    PNG
}

type CSV = Data & {
    type: Type.CSV
}

type JPG = Data & {
    type: Type.PNG
}

type PNG = Data & {
    type: Type.PNG
}

// To avoid conflicts with the already reserved type File
type MyFile = CSV | PNG | JPG

我一直在尝试谷歌一些关于Rust语言是否可以扩展结构体的内容,但很遗憾并没有找到满足我的好奇心的答案。


@ChrisG 看起来是这样,但问题是7年前提出的。自那以后有没有任何变化? - Rostislav Zhuravsky
在Rust中仍然没有结构体继承这样的东西。在这里,更倾向于使用组合。 - E net4
1个回答

3

不,Rust中无法扩展结构体。

尝试直接将此Typescript示例转换为等效的Rust并不符合惯用方式。您可能希望按照以下方式进行结构化:

enum Kind {
    Csv,
    Jpg,
    Png,
}

struct MyFile {
    kind: Kind,
    path: String,
    name: String,
}

或者像这样:
struct Data {
    path: String,
    name: String,
}

enum MyFile {
    Csv(Data),
    Jpg(Data),
    Png(Data),
}

根据路径/名称与文件类型的耦合程度而定。

非常感谢!我的类型背后的想法是实现一个函数,根据上下文只接受CSV或PNG文件。例如,想象一下,我想要一个仅使用特定类型的函数/类型。例如,我有一个用户,其头像应该只是PNG格式,所以采用第一种方法不能保证。我还不太理解第二个例子是如何工作的,如果您能分享一些信息让我深入了解,我会非常感激。 - Rostislav Zhuravsky
为此,您需要为每个枚举变体使用不同的类型(即CsvData等)就像这样。或者,如果您想要减少这些字段的重复(如果有更多),则可以使用组合就像这样 - kmdreko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接