【问题标题】:How to generalize a function to accept file path or file contents as string?如何概括一个函数以接受文件路径或文件内容作为字符串?
【发布时间】:2022-09-24 02:02:55
【问题描述】:

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

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

    有可能实现这一目标吗?

  • 这听起来不是个好主意。 \"data/config.toml\" 是路径还是内容?你可以弄清楚,但是编译器会怎么做呢?它是一个字符串
  • 我同意@kmdreko,“方便混淆”在动态类型语言中很常见(例如,可以采用路径、文件对象、url 或内容缓冲区的函数)但隐含性和混淆通常会令人不悦在锈。

标签: generics rust


【解决方案1】:

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!();
}

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

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

pub fn parse(source: ParseContent) -> Toml { todo!() }

我更喜欢第一个。

【讨论】:

  • “String 和 PathBuf 都不会实现一个好的通用特征,它们太不同了。” AsRef 有点像,因为有一个 AsRef&lt;Path&gt; for str。可能更重要的是没有通用特征可以提供两种路径和内容: AsRef 案例会将字符串视为路径。
猜你喜欢
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多