Dies ist ein höheres Problem, aber ich bin mir nicht sicher, welche Funktionen von Rust verwendet werden sollten, um die Frage zu verfeinern.Wie erstellt man ein Handle für den Anwendungskontext in Rust?
die ersten Schritte eine grafische Anwendung zu schreiben, die einen Werkzeug API hat, könnten wir den Ball in einem context
Argumente wollen, die verschiedenen Teile der Anwendung macht:
// Where the data lives.
struct Application {
preferences: Preferences,
windows: Vec<Windows>,
documents: Vec<Document>,
}
// A view on the data to pass to tool-code.
struct AppContext {
preferences: &Preferences, // immutable
window: &Window, // immutable
doc: &Document, // mutable
// ... real world use case has more vars ...
}
// example use
fn some_tool_uppercase(context: &mut AppContext, options: &ToolOptions) {
// random example
for w in context.document.words {
w.to_uppercase();
}
context.window.redraw_tag();
}
Wenn dieses Schreiben, ich Probleme mit dem Border-Checker, da das Dokument auch in einer Liste anderer Dokumente gespeichert ist - wodurch es an zwei Stellen gleichzeitig änderbar ist.
Nur um mein Programm kompilieren zu lassen, entferne ich derzeit das Dokument aus der Liste, führe das Werkzeug aus und füge es dann wieder in die Dokumentenliste ein, wenn das Werkzeug fertig ist.
Während es in einigen Fällen möglich ist, mehrere Argumente zu übergeben, ist das obige Beispiel vereinfacht. Es ist unpraktisch, jedes Mitglied des Kontexts als Argument zu übergeben.
Wie soll der Kontext einer Anwendung in einen Typ eingebettet werden, der in den Werkzeugcode übernommen werden kann, ohne dass es zu Komplikationen beim Border Checker kommt?
Ist das 'RefCell' wirklich notwendig in' Arc < Mutex >> '? Der von 'Mutex :: unlock' zurückgegebene Guard gibt bereits einen veränderbaren Zugriff auf die zugrundeliegenden Daten. –
user4815162342
Ich denke, du hast Recht. RefCell wird nur in Kombination mit Rc benötigt. 'Rc>' –
eddy