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

#[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())

推荐答案

单晶化成本.

write()和Rust中的大多数文件系统函数一样,为方便起见(允许您通过,例如&str),需要AsRef<Path>而不是Path.但这也有成本:这意味着函数将被单态化,并针对每种类型分别进行优化,而实际上并不需要这样做.虽然LLVM很可能会消除所有这些实例的重复数据,但用于优化它们的时间仍然浪费在编译时间上.

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

Rust相关问答推荐

为什么幻影数据不能自动推断?

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

rust 蚀生命周期 行为

这种获取-释放关系是如何运作的?

在Rust 中移动原始指针的靶子安全吗

&'a T 是否意味着 T: 'a?

Rust,如何从 Rc> 复制内部值并返回它?

Nom 解析器无法消耗无效输入

Rust 文件未编译到 dll 中

Rust 生命周期:这两种类型声明为不同的生命周期

如何将参数传递给Rust 的线程?

Rust 异步和 AsRef 未被发送

仅当满足外部条件时如何添加到 actix web 的路由

如何获得对数组子集的工作可变引用?

Rustlings 切片原语

HashMap entry() 方法使borrow 的时间比预期的长

为什么在使用 self 时会消耗 struct 而在解构时不会?

在 rust 数组和 vec 上使用 `for` 循环

如何在 Rust 中链接返回结果的函数?

[fn] 与 [(fn, u8)] 之间的 Rust 区别