Size: a a a

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

2020 March 24

YK

Yevhen Kazmin in Rust — русскоговорящее сообществo
вопрос не мой, ждем ответа от @Psilon
источник

YK

Yevhen Kazmin in Rust — русскоговорящее сообществo
я тоже не совсем понимаю проблему двух вызовов foo()
источник

С

Сергей in Rust — русскоговорящее сообществo
Повторный await на ту же футуру - это poll после Ready
источник

С

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

С

Сергей in Rust — русскоговорящее сообществo
Поведение не определено и может вызвать странные эффекты
источник

С

Сергей in Rust — русскоговорящее сообществo
Для нескольких эвейтов обычно берут Stream
источник

В

Вафель in Rust — русскоговорящее сообществo
Alex Zhukovsky
А в расте можно заавейтить два раза одинаковую футуру? Например:

async fn foo() -> i32 {
}


Я могу вместо

let a = foo().await;
let b = foo().await;


написать:

let foo = foo();
let a = foo.await;
let b = foo.await;


? Не важно, можно рц обернуть, клонами, чем угодно, главное что я хочу вызвать foo один раз.
Чтобы такое нормально сделать, надо клонировать по идее. Но футуры из async fn не клонируются :(
источник

АГ

Алексей Герасимов in Rust — русскоговорящее сообществo
Вафель
Чтобы такое нормально сделать, надо клонировать по идее. Но футуры из async fn не клонируются :(
А почему не клонируются? потому что при клонировании они могут быть уже запущены и такое клонирование кажется странным позволять?
источник

В

Вафель in Rust — русскоговорящее сообществo
Алексей Герасимов
А почему не клонируются? потому что при клонировании они могут быть уже запущены и такое клонирование кажется странным позволять?
Потому что они impl Future, а не impl Future + Clone
источник

АГ

Алексей Герасимов in Rust — русскоговорящее сообществo
Вафель
Потому что они impl Future, а не impl Future + Clone
ну а что мешает компилятору генерировать Clone если возможно и нужно? или просто никому не нужно?
источник

В

Вафель in Rust — русскоговорящее сообществo
Алексей Герасимов
ну а что мешает компилятору генерировать Clone если возможно и нужно? или просто никому не нужно?
Да ничего не мешает, просто никто такого не сделал/не обдумал/не объяснил кор тиме зачем такое нужно
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Yevhen Kazmin
я тоже не совсем понимаю проблему двух вызовов foo()
у тебя может не быть foo
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
тлдр: вопрос в том, можно ли написать такую функцию:

fn run_twice<T>(f: impl Future<T>) -> Future<(T, T)> { ... }
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Алексей Герасимов
А почему не клонируются? потому что при клонировании они могут быть уже запущены и такое клонирование кажется странным позволять?
полузапущенной футуры по идее ты не увидишь, потому что либо она не запущена, либо отдана в реактор
источник

АГ

Алексей Герасимов in Rust — русскоговорящее сообществo
а если она является составной чатью моей рукописной футуры, и я вручную ее поллю?
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Alex Zhukovsky
А в расте можно заавейтить два раза одинаковую футуру? Например:

async fn foo() -> i32 {
}


Я могу вместо

let a = foo().await;
let b = foo().await;


написать:

let foo = foo();
let a = foo.await;
let b = foo.await;


? Не важно, можно рц обернуть, клонами, чем угодно, главное что я хочу вызвать foo один раз.
Так тебе же не футуру нужно дважды эвейтить, а функцию вызвать второй раз
источник

Э

Эрик in Rust — русскоговорящее сообществo
Если они идентичны, то результат совпадёт. А если не идентичны, то не совпадёт. Подели foo() на идентичную и неидентичную части, а потом сделай

let f = foo();
let a = f.do_non_identical().await;
let b = f.do_non_identical().await;
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Alex Zhukovsky
А в расте можно заавейтить два раза одинаковую футуру? Например:

async fn foo() -> i32 {
}


Я могу вместо

let a = foo().await;
let b = foo().await;


написать:

let foo = foo();
let a = foo.await;
let b = foo.await;


? Не важно, можно рц обернуть, клонами, чем угодно, главное что я хочу вызвать foo один раз.
Футура символизирует результат вызова функции. Ты хочешь дождаться одного и того же результата дважды
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Эрик
Если они идентичны, то результат совпадёт. А если не идентичны, то не совпадёт. Подели foo() на идентичную и неидентичную части, а потом сделай

let f = foo();
let a = f.do_non_identical().await;
let b = f.do_non_identical().await;
Ок, перефразирую: как написать генерик-функцию do_non_identical для любой футуры?
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
Алексей Герасимов
а если она является составной чатью моей рукописной футуры, и я вручную ее поллю?
ну тогда фигня будет, но предполагается, что не будешь
источник