Предположим, у меня есть эта структура и эта черта:
#[derive(Debug)]
pub struct New<T>(T);
pub trait AsRefNew<'a> {
fn as_ref(&self) -> New<&'a str>;
}
То есть черта AsRefNew
позволяет возвращать ссылку с заданным временем жизни 'a
, заключенную в New
newtype. Это время жизни 'a
может отличаться (и будет) от времени жизни параметра &self
.
Теперь я могу реализовать эту черту для New(&str)
и сделать так, чтобы время жизни вывода было временем жизни обернутого &str
:
impl<'a> AsRefNew<'a> for New<&'a str> {
fn as_ref(&self) -> New<&'a str>{
New(self.0)
}
}
Моя проблема в том, что я хотел бы реализовать черту для New(String)
, и на этот раз я хотел бы, чтобы 'a
действительно соответствовал времени жизни self
. Насколько я понимаю, должно работать что-то подобное:
impl<'a> AsRefNew<'a> for New<String> where Self: 'a{
fn as_ref(&self) -> New<&'a str> {
New(self.0.as_str())
}
}
За исключением того, что это не так:
error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> src/main.rs:16:20
|
16 | New(self.0.as_str())
| ^^^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 15:5...
--> src/main.rs:15:5
|
15 | fn as_ref(&self) -> New<&'a str> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: ...so that reference does not outlive borrowed content
--> src/main.rs:16:13
|
16 | New(self.0.as_str())
| ^^^^^^
note: but, the lifetime must be valid for the lifetime `'a` as defined on the impl at 14:6...
--> src/main.rs:14:6
|
14 | impl<'a> AsRefNew<'a> for New<String> where Self: 'a{
| ^^
note: ...so that the expression is assignable
--> src/main.rs:16:9
|
16 | New(self.0.as_str())
| ^^^^^^^^^^^^^^^^^^^^
= note: expected `New<&'a str>`
found `New<&str>`
Я пробовал разные варианты продолжительности жизни и общие, но не могу найти лучшего способа выразить тот факт, что в данном случае я хочу, чтобы 'a
совпадал с '_
.
Цель состоит в том, чтобы этот фрагмент кода работал:
fn main() {
// This works:
let a = String::from("Hey");
let b;
{
let c = New(a.as_str());
b = c.as_ref().0;
}
println!("{:?}", b);
// I would like that to work as well:
let a = String::from("Ho");
let b;
let c = New(a);
{
b = c.as_ref().0;
}
println!("{:?}", b);
}
Любые идеи ?
'a
может отличаться (и будет) от времени жизни параметра&self
с некоторыми конкретными примерами. Измените свой вопрос, добавив в него дополнительных уточняющих деталей. Учитывая ваш вопрос как есть, я смог придумать этот пример., но я не уверен, действительно ли это решит вашу проблему. - person pretzelhammer   schedule 28.01.2021New<String>
, а не дляNew<&String>
. - person Alex Péré   schedule 28.01.2021