方法中的多种返回类型

dbr*_*dbr 5 rust

我想在Rust写一个简单的电视剧集文件重命名器.

解析文件名,可能是几种类型之一(基于日期,季节/剧集编号等).然后,此解析的文件将变为"填充文件",其中包含来自数据库的数据(然后将其格式化为新文件名)

最初我尝试使用该parse方法获取文件名并返回枚举变体:

enum ParsedFile{
    DateBased{series: String, date: Date},
    SeasonBased{series: String, season: i32, episode: i32},
    // etc
}


fn parse(fname:&str) -> Option<ParsedFile>{
    ...
}
Run Code Online (Sandbox Code Playgroud)

这很好,但是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),
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这看起来很笨重,我相信一定有更好的方法.

将每个剧集类型作为单独的结构更好,例如:

struct DateBased{
    series: String,
    date: Date
}
struct SeasonBased{
    series: String,
    season: i32,
    episode: i32
}
Run Code Online (Sandbox Code Playgroud)

..然后,我可以说,ToPopulatedFile为每一集类型实现一个特征.但是我找不到parse在这个例子中编写方法的方法(即编写一个可能返回DateBased结构或SeasonBased结构的方法)

有没有一个很好的方法来构建这个?

Mat*_* M. 5

您可以围绕 设计一个解决方案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),
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以在 Rust 中结合enumstruct,我个人认为为事物命名是值得的,因为它可以更轻松地操纵它们。