Как реализовать TraitFoo для структуры Foo?
#[derive(Debug)]
struct Foo<'f>{
os: Option<&'f str>
}
impl<'f> Foo<'f> {
fn new(x:&'f str) -> Foo<'f>{
Foo{
os:Some(x)
}
}
}
trait TraitFoo {
fn foo(x:&str) -> Self;
}
impl<'f> TraitFoo for Foo<'f>{
fn foo(x:&str) -> Foo<'f> {
Foo{
os:Some(x)
}
}
}
fn main() {
println!("{:?}", Foo::new("one"));
println!("{:?}", Foo::foo("two"));
}
Этот код компилится с ошибкой:
G:\Work\Rust\test01\src\lf_trait.rs:21:12: 21:13 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements
G:\Work\Rust\test01\src\lf_trait.rs:21 os:Some(x)
^
G:\Work\Rust\test01\src\lf_trait.rs:19:2: 23:3 help: consider using an explicit lifetime parameter as shown: fn foo(x: &'f str) -> Foo<'f>
G:\Work\Rust\test01\src\lf_trait.rs:19 fn foo(x:&str) -> Foo<'f> {
G:\Work\Rust\test01\src\lf_trait.rs:20 Foo{
G:\Work\Rust\test01\src\lf_trait.rs:21 os:Some(x)
G:\Work\Rust\test01\src\lf_trait.rs:22 }
G:\Work\Rust\test01\src\lf_trait.rs:23 }
Если добавить 'f в функции foo() то получим другую ошибку:
G:\Work\Rust\test01\src\lf_trait.rs:19:2: 23:3 error: method `foo` has an incompatible type for trait: expected bound lifetime parameter , found concrete lifetime [E0053]
G:\Work\Rust\test01\src\lf_trait.rs:19 fn foo(x:&'f str) -> Foo<'f> {
G:\Work\Rust\test01\src\lf_trait.rs:20 Foo{
G:\Work\Rust\test01\src\lf_trait.rs:21 os:Some(x)
G:\Work\Rust\test01\src\lf_trait.rs:22 }
G:\Work\Rust\test01\src\lf_trait.rs:23 }
Перепробовал еще кучу вариантов. Объясните как это правильно сделать.
Ответ
Вот ответ с английского форума от llogiq:
Нужно указать время жизни в определении трэйта
trait TraitFoo<'a> {
fn foo(x: &'a str) -> Self;
}
impl<'a> TraitFoo<'a> for Foo<'a> {
fn foo(x:&'a str) -> Foo<'a> {
Foo{
os:Some(x)
}
}
}
Комментариев нет:
Отправить комментарий