Я не очень разбираюсь в 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 и, к сожалению, не нашел ничего, отвечающего моему любопытству.
В Rust до сих пор нет такой вещи, как наследование структур. Предпочтение композиции было бы способом пойти здесь.






Нет, в 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, поэтому первый способ не может гарантировать этого. Я еще не очень понимаю, как работает второй пример, и я был бы очень признателен, если бы вы могли поделиться некоторой информацией, чтобы я мог погрузиться в него.
Для этого вам понадобятся разные типы для каждого варианта перечисления (например, CsvData и т. д.) вот так . Или, если вы хотите уменьшить дублирование этих полей (если их больше), вы должны использовать композицию вот так.
@ChrisG Кажется, да, но об этом спросили 7 лет назад. С тех пор ничего не изменилось?