我有以下代码片段(取消了生命周期try ):
pub struct NamedArgument<T>(pub(in crate) &'static str, pub(in crate) T);
pub struct LoggedArgument<T>(pub(in crate) &'static str, pub(in crate) T);
impl<T> NamedArgument<T> {
pub fn log_with<T2, F>(self, log_level: log::Level, transform: F) -> LoggedArgument<T>
where
T2: Display,
F: FnOnce(&T) -> T2,
{
log::log!(log_level, "{} = {}", self.0, transform(&self.1));
LoggedArgument(self.0, self.1)
}
}
我想这样称呼它:
fn foo(argument: NamedArgument<impl AsRef<str>>) {
argument.log_with(log::Level::Info, |s| s.as_ref());
}
但此操作失败,并显示以下错误:
error: lifetime may not live long enough
--> src/lib.rs:20:45
|
20 | argument.log_with(log::Level::Info, |s| s.as_ref());
| -- ^^^^^^^^^^ returning this value requires that `'1` must outlive `'2`
| ||
| |return type of closure is &'2 str
| has type `&'1 impl AsRef<str>`
我确实理解这个问题(至少我认为是这样),但我发现自己无法正确地指定生命周期.
本质上,我需要通过传递给闭包的参数指定返回的T2
的生存期.
我try 了几十种生命周期规范的组合,包括为函数特征使用更高级别的特征界限.
如何指定使该系统正常运行所需的生命周期?