当前位置: 首页 > 知识库问答 >
问题:

为什么std::fs::写(…)使用内部函数?

胡玉书
2023-03-14

我是个新手,一直在浏览源代码,发现:

#[stable(feature = "fs_read_write_bytes", since = "1.26.0")]
pub fn write<P: AsRef<Path>, C: AsRef<[u8]>>(path: P, contents: C) -> io::Result<()> {
    fn inner(path: &Path, contents: &[u8]) -> io::Result<()> {
        File::create(path)?.write_all(contents)
    }
    inner(path.as_ref(), contents.as_ref())
}

这个函数定义这样的内部函数有什么原因吗?为什么不直接写:

File::create(path.as_ref())?.write_all(contents.as_ref())

共有1个答案

洪安顺
2023-03-14

单晶化成本。

write(),就像Rust中的大多数文件系统函数一样,将作为参考

为了降低成本,它调用了一个内部的、非通用的函数来完成所有繁重的工作。外部函数只包含必要的通用代码——到路径的转换。

 类似资料:
  • 我是生锈新手,一直在浏览源代码,发现了这个: 这个函数定义这样的内部函数有什么原因吗?为什么不直接写:

  • 我想知道为什么std::map和std::set使用std::less作为比较键的默认函子。为什么不使用一个类似strcmp的函子呢?类似于: 假设地图中有两个对象,分别是键1和键2。现在,我们要插入另一个具有键3的对象。 如果使用,那么只需一个调用就有足够的信息来做出正确的决定。 根据映射中键的类型,可能很昂贵。 除非我缺少一些非常基本的东西,否则不应该使用类似于比较的东西,而不是作为比较键的默

  • 关于在最新版本的GCC和Clang中编译有几个问题:实验::filessystems链接器错误 但是现在< code>filesystem已经被c 17接受,所以不再需要< code>experimental或< code>-lstdc fs标志,对吗? 错了,我甚至不能 只给了我< code >实验版本,我怎么能包括正式接受的版本呢?

  • 在过去的几个月里,我一直在学习C语言并使用终端。我的代码使用g和c11编译并运行得很好,但在过去几天里它开始出现错误,此后我在编译时遇到了问题。我唯一可以编译和运行的程序依赖于旧的C标准。 我第一次遇到的错误包括 尝试使用ecg$g-o stoi_试验stoi_试验编译。cpp-std=c 11 大堆cpp:13:22:错误:命名空间“std”中没有名为“stoi”的成员;你是说“阿托伊”吗?in

  • 我对java.util.HashMap的概念理解如下:

  • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?