Я пишу программу, которая анализирует несколько файлов. Эти файлы могут попадать в различные категории, и я не знаю, какие заранее. Имеет смысл создать тип для каждого типа данных, которые могут содержать файлы, но я изо всех сил пытаюсь получить этот тип данных из моего анализатора и в мою модель / основную программу.
В большинстве других языков программирования я вероятно, определит функцию / метод, который принимает имя файла в качестве входных данных и возвращает тип generi c в качестве выходных данных. В зависимости от моих потребностей, я затем приведу или протестирую тип моего родового c returntype и получу реальный тип моих перенастроенных данных.
Однако в Rust это, похоже, не работает. Я могу определить функцию, которая возвращает черту, например:
fn parse_file(file: &'str) -> impl ParsedData
, где ParsedData
- общая черта для всех моих типов данных. Но что мне делать отсюда? В какой-то момент мне нужно разделить различные типы данных, скрытые за моей чертой ParsedData.
Решение 1: Я нашел черту Any, которая позволяет снизить черту до тип. Но, по общему мнению, этого следует избегать. Я не уверен, что точно понимаю , почему людям это не нравится, но если ничего другого, то, кажется, достаточно много работы / кода котельной плиты, чтобы начать работать.
Решение 2: Существует также возможность объединить все известные типы данных в один большой тип контейнера, например:
pub struct DataContainer {
pub data_type_1: Option<DataType1>,
pub data_type_2: Option<DataType2>,
pub data_type_3: Option<DataType3>,
pub data_type_4: Option<DataType4>,
}
fn parse_file(file: &'str) -> DataContainer
, и просто передавать его, пока вам не понадобятся типы данных внутри него. .
Решение n: Похоже, существует ряд менее популярных решений
Чтение некоторых данных без знания типа заранее должно быть очень общая задача. Разве нет де-факто способа с этим справиться? Я несколько раз читал, что главная причина плохой поддержки в Rust заключается в том, что существует другой и лучший способ решения почти / каждого типа проблем, когда люди сталкиваются с необходимостью снижения данных.
Так вот мой вопрос. Как сделать вы справляетесь с этой проблемой простым идиоматическим c способом?
Определение проблемы:
- Допустим, вы хотите прочитать несколько файлов , Некоторые из них будут содержать профили пользователей, некоторые будут содержать изображения (не привязанные к пользователю), а некоторые будут содержать рецепты приготовления.
- Вы не знаете, что содержит файл, прежде чем его прочитать, но его легко разобрать, и там нет никакой неопределенности
- Я определил функцию
parse_file
выше, но я думал, что это будет хорошим интерфейсом для чтения этих файлов, поскольку они, вероятно, используют много кода для открытия файла et c.