AsRef<Path> 与 &Path

AsRef<Path> vs &Path

我有以下结构:

struct Config<'a> {
    path1: &'a dyn AsRef<Path>,
    path2: HashMap<SomeEnum, &'a dyn AsRef<Path>>,
}

然后当我尝试创建此配置的新实例时:

Config {
    path1: &Path::new("path/to/file1"),
    path2: HashMap::from([(SomeEnum::Value, &Path::new("path/to/file2"))
}

对于 path1 的变量我没有得到任何错误,但是对于 path2 我得到:

error[E0308]: mismatched types
expected trait object `dyn AsRef`, found `&Path` 
Note: expected struct `HashMap<_, &dyn AsRef<Path>>` 
found struct `HashMap<_, &&Path>`

我不明白为什么这适用于 path1,但不适用于 path2

在此先感谢您的帮助, 乔米

在这种情况下,编译器似乎不会自动将引用转换为特征对象引用。但是您可以使用 as:

手动完成
    Config {
        path1: &Path::new("path/to/file1"),
        path2: HashMap::from([(SomeEnum::Value, &Path::new("path/to/file2") as &dyn AsRef<Path>)]),
    }

playground

类型推断不能完全弄清楚这里应该发生什么。无法看到 &&Path 引用应转换为 &dyn AsRef<Path>.

你需要帮助它弄清楚第二个元组槽应该是 &dyn AsRef<Path>。你可以用演员表来做到这一点:

Config {
    path1: &Path::new("path/to/file1"),
    path2: HashMap::from([(SomeEnum::Value, &Path::new("path/to/file2") as &dyn AsRef<Path>)]),
}

您也可以先使用类型注释创建元组:

let v: (SomeEnum, &dyn AsRef<Path>) = (SomeEnum::Value, &Path::new("path/to/file2"));
    
Config {
    path1: &Path::new("path/to/file1"),
    path2: HashMap::from([v]),
}