2

Rust 编程语言中,它说的是:

移动语义

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

但我发现我可以使用 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

4

1 回答 1

0

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

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

于 2017-09-06T09:02:54.237 回答