Generics 重写函数以接受AsRef<;路径>;而不是&;路径

Generics 重写函数以接受AsRef<;路径>;而不是&;路径,generics,rust,traits,lifetime,borrow-checker,Generics,Rust,Traits,Lifetime,Borrow Checker,如何编写以下函数,以不仅接受Path,而且接受String或&str fn查找数据库1选项(路径:P)->选项 哪里 P:a+AsRef, { 设_path:&'a path=path.as_ref(); _path.parent() } 以下是我得到的错误: 错误[E0515]:无法返回引用函数参数'path'的值` -->src/main.rs:11:5 | 11 | path.as_ref().parent() | ----^^^^^^^^^^^^^^^^^^ | | |

如何编写以下函数,以不仅接受
Path
,而且接受
String
&str

fn查找数据库1选项(路径:P)->选项
哪里
P:a+AsRef,
{
设_path:&'a path=path.as_ref();
_path.parent()
}
以下是我得到的错误:

错误[E0515]:无法返回引用函数参数'path'的值`
-->src/main.rs:11:5
|
11 | path.as_ref().parent()
|     ----^^^^^^^^^^^^^^^^^^
|     |
|返回引用当前函数拥有的数据的值
|“path”在这里是借来的
错误[E0597]:`path`的寿命不够长
-->src/main.rs:18:27
|
14 | fn查找数据库3
|--此处定义的生存期“a”
...
18 |让_path:&'a path=path.as_ref();
|----------^^^^^借来的价值寿命不够长
|                |
|类型批注要求为“%a”借用“path”`
19 |_path.parent()
20 | }
|-‘path’在这里掉了下来,还借着呢
使用std::path::path;
fn main(){
让path_str:&str=“root/path”;
让path_string:string=path_str.to_string();
让路径\路径:&路径=&路径::新建(路径\路径);
让root=find_database1(path_path);
println!(“{:?}”,根);
查找数据库2(路径);
查找数据库2(路径字符串);
让root=find_database2(path_path);
println!(“{:?}”,根);
}
有以下签名:

fn parent(&self) -> Option<&Path>;

另一方面,如果您确实想要接受
字符串
s,您可以将
选项
转换为函数体内部的
选项
。这是因为
PathBuf
Path
的自有版本:

使用std::path::{path,PathBuf};
//获取&str、&String、String、&Path或PathBuf

fn查找_数据库2储存您的解释!在重新考虑之后,您的第一个版本(接受&String而不是String)就是我真正想要的版本。您的示例还帮助我更好地理解了?大小的标记。