在The Rust Programming Language中,它表示如下:
移动语义
这里有一些更微妙的东西:Rust确保有 与任何给定资源完全绑定。例如,如果我们有 vector,我们可以将它分配给另一个绑定:
但我发现我可以使用gtk-rs执行此操作:
let label1: gtk::Label = builder.get_object("label1").unwrap();
let label1_test: gtk::Label = builder.get_object("label1").unwrap();
现在两者都指向相同的资源“或者发生在我身上的事情。”
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())
}
}
虽然这不是直接来自Rust的东西,只是来自gtk-rs,我想知道我是对的,这有多确定。
也许可以使用Rc
?
答案 0 :(得分:0)
GTK / GLIB对象(GObject)直接实现引用计数,类似于Rust中的Arc类型。您可以安全地对同一个对象进行多次引用,一旦最后一个对象超出范围,对象将被销毁。
对于可变性,在Rust中,gtk-rs使用内部可变性(概念上)。所以你可以改变对同一个对象的每个引用,即使它们有多个。对象的实现必须处理(并且无论如何,因为这是C中GTK / GLib中的工作方式)。