如何概括一个函数以接受文件路径或文件内容作为字符串?

h19*_*990 1 generics rust

我正在编写一个文件解析器,它将“.toml”文件(使用toml-rs板条箱)解析为 Rust 数据类型。现在我的函数接受PathBuf文件路径。我想让它变得通用,以便它可以接受包含 TOML 的任何类型的源:

  1. 文件路径,PathBufPath.
  2. 其中包含 toml 数据的字符串。

有可能实现这一目标吗?

nlt*_*lta 5

String 和 PathBuf 不会实现良好的通用特征,它们太不同了。一是内容,一是通向内容的路径。

您可以有两个入口点函数,一个接受路径/buf,一个接受字符串(然后调用同一个助手)

pub fn parse_from_file<P: AsRef<Path>>(path: P) -> Toml {
    let content = std::fs::read_to_string(path);
    parse(content)
}
pub fn parse(content: String) -> Toml {
    todo!();
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用这样的枚举:

enum ParseContent {
    PathBuf(PathBuf),
    Path(Path),
    Content(String)
}

pub fn parse(source: ParseContent) -> Toml { todo!() }
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一个。