GTK-rs Builder :: get_object的这种行为有多安全?

时间:2017-05-15 20:37:30

标签: rust gtk-rs

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();

现在两者都指向相同的资源“或者发生在我身上的事情。”

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())
    }
}

虽然这不是直接来自Rust的东西,只是来自gtk-rs,我想知道我是对的,这有多确定。

也许可以使用Rc

1 个答案:

答案 0 :(得分:0)

GTK / GLIB对象(GObject)直接实现引用计数,类似于Rust中的Arc类型。您可以安全地对同一个对象进行多次引用,一旦最后一个对象超出范围,对象将被销毁。

对于可变性,在Rust中,gtk-rs使用内部可变性(概念上)。所以你可以改变对同一个对象的每个引用,即使它们有多个。对象的实现必须处理(并且无论如何,因为这是C中GTK / GLib中的工作方式)。