Правильно работать с графическими данными - PullRequest
0 голосов
/ 03 февраля 2020

Есть похожих вопросов , но они не совсем отвечают моему точному варианту использования.

ApplicationState имеет ребенка и родителя. У родителя также есть дочерний элемент, который должен быть тем же дочерним элементом в ApplicationState. ApplicationState должен «владеть» ребенком, а родитель должен иметь неизменную ссылку на ребенка. Как правильно структурировать и аннотировать график таким образом? Вот простой пример:

struct ApplicationState {
    child: Child
    parent: Parent
}

struct Child {
    id: i32
}

struct Parent <'a> {
    id: i32
    child: &'a Child<'a>
}

impl ApplicationState {
    fn new () -> Self {
        let child = Child { id: 1 };
        AppState {
            child: child,
            parent: Parent::new(&child)
        }
    }
}

impl Parent {
    fn new (child: & Child) -> Self {
        Parent {
            id: 2,
            child: child
        }
    }

    fn getChildId (&self) -> i32 {
        let id = self.id.copy();
        id
    }
}

Этот код не будет работать, потому что child заимствован из области видимости, но он должен продемонстрировать, что я пытаюсь сделать. В основном, запустите ApplicationState.parent.getChildId(), чтобы вернуть 1.

Я мог бы, вероятно, использовать Box<Child>, но тогда я размещаю данные в куче, которая менее эффективна. Кроме того, Child все еще нужно будет мутировать через ApplicationState.

Это кажется достаточно распространенной проблемой, но другие потоки, на которые я смотрел, эффективно говорят: «Не структурируйте ваши данные, которые путь "не помогают, когда есть основное требование ссылки.

1 Ответ

0 голосов
/ 04 февраля 2020

Я переосмыслил это, частично из-за моего варианта использования, который включал несколько дополнительных функций. Это на самом деле гораздо проще, чем я думал. Часть моего мыслительного процесса была ошибочной в результате использования основанной на наследовании парадигмы.

fn main() {
    let mut state: State = State {
        parent: Parent { x: 1, y: 1 },
        child: Child {
            x: 5,
            y: 1,
            parent: None,
        },
    };
    state.child.parent = Some(&state.parent);
    state.child.getParentX(); // prints "1"
}

struct Parent {
    x: i32,
    y: i32,
}

struct Child<'a> {
    x: i32,
    y: i32,
    parent: Option<&'a Parent>,
}

impl Child<'_> {
    fn getParentX(&self) {
        println!("{:?}", self.parent.unwrap().x);
    }
}

struct State<'a> {
    parent: Parent,
    child: Child<'a>,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...