Alexander
Alexander
Наконец растец хоть выучу, так как питон не пошёл.
Слава
Я правильно понимаю, что на обложке - рак?
պլհկ
Нет
Alexander
Раст вон слева на водоросли сидит наверное. А в центре это наверняка какой-то менеджер.
deepcode.eth
вот похожий крабик, только без шестерёнки на спине
კაცი
Я правильно понимаю, что на обложке - рак?
ты раков что-ли никогда не видел?
Berkus
Tuntz
коллеги, а как реализовать трейт для разных типов Fn?
Слава
ты раков что-ли никогда не видел?
Мне интересен замысел художника, что он хотел изобразить.
Tuntz
ругается на conflicting implementations если через дженерик
Tuntz
а для Box делать не хочу потому что не эргономично замыкания подставлять
Tuntz
trait MyTrait { fn do(&self, ctx: Context) -> Box<Future<Item = MyType, Error = Error>> } impl<F: Fn(Context) -> Box<Future<Item = MyType, Error = Error>>> MyTrait for F { ... } impl<F: Fn(&mut Context) -> Result<MyType, Error> > MyTrait for F { ... }
Tuntz
так пишет ошибку
Anonymous
<стикер из твин пикс>
Cuno
https://doc.rust-lang.org/src/core/ops/function.rs.html#143-147
Cuno
а, нет, не так прочитал -_-
Cuno
А зачем это вообще надо? Чтобы писать closure.do(ctx) вместо closure(ctx) или closure(&mut ctx)?
чтобы closure в качестве аргумента в функцию передавать, например
Cuno
см пример выше с NewService
red75prime
Если надо передать клозуру которая принимает &mut Ctx, передаём |mut ctx|{closure(&mut ctx)}
Cuno
Если надо передать клозуру которая принимает &mut Ctx, передаём |mut ctx|{closure(&mut ctx)}
посмотри на исходный пример внимательней, там они разные типы возвращают вообще
Cuno
при этом в трейте возвращаемый тип общий
Cuno
т.е. для разных замыканий будет разная логика
𝙽𝚒𝚌𝚔
т.е. для разных замыканий будет разная логика
На мой взгляд это какая-то ошибка в дизайне, идея даже если реализуема, нуждается в переформулировании или каком-то другом решении.
𝙽𝚒𝚌𝚔
Можно обернуть в newtype на худой конец и избежать всех этих граблей
red75prime
т.е. для разных замыканий будет разная логика
Тогда делать враппер. https://play.rust-lang.org/?gist=9d8418fa00b10187046d5e013eb4d4c7&version=stable&mode=debug&edition=2015
Cuno
(исходный вопрос задавал не я, пингуйте @vorot93 )
Anonymous
какой?
Тот самый
Anonymous
Alexander
А в playground можно с tokio играть?
Vladimir
А в playground можно с tokio играть?
Поидее, проверить можешь же
Alexander
Ну просто ещё надо уметь что-то несетевое дёргать кроме таймера.
Vladimir
Ну просто ещё надо уметь что-то несетевое дёргать кроме таймера.
Для теста достаточно экстерн крейта сделать
Alexander
Ну надо ещё чтоб не убилось через секунду, там же ограничения. Впрочем похоже что оно только после 7 секунд убивается - работает.
Tuntz
можно было бы написать как синхронно, так и асинхронно
Tuntz
если синхронно, то вернуть MyType и мутировать Context
Tuntz
если асинхронно, то сожрать Context и вернуть его вместе с MyType
Денис
https://www.reddit.com/r/rust/comments/92eukb/httpsgitlabcommexusfuturesretry/
Alexander
Alexander
Alexander
А через core работало почему-то.
Alexander
Почему select не простой стрим выдаёт?
Alexander
Запутался уже - сорян.
Денис
селект выдаёт тупл из обоих фьючеров
Денис
точнее результат одного + другой фьючер
Денис
Alexander
Ага, и как его запустить тогда просто как один стрим?
Денис
for_each возвращает фьючу, а не стрим
Денис
tokio::run(i1.select(i2).map(|_| ()).map_err(|_| ()))
Anton
Alexander
tokio::run(i1.select(i2).map(|_| ()).map_err(|_| ()))
Но получается мы вторую фьючу игнорим?
Денис
ну это тебе решать =) если ты хочешь выйти, когда какая-либо из фьюч завершится, то юзай селект; иначе юзай джойн
Alexander
Признаться что-то доки по tokio что-то ньюансы не раскрывают.
Денис
(это если чё не токийская тема, а фьючи)
Денис
ну и да, у них имхо с туториалами туговато
Alexander
Оно вроде если на пальцах - то вроде всё изи, а как начинаешь писать - то что-то не сходится.
Денис
ну надо доки смотреть, какие где типы возвращаются :)
Alexander
ну это тебе решать =) если ты хочешь выйти, когда какая-либо из фьюч завершится, то юзай селект; иначе юзай джойн
Сорян, у меня немного другое понимание - селект выполняет готовую фьючу из двух, а джоин ждёт завершения первой, а потом второй - это правильно?
Денис
фьючи в обоих случаях запускаются параллельно, селект ждёт любой из готовых, и если ты сделаешь как я предложил, другая просто дропнется; а джойн будет ждать завершения обеих
Денис
я же говорю, что они запускаются одновременно
Alexander
Ааа, в том плане, что если она закончится - то селекту плевать?
Денис
в случае селекта, когда какая-то из фьючь завершится, то селект сразу выйдет, и другая фьюча будет тебе доступна через возвращаемое значение. если сделаешь как я предложил — .map(|_|()), то эта другая фьюча просто дропнется
Alexander
А, ну в том плане, что можно её например потом вручную ну например запустить, если надо. Понял, спасибо.
Alexander
Т.е. она её возвращает ну просто на всякий случай .
Денис
да, всё так, там второй возвращаемый тип — https://docs.rs/tokio/0.1.7/tokio/prelude/future/struct.SelectNext.html
Alexander
А делается это видимо за тем что фьюча овнится, а то бы просто можно было бы её определение выше использовать.
Денис
да)
Маjко
Посуны
Маjко
Тут был мемасик
Маjко
В котором краб уничтожает город