在https://doc.rust-lang.org/book/ownership.html#move-semantics中,它是这样写的:
移动语义 不过,这里还有一些更微妙的地方:生锈确保任何给定的资源都有一个绑定。例如,如果我们有一个向量,我们可以将它分配给另一个绑定:
但是我发现我可以使用gtk-rs来完成这个任务:
let label1: gtk::Label = builder.get_object("label1").unwrap();
let label1_test: gtk::Label = builder.get_object("label1").unwrap();现在两者都指向相同的资源“或发生在我身上的事情。
Builder::get_object被定义为:
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())
}
}虽然这并不是直接来自铁锈的东西,只是来自gtk-rs,但我想知道我是否正确,这有多确定。
也许它可以用Rc
发布于 2017-09-06 09:02:54
GTK/GLib对象(GObject)直接实现引用计数,类似于Rust中的圆弧类型。您可以安全地拥有对同一个对象的多个引用,一旦最后一个引用超出范围,该对象将被销毁。
对于易变性,在锈蚀中,gtk-rs使用内部可变(概念上)。因此,您可以对同一个对象的每个引用进行变异,即使其中存在多个引用。对象的实现必须处理这个问题(无论如何,这是因为C中的GTK/GLib就是这样的)。
https://stackoverflow.com/questions/43988417
复制相似问题