Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust GTK rs Builder::get_对象的这种行为有多安全?_Rust_Gtk Rs - Fatal编程技术网

Rust GTK rs Builder::get_对象的这种行为有多安全?

Rust GTK rs Builder::get_对象的这种行为有多安全?,rust,gtk-rs,Rust,Gtk Rs,在中,它说的是: 移动语义 不过,这里还有一些更微妙的地方:锈迹确保了这一点 对任何给定资源只有一个绑定。例如,如果我们有一个 向量,我们可以将其分配给另一个绑定: 但我发现我可以使用gtk rs来实现这一点: let label1: gtk::Label = builder.get_object("label1").unwrap(); let label1_test: gtk::Label = builder.get_object("label1").unwrap(); 现在两者都指向同一个

在中,它说的是:

移动语义

不过,这里还有一些更微妙的地方:锈迹确保了这一点 对任何给定资源只有一个绑定。例如,如果我们有一个 向量,我们可以将其分配给另一个绑定:

但我发现我可以使用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())
    }
}
pub fn get_对象(&self,name:&str)->选项{
不安全{
选项:::from_glib_none(
ffi::gtk_生成器_get_对象(self.to_glib_none().0,name.to_glib_none().0))
然后(| obj | obj.downcast().ok())
}
}

虽然这不是真正的东西从生锈直接,只是从gtk的rs,我想知道我是否是正确的,这是如何确定

也许它可以使用
Rc

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


对于易变性,在Rust中,gtk rs使用内部易变性(概念上)。因此,即使存在多个引用,也可以对同一对象的每个引用进行变异。对象的实现必须处理这个问题(而且无论如何都必须这样做,因为这就是GTK/GLib在C中的工作方式)。

IIRC GLib对象本身已经被引用计数,因此不需要在其上再添加一层Rc。@kennytm感谢您的评论。