Супертрэйт, только когда Self: Sized - PullRequest
1 голос
/ 04 октября 2019

Предположим, у меня есть черта

trait A {
    fn new() -> Self where Self : Sized;
    fn foo(&self) -> i32;
}
struct B {
   data : i32
}
impl A for B {
    fn new() -> Self {
        B {data : 42}
    }
    fn foo(&self) -> i32 {
        self.data
    }
}

Теперь я могу использовать Box<dyn A>, у меня просто нет доступного метода new (). И когда у меня есть общий T : A, я могу сделать T::new(). Таким образом, я могу использовать A в качестве объекта-черты (без функций, которые могли бы предотвратить это), и я могу использовать его в шаблонном коде и использовать все функции в нем.

Мой вопрос: возможно ли получить это? поведение, когда, например, Clone в качестве супертрейта? В случае dyn A A не реализует Clone. В общем случае это делает.

1 Ответ

0 голосов
/ 04 октября 2019

Вы можете сделать так:

trait A {
    fn new() -> Self where Self : Sized;
    fn foo(&self) -> i32;
}

#[derive(Clone)]
struct B {
   data : i32
}

impl A for B {
    fn new() -> Self {
        B {data : 42}
    }
    fn foo(&self) -> i32 {
        self.data
    }
}


fn make_clone<T: Clone + A>(toc: &T) -> T {
    dbg!(toc.foo());
    toc.clone()
}

fn main() {
    let b = B{data: 0};
    make_clone(&b);
}

, чтобы вы могли получить доступ к методу A и супертрейту Clone из make_clone, вы, очевидно, можете сделать то же самое с супертрейтом вместоуниверсальный метод

...