Как создать объект черты из штучной черты? - PullRequest
0 голосов
/ 07 января 2019

Я хочу работать с DST и иметь следующий сценарий

У меня есть следующая черта, которая может взять Box и вернуть новый объект черты снаружи:

pub trait MyTrait {
    fn create_from_box(boxed: Box<Self>) -> Self
    where
        Self: Sized;
}

Я следую различным структурам, которые реализуют MyTrait struct FirstStruct;

impl MyTrait for FirstStruct {
    fn create_from_box(boxed: Box<FirstStruct>) -> FirstStruct {
        FirstStruct // Build another struct with some logic and boxed struct values
    }
}

struct SecondStruct;

impl MyTrait for SecondStruct {
    fn create_from_box(boxed: Box<SecondStruct>) -> SecondStruct {
        SecondStruct // Build another struct with some logic and boxed struct values
    }
}

У меня есть функция, которая получает мой признак объекта в некоторой условной логике

fn get_my_trait_object() -> Box<MyTrait> {
    let condition = true; // Retrieved via some logic .

    match condition {
        true => Box::new(FirstStruct),
        false => Box::new(SecondStruct),
    }
}    

Затем у меня есть следующая функция, которая получает мой объект-черту в виде упакованного значения и затем передает его в MyTrait статический метод.

И затем он пытается создать новый объект MyTrait, который будет использоваться позже.

pub fn main() {
    let boxed = get_my_trait_object();
    let desired_trait_object = MyTrait::create_from_box(boxed);
}

Основная проблема здесь заключается в том, что когда я выполняю код, я получаю две следующие ошибки:

  • Размер значений типа dyn MyTrait не может быть известен во время компиляции
  • Все локальные переменные должны иметь статически известный размер

Как я могу решить эти ошибки и добиться того, что я пытаюсь сделать?

Детская площадка

1 Ответ

0 голосов
/ 07 января 2019

Вы можете использовать self, даже если ваш тип в штучной упаковке (см. into_vec), поэтому ваше решение может быть.

pub trait CreateFromBox {
    fn create_from_box(self: Box<Self>) -> Self;
}

#[derive(Debug, Clone)]
struct Foo(u32);
impl CreateFromBox for Foo {
    fn create_from_box(self: Box<Self>) -> Self {
        Self(self.0 + 1)
    }
}

fn main() {
    let a: Box<Foo> = Box::new(Foo(3));
    let tmp = a.clone();
    let b: Foo = tmp.create_from_box();

    println!("{:?} {:?}", a, b);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...