PathBuf :: from&some_other_pathbuf会克隆some_other_pathbuf的数据吗?

问题描述

我正在编写一个custom_rename函数,该函数接收一个String一个PathBuf的不变引用:

fn custom_rename(new_name: String,old_path: &PathBuf) {
    let mut new_path = PathBuf::from(&old_path);
    new_path.pop();
    new_path.push(new_name);
    std::fs::rename(old_path,new_path).expect("error");
}

PathBuf::from()函数是否克隆old_path的数据?根据{{​​3}},Rustaceans尝试避免克隆。

解决方法

是的,PathBuf拥有数据。带有引用时,拥有数据的唯一方法是克隆数据。

我会这样写

use std::{fs,path::Path};

fn custom_rename(new_name: &str,old_path: &Path) {
    let mut new_path = old_path.to_owned();
    new_path.pop();
    new_path.push(new_name);
    fs::rename(old_path,new_path).expect("error");
}

另请参阅: