我正在尝试在Rust中编写一个简单的电视剧集文件重命名器。
解析文件名,可能是几种类型之一(基于日期,季节/剧集编号等)。然后,此解析文件将变为“填充文件”,其中包含数据库中的数据(然后将其格式化为新文件名)
最初我尝试使用parse
方法获取文件名并返回枚举变体:
enum ParsedFile{
DateBased{series: String, date: Date},
SeasonBased{series: String, season: i32, episode: i32},
// etc
}
fn parse(fname:&str) -> Option<ParsedFile>{
...
}
这很好用,但是每个剧集采用ParsedFile
并做不同事情的方法变得凌乱
例如,要将ParsedFile->PopulatedFile
转换分离为单独的方法,我必须匹配变体,然后在方法中对其进行解构
struct PopulatedFile {
seriesname: String,
season: i32,
episode: i32,
episodename: String,
airdate: Date,
}
fn _populate_seasonbased(file: ParsedFile) -> Result<PopulatedFile, TvdbError>{
// can't just access file.season or file.episode, have to destructure enum again
}
fn populate(f: ParsedFile) -> Result<PopulatedFile, TvdbError> {
return match f {
ParsedFile::DateBased{..} =>
_populate_datebased(f),
// ...
}
}
这看起来很笨重,我相信一定有更好的方法。
将每个剧集类型作为单独的结构更好,例如:
struct DateBased{
series: String,
date: Date
}
struct SeasonBased{
series: String,
season: i32,
episode: i32
}
..然后,我可以为每个剧集类型实现ToPopulatedFile
特征。但是我在这个例子中找不到编写parse
方法的方法(即编写一个可能返回DateBased
结构或SeasonBased
结构的方法)
有没有一种很好的方法来构建它?
答案 0 :(得分:4)
您可以围绕trait
设计解决方案,但这可能比简单地稍微调整您当前的解决方案要多得多:
struct DateBased{
series: String,
date: Date
}
struct SeasonBased{
series: String,
season: i32,
episode: i32
}
enum ParsedFile{
Date(DateBased),
Season(SeasonBased),
// etc
}
fn _populate_datebased(file: DateBased) -> Result<PopulatedFile, TvdbError>;
fn _populate_seasonbased(file: SeasonBased) -> Result<PopulatedFile, TvdbError>;
fn populate(f: ParsedFile) -> Result<PopulatedFile, TvdbError> {
return match f {
ParsedFile::Date(d) => _populate_datebased(d),
// ...
}
}
你可以在Rust中结合使用enum
和struct
,我个人觉得将名称放在特定的东西上是值得的,因为它可以更容易地操作它们。