gpt4 book ai didi

rust - 将WebView传递给多个gtk::Button回调时,有没有一种避免克隆的方法?

转载 作者:行者123 更新时间:2023-12-03 11:48:32 30 4
gpt4 key购买 nike

我正在用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_clickedgtk::ButtonExt方法的签名为

fn connect_clicked<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId

最佳答案

不,没有。

回调定义上的'static禁止其引用任何临时变量,并强制其移动并拥有其使用的任何值。这是故意的,因为回调将使创建它的函数失效。

gtk的WebView的行为类似于Rc,因此该克隆非常便宜,并且不会复制任何内容。它仅执行簿记操作,以帮助回调同意其中一个将是最后一个被破坏的回调,因此可以释放底层的WebView数据。

a clone! macro in glib可以帮助进行这些克隆,而无需手动命名额外的变量。

关于rust - 将WebView传递给多个gtk::Button回调时,有没有一种避免克隆的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62263468/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com