Size: a a a

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

2020 March 24

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
🦉 ⁣
Футура символизирует результат вызова функции. Ты хочешь дождаться одного и того же результата дважды
а как представить вычисление самой футуры (кроме как || foo()) ?
источник

DS

Doge Shibu in Rust — русскоговорящее сообществo
Вы не знаете какой-нибудь тулзы для раста, которая бы могла бы в рефакторинг "introduce generic"?

А-ля добавляешь дженерик в тип и во все функции, что его используют добавляется этот дженерик.
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Alex Zhukovsky
а как представить вычисление самой футуры (кроме как || foo()) ?
Никак
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Это тоже самое что Result, только ленивый
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Просто ещё раз вызови функцию
источник

AZ

Alex Zhukovsky in Rust — русскоговорящее сообществo
а если у меня нет фунцкии?
источник

AZ

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

fn run_twice<T>(f: impl Future<T>) -> Future<(T, T)> { ... }
вот пример - тут нет никакой функции
источник

🦉⁣

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

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

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
После того как футура стала Ready, все
источник

r

red75prime in Rust — русскоговорящее сообществo
Alex Zhukovsky
а как представить вычисление самой футуры (кроме как || foo()) ?
async fn foo() -> T возвращает impl Future<Output = T>, если что
источник

RP

Roman Proskuryakov 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 являются генераторами, которые падают, если два раза заавейтить. Но ты можешь создать ручками функцию, которая возвращает impl future с твоей логикой, хоть это и не рекомендуется
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Кстати, а почему в Rust футуры не кешируют результат и не возвращают его при повторных авейтах как примерно во всех остальных языках? Из-за передачи владения?
источник

🦉⁣

🦉 ⁣ in Rust — русскоговорящее сообществo
Alexander Tchitchigin
Кстати, а почему в Rust футуры не кешируют результат и не возвращают его при повторных авейтах как примерно во всех остальных языках? Из-за передачи владения?
да
источник

Э

Эрик in Rust — русскоговорящее сообществo
Владение, zero-cost-abstractions, вот это вот всё.
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Эрик
Владение, zero-cost-abstractions, вот это вот всё.
Зря исправили - sero-cost ближе к истине. 😃
источник

RP

Roman Proskuryakov in Rust — русскоговорящее сообществo
Alexander Tchitchigin
Кстати, а почему в Rust футуры не кешируют результат и не возвращают его при повторных авейтах как примерно во всех остальных языках? Из-за передачи владения?
Угу. Это не надо делать, так как футуры нельзя поллить после их резолва. Но это «нельзя» только на словах, а не в системе типов, поэтому придумали всякие FusedFuture и FusedStream
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Roman Proskuryakov
Угу. Это не надо делать, так как футуры нельзя поллить после их резолва. Но это «нельзя» только на словах, а не в системе типов, поэтому придумали всякие FusedFuture и FusedStream
Я в детали и близко не вдавался, но "не в системе типов" звучит странновато, поскольку в целом владение-то в системе типов, и не понятно, почему оно не работает для футур...
источник

Э

Эрик in Rust — русскоговорящее сообществo
Alexander Tchitchigin
Я в детали и близко не вдавался, но "не в системе типов" звучит странновато, поскольку в целом владение-то в системе типов, и не понятно, почему оно не работает для футур...
Сложныа!
источник

Э

Эрик in Rust — русскоговорящее сообществo
Кто должен владеть? Сколько футура живёт?
источник

r

red75prime in Rust — русскоговорящее сообществo
Alexander Tchitchigin
Я в детали и близко не вдавался, но "не в системе типов" звучит странновато, поскольку в целом владение-то в системе типов, и не понятно, почему оно не работает для футур...
poll() вызывается периодически, поэтому не может поглощать футуру
источник