Size: a a a

Rust — русскоговорящее сообществo

2020 March 03

OA

Oleg Andreev in Rust — русскоговорящее сообществo
folex
Как тут лучше быть? Обернуть outlet в Option, и выставлять его потом в None? Как-то это…
Option<channel> норм
источник

f

folex in Rust — русскоговорящее сообществo
Oleg Andreev
Option<channel> норм
источник

f

folex in Rust — русскоговорящее сообществo
Ну и на самом деле я понял, что это всё не очень правильно. У oneshot::channel и mpsc::unbounded не зря такой дизайн. В одну структуру засунуть их засунешь, а через async boundary протащить не выйдет.
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
а зачем в одну структуру оба конца класть?
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
я думал ты хочешь только ресивер положить в опшин
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
(ну или в стрим)
источник

f

folex in Rust — русскоговорящее сообществo
Ну голова так работает :) Хочется всё абстрагировать, чтобы не думать о кишках. Но пока не выходит.
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
ну в скриптовом языке у тебя это было бы так потому что Rc/Gc не виден. А в расте тогда - Rc::new() и два конца будут все равно, только в виде двух смартпоинтеров на структуру с обоими концами
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
короче, проще сделать отдельно сендер и ресивер. Сендер передать тому, кто сигналит, а ресивер читать в своем select! блоке
источник

f

folex in Rust — русскоговорящее сообществo
угу, тут по-другому дизайнить надо как-то. Пока еще думаю, как. Придумаю – расскажу
источник

f

folex in Rust — русскоговорящее сообществo
Или спрошу :)
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
это не те кишки, о которых стоит волноваться =)
источник

m

mAX in Rust — русскоговорящее сообществo
Товарищи, хочу имплементировать свой трейт Arg для простых типов вроде u8 u32 и тд
также хочу имплементировать его для все типов которые имплементируют трейт protobuf::Message
получается
pub trait Arg { ... }
impl Arg for bool { ... }
impl<T> Arg for T where T: protobuf::Message { ... }

получаю ошибку

conflicting implementation for bool
n
ote: upstream crates may add a new impl of trait protobuf::core::Message for type bool in future versions

Подскажите пожалуйста как это разрулить и откуда она вообще берется..
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
См. "orphan rule". Ты не можешь иметь две потенциально конфликтующие реализации трейта на один и тот же тип. В твоем случае второй импл имеет трейт баунд на внешний трейт. Если б он был объявлен в твоем же крейте, то ты бы мог так написать и компилятор проверил бы что у тебя нет impl protobuf::Message for bool (из-за конфликтов). А поскольку протобуф - из другого крейта, то кто-то там может объявить impl protobuf::Message for bool и тогда будет конфликт с твоей либой.
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
в твоем случае фикс такой: сделай тип-обертку вокруг protobuf::Message и объяви Arg для него. Тогда компилятор увидит что этот тип не пересекается с bool/u8/u16 и все ок
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
типа struct<M: protobuf::Message> ProtoMsg(M). Перед парсингом - упаковываешь, после парсинга - вынимаешь через .0
источник

RP

Roman Proskuryakov in Rust — русскоговорящее сообществo
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
☝️
источник

m

mAX in Rust — русскоговорящее сообществo
Понял, Спасибо больше! буду разбираться)
источник

OA

Oleg Andreev in Rust — русскоговорящее сообществo
pub trait Arg { ... }
impl Arg for bool { ... }
impl<T> Arg for
ProtoMsg<T> where T: protobuf::Message { ... }
источник