Mike
А там не так? Я прост так понял
Маjко
А там не так? Я прост так понял
Там для
http://example.com/handler
http://example.com/handler/data
один вот такой хэндлер:
fn handler(state: State,...) -> ... {
match state {
Some(ref data) => // do with data,
None => // do without data
}
}
Anton
Посоны, ну вот поясните мне ну что за говно такое что я такое не так то делаю, плез.
impl MyStruct {
fn setup_handler(&self) {
entry.connect_activate(move |event| {
self.setup_by_activate(event.get_text());
});
}
}
Пытаюсь из замыкания вызвать self, ругается на лайфчеки, компилятор мне говорит что мол "чувак замыкание живет дольше данных" или чтото вроде того, и я в не могу втупить как же все таки контексты связать то :(
Можете что посоветовать?
Маjко
Маjко
Anton
клон нельзя передать, мне нужно с данными както это все дело связать, есть инпут, есть блок данных страницы, надо на него повесить эвент чтобы при смене текста он делал поиск и менял контент
Anton
Получается нужен некий вечноживущий стор чтоли?(
Маjко
Можно в Arc завернуть страницу
Маjко
Там в поток данные передаются же?
Anton
Да нифига(
Anton
у меня по сути все в одном потоке то gtk-rs юзаю
Anton
ну тоесть брешу, ffi работает для ui в другом потоке, но суть особо не меняется, управление всем я регистрирую в одном потоке
Anton
может я с архитектурой чтото косячу, но у меня есть эвент, есть данные которые нужно менять по хотению
Anton
может есть у кого идеи? А то уже 4 часа долблюсь в глаза с гуглом
Anton
вроде и понимаю что происходит, а как поправить в голову ничего не идет
Filipp
кажется нужен еще один поток и каналы
Anton
Filipp
ща вникну поглубже, момент
Маjко
http://gtk-rs.org/docs/gtk/trait.EntryExt.html#tymethod.connect_activate
Anton
у меня есть эвент, мне нужно из этого ивента получить текст и обработав выполнить функцию смены контента
Anton
Маjко
'static
Маjко
Я могу ошибаться, но это значит, что все сслыки должны жить как минимум 'static
Anton
тобишь внешний доступ к данным закрыт если у них время жизни не больше gtk
Anton
а gtk живет дольше всего потока управления
Filipp
помоему это значит что кложа должна быть статик - т.е. обычной функцией
Маjко
Короче, тут те же требования, что к передаче данных через thread bound, но немного помягче (не нужны Sync+Send)
Anton
круто
Маjко
На кучу данные пихай в Rc или Box
Маjко
Anton
тоесть получается я должен создать еще один поток, в который я должен слать данные, и в другом же месте имплементации должен слушать что мне прийдет текст и там уже связав контексты я должен обработать его?
Anton
Мне кажется или это извращение какое то?
Anton
Ну или какбы, я в отдельном потоке создаю некий стор с данными, потом я эти данные получаю в UI потоке и обрабатываю относительно текущего контекста
Anton
я просто все еще немного не понимаю концепцию сего деяния
Filipp
я запутался
Маjко
Просто не тяни в замыкание ссылки
Маjко
Оберни свои данные в Rc
Anton
Ммм тоесть я делаю обертку с получением статуса данных - мол есть они или нет
Anton
но как это решит проблему вызова функции? Я оборачиваю ссылку на данные в Rc (хотя ссылки нельзя вроде), и отправляю?
Anton
Я сам уже запутался
Маjко
Функция у тебя сейчас принимает первым аргументом &self
Маjко
это ссылка
Маjко
Поменяй функцию на статическую и передавай туда либо Rc<Self> либо Rc<StateOfSelf>
Маjко
То есть те данные, которые в этой функции нужны
Маjко
По крайней мере, я других методов обхода этой проблемы не знаю
Anton
Окей функция статическая, а с замыканием что, положем у меня есть эта статическая функция - но билдер из которого я извлекаю инпут лежит в инстансе структуры в которую я ложу эту обработку, и в послелующем нужно менять эту структуру, обращаясь к ее членам
Anton
Как тогда изъебнуться чтобы в статику инициализированную пихать данные
Anton
Это уже что-то из разряда наркомании
Маjко
Почему статику?
Маjко
У тебя в замыкании будет владение над Rc<Data>
Маjко
Меняй сколько хош
Маjко
Надо только еще RefCell прифигичить
Anton
pub fn setup_entry(_self: Rc<RefCell<Reader>>) {
....
}
Anton
Чтото такое?
Маjко
Да, типа того
Anton
Ок ну предположим я потом закину туда инстанс своей структуры, и оберную в эту шнягу, но разве не получиться ли тогда что это будет просто копия
Anton
и все
Маjко
Нет, не получится
Маjко
Rc — это смартпоинтер
Anton
ну изменю я копию, но мне нужно будет например элементы добавлять и тд
Маjко
Твоя структура будет лежать на куче
Anton
а структура то копия
Маjко
Не копия
Anton
так я походу въезжать начал
Anton
я делаю инстанс структуры, после оборачиваю ее в прямую ссылку как объект, и в Rc для доступа к блоку, после этого уже я вешаю на него эвент, и управляю уже обернутыми данными но без ссылок
Anton
обращаясь к хипу безопасно
Anton
так?
Anton
Или я совсем ебанулся?
Маjко
Делаешь инстанc, оборачиваешь в Rc<RefCell<_>>, они поглощают владение. Дальше работаешь с клонами твоего Rc безопасно, данные в хипе
Anton
Все теперь понял
Anton
хотя все равно очково чот
Маjко
Если что — паникнет в рантайме
Маjко
Все безопасно)
Anton
Anton
окей спасибо
Anton
сейчас попробую
Anton
Кажется я все равно проебался:
// pages.rs
pub struct Pages {
pub reader: Rc<RefCell<Reader>>,
builder: Builder,
pub stack: Stack,
page_about: Box,
page_home: Box
}
fn get_prepared_reader(builder: &Builder) -> Rc<RefCell<Reader>> {
let page_reader: Box = builder.get_object("page_reader").unwrap();
let base = Reader::new();
base.prepare_reader(page_reader);
let reader = Rc::new(RefCell::new(base));
return reader;
}
// app.rs
fn connect_search_activate(entry: Entry, reader: Ref<Reader>) {
entry.connect_activate(move |event| {
let text = event.get_text().unwrap();
reader.print_search(text);
});
}
impl App {
....
fn setup_search(&self) {
let entry = self.builder.get_object("search-input").unwrap();
let reader = self.pages.reader.borrow();
connect_search_activate(entry, reader);
}
}
Anton
[closure@src/app.rs:29:26: 32:4 reader:std::cell::Ref<'_, reader::Reader>]` does not fulfill the required lifetime
Anton
Я чот в пичали