当把一个WebView传递给多个gtk::Button回调时,有什么方法可以避免克隆?

问题描述 投票:0回答:1

我正在用gtk做一个迷你的web浏览器。这段代码工作得很好,但我想避免所有使用的克隆。

我不能只使用 web_view 对象多次,因为闭包的所有权错误。

extern crate gio;
extern crate gtk;
extern crate webkit2gtk;

use gio::prelude::*;
use gtk::prelude::*;
use gtk::{Application, ApplicationWindow, Button, Entry};
use webkit2gtk::{WebView, WebViewExt};

fn main() {
    let application =
        Application::new(Some("com.github.gtk-rs.examples.basic"), Default::default())
            .expect("failed to initialize GTK application");

    application.connect_activate(|app| {
        let window = ApplicationWindow::new(app);
        window.set_title("Web Browser");
        window.set_default_size(1024, 768);

        let button_back = Button::new_with_label("Back");

        let button_next = Button::new_with_label("Next");

        let button_reload = Button::new_with_label("Reload");

        let url_entry = Entry::new();
        url_entry.set_text("https://www.google.com");

        let button_go = Button::new_with_label("Go");

        let web_view = WebView::new();
        web_view.load_uri("https://www.google.com");

        let clone1: WebView = web_view.clone();
        let clone2: WebView = web_view.clone();
        let clone3: WebView = web_view.clone();
        let clone4: WebView = web_view.clone();

        button_back.connect_clicked(move |_| {
            clone1.go_back();
        });

        button_next.connect_clicked(move |_| {
            clone2.go_forward();
        });

        button_reload.connect_clicked(move |_| {
            clone3.reload();
        });

        button_go.connect_clicked(move |_| {
            clone4.load_uri(&url_entry.get_buffer().get_text());
        });
        window.show_all();
    });

    application.run(&[]);
}

这些是我的依赖版本。

[dependencies]
gtk = "0.8.1"
gio = "0.8.1"
webkit2gtk = "0.9.2"

方法的签名 connect_clicked 的性状 gtk::ButtonExt

fn connect_clicked<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId
rust closures cloning
1个回答
0
投票

不,没有。

'static 在回调定义上禁止它引用任何临时变量,并强制它移动和拥有它使用的任何值。这是故意的,因为回调会比创建它的函数寿命更长。

gtk的 WebView 表现为 Rc,所以克隆是非常便宜的,而且不会复制任何东西。它只是执行记账,帮助回调同意哪一个回调是最后被销毁的,从而释放底层的 WebView 数据。

a clone! 这有助于制作这些克隆,而无需手动命名额外的变量。

© www.soinside.com 2019 - 2024. All rights reserved.