Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
Denis Lisov
@tanriol
По сути, да.
@kanekv Не видел пока такого :-)
Vyacheslav Kim (Kane)
@kanekv
Ну пока нет, но должно!
И он прав, и тут уже вина языка что нельзя выразить такое (пока что)
Denis Lisov
@tanriol
А где писал?
Vyacheslav Kim (Kane)
@kanekv
ну это фиг с ним, пока надо вернуться к баранам, можно снаружи решить не меняя сигнатуры как то?
в блоге у себя - http://smallcultfollowing.com/babysteps/
Denis Lisov
@tanriol
"делать await каждой по очереди" считается решением?
Vyacheslav Kim (Kane)
@kanekv
ну так просто - но лучше было б конкурентно, как last resort конечно так будет работать
Я чисто для общего образования хочу понять как правильно - если все таки надо join_all и еще и сигнатуру менять нельзя
Vyacheslav Kim (Kane)
@kanekv
Пока что только одни извращенные варианты приходят в голову
Denis Lisov
@tanriol
С сохранением сигнатуры, по-моему, нельзя. Такая сигнатура просто по определению говорит, что между циклом и await у нас есть много исключительных ссылок на один и тот же self.
Vyacheslav Kim (Kane)
@kanekv
Думал можно как то с массивом RefCell и оттуда borrow_mut вторым циклом, но это бдсм какой то
Denis Lisov
@tanriol
В любом случае придётся &mut self на &self менять, нет?
Vyacheslav Kim (Kane)
@kanekv
Видимо да, никак, что удивительно, в мультитредах хотя бы мьютексы есть
Vyacheslav Kim (Kane)
@kanekv
Нельзя как то с rc/refcell сделать то же самое что arc/mutex в многопоточном коде?
Denis Lisov
@tanriol
А как ты в многопоточном сделаешь аналогичное с сохранением &mut self?
Vyacheslav Kim (Kane)
@kanekv
Могу я засунуть &mut self в RefCell?
А потом расклонировать через Rc
Vyacheslav Kim (Kane)
@kanekv
@tanriol вот так работает:
        let mut futures = vec![];
        let self_clone = std::rc::Rc::new(std::cell::RefCell::new(self));
        for mx in &mxnames {
            let clone = self_clone.clone();
            futures.push(async move {
                let mut borrow = clone.borrow_mut();
                borrow.lookup_a(mx.as_bytes(), a_type).await
            });
        }
(в принципе точно так же как через Arc/Mutex работало бы)
Хотя может оно и запаникует (мне еще не все понятно тут)
Скорее это неверно, может надо делать через https://docs.rs/futures/0.3.1/futures/lock/struct.Mutex.html#method.lock
Vyacheslav Kim (Kane)
@kanekv
Но тогда concurrency не будет, в общем нормально видимо не получится в этом случае, надо менять все сигнатуры
Alexander Irbis
@alexander-irbis
@kanekv я где-то краем глаза видел упоминание, что асинхронные мьютексы вроде как должны без лишних накладных расходов работать в однопоточном коде. Стоит покопать в этом направлении.
Serhii Plyhun
@snuk182
два года назад РВлоки в одном потоке не работали
мьютексы могут и работать
Alexander Irbis
@alexander-irbis
Хмм, если лок асинхронный, то его неработа в одном потоке убивает всю идею - фьючи ж не знают, в каком потоке они вызывают лок.
Nickolay
@nnovikov
а есть кто в ssl понимает? Делаю я decrypt, пакет 44 байта, так как шифрует оно крастность 16, мне приезжает 48 в буфер длиной 64. Казалось бы в конце должны быть нули, но нет, вижу что-то типа
04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Вопрос: Что за 04 в начале?
Nickolay
@nnovikov
кажется это что-то не относящееся к ssl а такой паддинг на той стороне
Nickolay
@nnovikov
а что будет если сделать u32 as u16? Возьмет младшие 16 бит?
Denis Lisov
@tanriol
По-моему, да, но делать такие вещи явно, на мой вкус, аккуратнее :-)
Nickolay
@nnovikov
хорошо что мне в целом все равно как он это сделает :)
но знать такое полезно
Nickolay
@nnovikov

а вот есть у меня enum, который содержит в себе разные пакеты, что-то типа

enum Packet {
  A(PacketA),
  B(PacketB),
}

Каждый пакет имеет свой magic u32. Как бы сделать объяснить serde что вот этому варианту enum сообтветствует вот такой magic ?

Denis Lisov
@tanriol
По-моему, напрямую serde это пока не умеет (см. serde-rs/serde#1392)
Nickolay
@nnovikov

а как serde определяет какой метод позвать, в доке написано что есть 2 входа
deserializeany()
и когда известен тип то
deserialize
*()

Но в каком случае он позовет deserialize_any() не очень понятно, ведь тип всегда известен?

Denis Lisov
@tanriol

Как правило, тип известен, но не всегда. Например,

#[derive(Serialize)]
#[serde(untagged)]
enum MyData {
    Textual(String),
    Integral(u64),
}

не знает заранее, следует ли ему читать строку или число.

Nickolay
@nnovikov
и у меня он вызывает deserialize_enum()
Denis Lisov
@tanriol
...а дальше?
Nickolay
@nnovikov
а там уже ты пишешь что надо
и вызываешь deserialize_u64() например
но как уговорить его вызвать в самом начале deserialize_any() я не понял
наверно надо самому реализовывать Deserialize и оттуда вызывать
врочем для моего случая другого способа и нет, так что без вааринтов
Psilon
@Pzixel
не уверен что для этого серде нужно юзать
я бы на песты/номы посмотрел
Nickolay
@nnovikov
с nom я уже делал, в 5 версии мне ошибки категорически не нравятся