2017-05-15 1 views
2

In The Rust Programming Language, sagt es so etwas wie:Wie sicher ist dieses Verhalten von GTK-rs Builder :: get_object?

Verschieben Semantik

Es gibt etwas mehr Subtilität hier, obwohl: Rost sorgt dafür, dass genau eine zu jeder gegebenen Ressource ist es verbindlich. Zum Beispiel, wenn wir einen Vektor haben, können wir es auf eine andere Bindung zuweisen:

Aber ich fand, dass ich das gtk-rs verwenden können:

let label1: gtk::Label = builder.get_object("label1").unwrap(); 
let label1_test: gtk::Label = builder.get_object("label1").unwrap(); 

Beide nun auf den gleichen Punkt Ressource "oder etwas passiert mir."

Builder::get_object wie folgt definiert ist:

pub fn get_object<T: IsA<Object>>(&self, name: &str) -> Option<T> { 
    unsafe { 
     Option::<Object>::from_glib_none(
      ffi::gtk_builder_get_object(self.to_glib_none().0, name.to_glib_none().0)) 
      .and_then(|obj| obj.downcast().ok()) 
    } 
} 

Obwohl diese direkt etwas von Rust nicht wirklich ist, nur von gtk-rs, ich frage mich, ob ich recht habe und wie sicher ist dies.

Vielleicht könnte es Rc verwenden?

+2

IIRC Die glib-Objekte selbst sind bereits als Referenz gezählt, so dass keine weitere Schicht Rc darüber hinzugefügt werden muss. – kennytm

+0

@kennytm Vielen Dank für Ihren Kommentar. –

Antwort

0

GTK/GLib-Objekte (GObject) implementieren die Referenzzählung direkt, ähnlich dem Arc-Typ in Rust. Sie können sicher mehrere Referenzen auf dasselbe Objekt haben, und sobald die letzte außerhalb des Gültigkeitsbereichs liegt, wird das Objekt zerstört.

Für Mutabilität, in Rust, verwendet gtk-rs interne Veränderlichkeit (konzeptionell). Sie können also jede Referenz auf dasselbe Objekt mutieren, auch wenn es mehrere davon gibt. Die Implementierung der Objekte muss damit umgehen (und muss sowieso, denn so funktioniert es in GTK/GLib in C).

Verwandte Themen