Переместить данные из закрытия

Наконец-то я решил эту проблему! Ввод работает, я могу набирать некоторый текст с помощью кнопок приложения.
Это в дополнение к первому и второму посту на тему «Делаем GTK клавиатуру на Rust».

Нужно добавить glib в список [зависимостей].

glib = "0.15.12"
Вход в полноэкранный режим Выход из полноэкранного режима

И в список кристаллов

use glib::clone;
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь подключаемся и клонируем!()

    button_1.connect_clicked(clone!(
        @strong entry =>
        move |_| {
            entry.insert_text("1", &mut -1);
        }
    ));
Войти в полноэкранный режим Выйти из полноэкранного режима

Каждый раз, когда нам нужно переместить данные из закрытия, мы должны @strong клонировать его. После этого мы можем использовать insert_text() или set() — в зависимости от ваших целей.
Если мы хотим сохранить какое-то значение в переменной, нам нужно @strong эту переменную и использовать Reference Counter. Это часть стандартной библиотеки, поэтому нам не нужно изменять наш файл Cargo.toml.

use std::rc::Rc;
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь создайте переменную типа Rc<Cell<f64>> и клонируйте ее в закрытие.

let some_value: Rc<Cell<f64>> = Rc::new(Cell::new(0.0));
Вход в полноэкранный режим Выйти из полноэкранного режима

Это то же самое, что и в предыдущем примере

@strong entry, @strong some_value =>
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот так! Мы можем набирать текст, изменять ввод и сохранять все

    button_1.connect_clicked(clone!(
        @strong entry, @strong some_value =>
        move |_| {
            set_value(&some_value, 1.0);
            entry.insert_text("1", &mut -1);
        }));
// some code
pub fn set_value(some_value: &Rc<Cell<f64>>, entered_number: f64) {
    some_value.set(some_value.get() * 10.0 + entered_number);
    println!("{}", some_value.get());
}
Войти в полноэкранный режим Выход из полноэкранного режима

Как вы можете видеть, entry и some_value были клонированы в закрытие. Данные переместились в функцию set_value. Здесь мы можем изменить нашу переменную — она будет результатом конкатенации предыдущего и нового значения. Нам нужна get() для получения данных из RC и set() для установки нового значения.
Теперь при каждом нажатии клавиши вы будете видеть обновленное значение переменной в командной строке. Например:
1
15
158

Оцените статью
devanswers.ru
Добавить комментарий