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>)]),
}
类型推断不能完全弄清楚这里应该发生什么。无法看到 &&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]),
}
我有以下结构:
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>)]),
}
类型推断不能完全弄清楚这里应该发生什么。无法看到 &&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]),
}