Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Как правильно указать время жизни ссылки в реализации трэйта

#rust


Как реализовать 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  }


Перепробовал еще кучу вариантов. Объясните как это правильно сделать.
    


Ответы

Ответ 1



Вот ответ с английского форума от 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) } } }

Комментариев нет:

Отправить комментарий