Как получить информацию из записи по нажатию кнопки? - PullRequest
0 голосов
/ 27 октября 2019

Я хочу получить ввод от записи по нажатию кнопки и отобразить эту информацию при нажатии другой кнопки. Это дает мне ошибку, потому что замыкание становится владельцем моей переменной firstname, в которой я хочу сохранить информацию.

Как получить информацию из записи и повторно использовать ее?

// import gtk libs
extern crate gio;
extern crate gtk;

// declare use of gtk
use gtk::prelude::*;

fn main() {
    let mut firstname = String::new();

    if gtk::init().is_err() {
        println!("Failed to initialize GTK.");
        return;
    }
    let glade_src = include_str!("builder.glade");
    let builder = gtk::Builder::new_from_string(glade_src);

    let window: gtk::Window = builder.get_object("window1").unwrap();
    let buttonSubmit: gtk::Button = builder.get_object("buttonSubmit").unwrap();
    let buttonShow: gtk::Button = builder.get_object("buttonShow").unwrap();
    let entryFirstname: gtk::Entry = builder.get_object("entryFirstname").unwrap();

    // get information from entry
    buttonSubmit.connect_clicked(move |_| {
        firstname = entryFirstname.get_buffer().get_text();
    });

    // output information
    let firstname_clone = firstname.clone();
    buttonShow.connect_clicked(move |_| {
        println!("Firstname: {}", firstname_clone);
    });

    window.show_all();

    gtk::main();
}

1 Ответ

0 голосов
/ 28 октября 2019

Как только ваша строка была перемещена внутри замыканий, компилятор больше не может статически проверять, что вы не смешиваете доступ для чтения и записи к ней. Вам нужно использовать RefCell для включения выбора времени доступа для чтения / записи во время выполнения, вероятно, в сочетании с Rc для правильного управления памятью:

let firstname = Rc::new(RefCell::new(String::new()));
let firstname_clone = firstname.clone();
// ...
buttonSubmit.connect_clicked(move |_| {
    firstname.replace(entryFirstname.get_buffer().get_text());
});
// ...
buttonShow.connect_clicked(move |_| {
    println!("Firstname: {}", firstname_clone.borrow());
});
...