Rust: 'рдкреНрд░рддреАрдХреНрд╖рд┐рдд' рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд╣рд▓ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЬрдире░ 2019  ┬╖  512рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХреГрдкрдпрд╛ https://github.com/rust-lang/rust/issues/50547 рдХреА рдЬрд╛рдБрдЪ


рдЪрд░рд╡рд╛рд╣реЛрдВ рд╕реЗ рдиреЛрдЯ:

рдпрджрд┐ рдЖрдк рдЗрд╕ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдирдП рд╣реИрдВ, рддреЛ https://github.com/rust-lang/rust/issues/57640#issuecomment -456617889 рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ https: //github.com/rust-lang/rust/issues/57640#issuecomment -+рекрел,ренрез,режрез,резреорежред (рд╕рд╛рднрд╛рд░, @traviscross!)

A-async-await AsyncAwait-Focus C-tracking-issue T-lang

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреА рд╣реИрдВред


Kotlin

val result = task.await()

рд╕реА

var result = await task;

рдПрдл

let! result = task()

рд╕реНрдХреЗрд▓рд╛

val result = Await.result(task, timeout)

рдЕрдЬрдЧрд░

result = await task

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ

let result = await task;

рд╕реА ++ (рдХреЛрд░рдЖрдЙрдЯреНрд╕ рдЯреАрдЖрд░)

auto result = co_await task;

рдХрд┐рд░рд╛рдпреЗ рдХрд╛

$result = await task;

рддреАрд╡реНрд░ рдЧрддрд┐

var result = await task;

рдЙрд╕ рд╕рдм рдХреЗ рд╕рд╛рде, рдЖрдЗрдП рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрдВрдЧ рдХреЗ рднрд╛рд╡ рдХрдИ рдЬрдВрдЬреАрд░ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдПрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред

рд╕рднреА 512 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреА рд╣реИрдВред


Kotlin

val result = task.await()

рд╕реА

var result = await task;

рдПрдл

let! result = task()

рд╕реНрдХреЗрд▓рд╛

val result = Await.result(task, timeout)

рдЕрдЬрдЧрд░

result = await task

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ

let result = await task;

рд╕реА ++ (рдХреЛрд░рдЖрдЙрдЯреНрд╕ рдЯреАрдЖрд░)

auto result = co_await task;

рдХрд┐рд░рд╛рдпреЗ рдХрд╛

$result = await task;

рддреАрд╡реНрд░ рдЧрддрд┐

var result = await task;

рдЙрд╕ рд╕рдм рдХреЗ рд╕рд╛рде, рдЖрдЗрдП рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрдВрдЧ рдХреЗ рднрд╛рд╡ рдХрдИ рдЬрдВрдЬреАрд░ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдПрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред

рдЙрд╕ рд╕рдм рдХреЗ рд╕рд╛рде, рдЖрдЗрдП рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрдВрдЧ рдХреЗ рднрд╛рд╡ рдХрдИ рдЬрдВрдЬреАрд░ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдПрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред

рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдПрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рд╣реИрдВред рдЗрдирдореЗрдВ рд░рд╕реНрдЯ, рдХреЛрдЯрд▓рд┐рди, C # (рдЬреИрд╕реЗ рд╡рд┐рдзрд┐-рд╕рд┐рдВрдЯреИрдХреНрд╕ LINQ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдмрд┐рд▓реНрдбрд░реЛрдВ) рдФрд░ F # рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╛рдж рд╡рд╛рд▓реЗ рдПрдХ рд╣реА рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдк рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдореЗрд░реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд┐рд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЬрдВрдЧрд▓ рдореЗрдВ рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ рджрд░реНрдЬрди + рд╡рд┐рдзрд┐ рдЬрдВрдЬреАрд░ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдареАрдХ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЪрд▓рд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЕрдиреНрдпрддреНрд░ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред

рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ # 50547 рдХреЗ рд╢реАрд░реНрд╖ рдкрдж рдкрд░ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ (рдЪреЗрдХ рдмреЙрдХреНрд╕ рдХреЗ рдкрд╛рд╕ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕")ред

Kotlin

val result = task.await()

рдХреЛрдЯрд▓рд┐рди рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ:

val result = doTask()

await рдХреЗрд╡рд▓ suspendable function , рди рдХрд┐ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреА рдЪреАрдЬред

рдЙрд╕ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреЛрдЯрд▓рд┐рди рдЕрдзрд┐рдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рдпрджрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрд╕реБрдХ рд╣реИрдВред рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ, рдЬреЛ рдЕрдиреНрдп рд╕реНрдердЧрд┐рдд рдмреНрд▓реЙрдХреЛрдВ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред

@cramertj рдЪреВрдВрдХрд┐ https://github.com/rust-lang/rust/issues/50547 рдореЗрдВ 276 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ, рдХреНрдпрд╛ рдЖрдк рд╡рд╣рд╛рдВ рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рди рджреЛрд╣рд░рд╛рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реЛ? (рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдБ рдУрдкреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ?)

рдХреЛрдЯрд▓рд┐рди рдЕрдзрд┐рдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рдпрджрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрд╕реБрдХ рд╣реИрдВред рдпрд╣ рдЕрднреА рднреА рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ, рдЬреЛ рдЕрдиреНрдп рд╕реНрдердЧрд┐рдд рдмреНрд▓реЙрдХреЛрдВ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрджрд░реНрдн / рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд▓рдВрдЧреВрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдЧреЛ-рд▓реИрдВрдЧ?

рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрд▓рд░реНрд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рдмрд╣реБрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИ: рдЖрдк рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рддреНрдпрд╛рдЧ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд░рд┐рдгрд╛рдо рдЖрдкрдХреЗ рд╕реНрдЯреИрдХ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╕рдВрдж рдХрд░реВрдБрдЧрд╛ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди-рдкреИрд░реЗрдВрдЯрд┐рд╕рд┐рд╕ рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди-рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЧрд▓реЗ рд▓рдЧрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВ, рддрд╛рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рд┐рдВрдХ рдФрд░ рдПрд╕рд┐рдВрдХреНрд╕ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЧрдд рд╣реЛред

рд▓реЗрдХрд┐рди рдЬрдмрдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдзрдирд╡рд╛рдкрд╕реА рд╢реИрд▓реА рдкрд░ рдмрд╣рд╕ рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдореИрдВ рдЧрд╡рд╛рд╣ рдХреА рддрд░рдл рд╣реВрдВ, рдХреНрдпрд╛ рдПрдХ рдХреЙрд░рдЖрдЙрдЯ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рд╕рдВрднрд╡рдд: рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдирд┐рд░реНрдорд╛рдг (рдпрд╛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреЙрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣рдо рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рдЕрдзрд┐рдХ рдЖрд░рд╛рдо рд╕реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреНрд░рдо рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдФрд░ .await!() рдХрдореЛрдмреЗрд╢ betwen normal рдХреЙрд▓реНрд╕ рдФрд░ coroutine рдХреЙрд▓реНрд╕ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдирдореНрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреНрдпреЛрдВ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдХреБрдЫ рдирдпрд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП:

  • future(?)
  • рдпрд╛ future(await) рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреНрд░реЗрдбрдСрдлрд╝ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рднреНрд░рд╛рдордХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреЛрд╕реНрдЯ рдХреЗ рдиреАрдЪреЗ рджреЗрдЦреЗрдВред

рдЕрдиреНрдп рдереНрд░реЗрдб рд╕реЗ рдПрдХ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдкрдирд╛рдирд╛ ( logger.log рдХреЛ рднреА рдПрдХ coroutine рд╣реЛрдирд╛, рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рддреБрд░рдВрдд рдХреЙрд▓ рдХрд░рдирд╛ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ):

async fn log_service(&self) -> T {
   let service = self.myService.foo(); // Only construction
   self.logger.log("beginning service call")(?);
   let output = service(?); // Actually wait for its result
   self.logger.log("foo executed with result {}.", output)(?);
   output
}

рдФрд░ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде:

async fn log_service(&self) -> T {
   let service = self.myService.foo(); // Only construction
   self.logger.log("beginning service call")(await);
   let output = service(await);
   self.logger.log("foo executed with result {}.", output)(await);
   output
}

рдЕрдкрдардиреАрдп рдХреЛрдб рд╕реЗ рдмрдЪрдиреЗ рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди рдХреЗ рдмрд╛рдж рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рди рдХрд┐ рдЙрд╕рдХреЗ рдФрд░ рдЦреБрд▓реЗ рдкрд░рд╛рди рдХреЗ рдмреАрдЪред рддреЛ future(? ) рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдмрдХрд┐ future( ?) рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣ рд╕рдорд╕реНрдпрд╛ future(await) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬрд╣рд╛рдВ рд╕рднреА рд╡рд░реНрддрдорд╛рди рдЯреЛрдХрди рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдиреНрдп рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд (рдЬреИрд╕реЗ рдХрд┐ рд╡рд░реНрддрдорд╛рди ? -try) рднреА рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рд╣реИ:

async fn try_log(message: String) -> Result<usize, Error> {
    let logger = acquire_lock()(?);
    // Very terse, construct the future, wait on it, branch on its result.
    let length = logger.log_into(message)(?)?;
    logger.timestamp()(?);
    Ok(length)
}

рдпрд╛

async fn try_log(message: String) -> Result<usize, Error> {
    let logger = acquire_lock()(await);
    // Very terse, construct the future, wait on it, branch on its result.
    let length = logger.log_into(message)(await)?;
    logger.timestamp()(await);
    Ok(length)
}

рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдХрд╛рд░рдг:

  • .await!() рдпрд╣ рдЙрд╕ рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП рдЕрд▓рд╛рдЙрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
  • рдпрд╣ рдХреЙрд▓ рдХреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рдкреВрд░реНрд╡рд╡рд░реНрддреАрддрд╛ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ ? рдкреАрдЫрд╛ рдХрд░рдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЗрд╕рд╕реЗ рдкреНрд░реАрдЯреЗрдВрдбреЗрдВрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд░рд╣рддреА рд╣реИ рдФрд░ рд╕реАрдЦрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣рдореЗрд╢рд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд░рд╣реА рд╣реИрдВ (рднрд▓реЗ рд╣реА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ), рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ my_await!() рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдХреЛрдИ рдЙрдореНрдореАрдж рди рд╣реЛ, рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдкреНрд░рднрд╛рд╡ рд╣реЛред
  • рдпрд╣ рдЬрдирд░реЗрдЯрд░ рдФрд░ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдРрд╕реЗ рдЬрдирд░реЗрдЯрд░ рдЬреЛ рдкреБрди: рдкреНрд░рд╛рдкреНрддрд┐ рдкрд░ рдЕрдзрд┐рдХ рддрд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ FnOnce рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрдмрдХрд┐ Streams FnMut рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдХреЛ рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ Futures рдкрд╣рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ ? Poll рд╕рд╛рде рд╕рднреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ (рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╕реНрдерд┐рд░реАрдХрд░рдг рдЕрдиреБрдХреНрд░рдо рдпрд╣рд╛рдВ)ред рдПрдХ рд╕реАрдЦрдиреЗ рдХреЗ рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдореЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП ? рдЖрдзрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рднреА рд╣реИред рджреВрд╕рд░реА рдУрд░ (await) рдЗрд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрд╢рд╛ рдбрд╛рдпрд╡рд░реНрдЬреЗрдВрдЯ рдмрд┐рдВрджреБ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдЧрд╛ред
  • рдпрд╣ рдлрд╝рдВрдХреНрд╢рди-рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рддрд░реНрдХ рдХреЗрд╡рд▓ рддрднреА рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдЖрдк рдореБрдЭрд╕реЗ рд╕рд╣рдордд рд╣реЛрдВ: рдореБрд╕реНрдХрд╛рди:

рдФрд░ рдРрд╕рд╛ рди рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг:

  • ? рдПрдХ рддрд░реНрдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕реЗ рд╢рд┐рдХреНрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реА рд╣реИ, рдЬреЛ рдХреБрдЫ рд╣рдж рддрдХ рд╕рд╣реА рдзрд╛рд░рдгрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЕрд░реНрде рдпрд╣ рднреА рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдЕрд╕рдВрджрд┐рдЧреНрдз рд╣реИ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИред
  • рдкреИрд░реЗрдиреНрдереЗрд╕рд┐рд╕ рдХреЗ рдЕрдзрд┐рдХ (рдФрд░ рдЕрд▓рдЧ) рдорд┐рд╢реНрд░рдг рдФрд░ ? рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЦрд╛рд╕рддреМрд░ рдкрд░ рддрдм рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдПрдХ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╣реЛ: construct_future()(?)?(?)? ред рд▓реЗрдХрд┐рди рдЖрдк fn рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ: foobar()?()?()? ред рдЪреВрдБрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдХреЛ рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рдФрд░ рди рд╣реА рд╢рд┐рдХрд╛рдпрдд рдХреА, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдпрд╛рдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдХрднреА рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╕реНрдпрд╛ construct_future()(await)?(await)? рд▓рд┐рдП рднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ -
  • future(?) рдореЗрд░рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╢реЙрдЯ рд╣реИ рдФрд░ рдпрд╣ рдЕрднреА рднреА рдХреБрдЫ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИред рдлрд┐рд░ рднреА, рдЗрд╕рдХреЗ рддрд░реНрдХ рдХреЛ рдХреЛрд░рдЯрд╛рдЗрди (рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд▓реМрдЯрдиреЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдкрд░ рднреЗрдЬрдиреЗ) рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдЕрдореВрд░реНрдд рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрдд рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред future(await) рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ рдЬреЛ await рдмрд╛рдж рднреА рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рддрд░реНрдХ рд╕реНрдерд┐рддрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рдЧрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдХрдард┐рди рд╣реИред рдпрд╣ рдареАрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ рдЬрдм рдХреЛрд░рдЯрд╛рдЗрди рдПрдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред
  • рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк?
  • рдЕрдкрдиреА рдЦреБрдж рдХреА? рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдХрдЪрд░реЗ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдЯреНрд░рд┐рдХ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

future(?)

Result рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ: рд╡рд╛рдпрджрд╛ рдХрд┐рд╕реА рднреА рдЬрдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╡рд╛рдпрджрд╛ Result

рддреЛ рдлреНрдпреВрдЪрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬреЛ Result рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред future(?) рд╡рд╣ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ future.await!() рдпрд╛ рд╕рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ future(?)? (рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рдо рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рддреНрдпрд╛рдЧ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдорддрджрд╛рди (?) рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкрд░реАрдХреНрд╖рдг ? orthogonal рдмрдирд╛рддрд╛ рд╣реИред рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

рдПрдХ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд░рд┐рдЯрд░реНрди рдХрд┐ рднрд╡рд┐рд╖реНрдп рдкрд░ рд╢рд╛рдЦрд╛ future(?)?

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЬреЛ Future<Output = Result<_, _>> рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ foo()(?)? рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛

рдпрд╣ рдмрд╣реБрдд рд╣реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕-рднрд╛рд░реА рд╣реИ, рдФрд░ рдпрд╣ рджреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ? рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рд╣реИ рдЬреЛ рднрд╛рд░реА рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдИ рдЗрд╕реЗ рдирдП рдЖрд░рдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╢реБрд░реВ рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рдирд╛ рдерд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реНрдХ рд╣реИ рд▓реЗрдХрд┐рди рдЯреНрд░реЗрдбрдСрдл рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рдмрдпрд╛рди рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рддреЛ impl Future<Output = Result<_,_>> рд▓рд┐рдП рдПрдХ рд╣реА рдХрдерди рдмрди рдЬрд╛рдПрдЧрд╛:

  • foo()(await)?

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реНрдХ рдХреНрдпреЛрдВ ? рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЖрдВрддрд░рд┐рдХ рддрдВрддреНрд░ рдХреБрдЫ рд╣рдж рддрдХ рд╕рдорд╛рди рд╣реИ (рдЕрдиреНрдпрдерд╛ рд╣рдо рд╡рд░реНрддрдорд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ Poll рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ) рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдореВрд░реНрдд рд╣реЛрдиреЗ рдХреА рдмрд╛рдд рдпрд╛рдж рдЖ рд╕рдХрддреА рд╣реИред

рдпрд╣ рдмрд╣реБрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕-рднрд╛рд░реА рд╣реИ

рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рд╣реИ?

рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ ? рджреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдПред

рд╣рд╛рдБ, рддреЛ foo()(await) -syntax рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИ рдЬреЛ рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЬреЗрдПрд╕ рдореЗрдВ рдЙрд╕ рдХреНрд▓реЛрдЬрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред

"рд╕рд┐рдВрдЯреЗрдХреНрд╕-рд╣реЗрд╡реА" рдХрд╛ рдореЗрд░рд╛ рдкрдврд╝рдирд╛ "рд╕рд┐рдЧреНрд▓-рд╣реЗрд╡реА" рдХреЗ рдХрд░реАрдм рдерд╛, ()(?)? рдХрд╛ рдПрдХ рдХреНрд░рдо рджреЗрдЦрдХрд░ рдХрд╛рдлреА рдШрдмрд░рд╛рд╣рдЯ рд╣реЛрддреА рд╣реИред рдпрд╣ рдореВрд▓ рдкреЛрд╕реНрдЯ рдореЗрдВ рд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛:

рдкреИрд░реЗрдиреНрдереЗрд╕рд┐рд╕ рдХреЗ рдЕрдзрд┐рдХ (рдФрд░ рдЕрд▓рдЧ) рдорд┐рд╢реНрд░рдг рдФрд░ ? рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЦрд╛рд╕рддреМрд░ рдкрд░ рддрдм рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрддрд╛ рд╣реЛ: construct_future()(?)?(?)?

рд▓реЗрдХрд┐рди рдЖрдк fn рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ: foobar()?()?()? ред рдЪреВрдБрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдХреЛ рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рдФрд░ рди рд╣реА рд╢рд┐рдХрд╛рдпрдд рдХреА, рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдпрд╛рдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╣реА рдХрднреА рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдЦрдВрдбрди рд╣реИ: рдЖрдкрдиреЗ рдХрд┐рддрдиреА рдмрд╛рд░ -> impl Fn рдЬрдВрдЧрд▓реА (рдЕрдХреЗрд▓реЗ -> Result<impl Fn() -> Result<impl Fn() -> Result<_, _>, _>, _> ) рджреЗрдЦреЗ рд╣реИрдВ? рдХрд┐рддрдиреА рдмрд╛рд░ рдЖрдк рдПрдХ async рдХреЛрдбрдмреЗрд╕ рдореЗрдВ -> impl Future<Output = Result<_, _>> рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ? рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреБрд░реНрд▓рдн impl Fn рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХрд╛ рдирд╛рдо рд░рдЦрдирд╛ рдмрд╣реБрдд рд╣реА рдЕрд▓рдЧ рд╣реИ impl Future рдЕрд╕реНрдерд╛рдпреА

рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреБрд░реНрд▓рдн рдЗрдореНрдкреНрд▓рд╛рдиреНрдЯ Fn рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ рдирд╛рдо рджреЗрдирд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рддрд╛рдХрд┐ рдлрд╝реНрд▓рд░реНрдЯ рдлрд╝реНрд▓рд┐рдк рдлреНрдпреВрдЪрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВрдЬрд╝ рдХреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрд╢ рдХреЛ рдирд╛рдо рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЖрдкрдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬреНрдЮрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдмрд╛рд░ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ await? future рд╕реЗ рднрд┐рдиреНрди рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рд╕рднреА рдиреЗ рдпрд╣рд╛рдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдЕрдВрдХ рдмрдирд╛рдП рд╣реИрдВ рдФрд░ рдЬрд┐рддрдиреЗ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ (рдореИрдВрдиреЗ рдореВрд▓ рдкреЛрд╕реНрдЯ рдХреЛ рд╣рдореЗрд╢рд╛ рджреЛрдиреЛрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИ), рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ future(await) рдЦреБрдж рдХреА рдУрд░ рдЭреБрдХрддрд╛ рд╣реВрдВред рдпрд╣ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрднреА рднреА рдлрд╝рдВрдХреНрд╢рди-рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд╕рднреА рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЙрдХрд╕рд╛рдирд╛ рдерд╛ред

рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ -> рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЕрдиреБрдорд╛рди> рдПрдХ async рдХреЛрдбрдмреЗрд╕ рдореЗрдВ?

рдореИрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ (рдПрдХ async fn рдЬреЛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ) рдХреЛ рд╣рд░ рд╕рдордп рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж


рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдкрд░ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдХреБрдЫ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдЬреЛрдбрд╝рдирд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ await рдЗрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╕рд╛рд▓ рдмрд╛рдж, рдпрд╣ рдЬреНрдЮрд╛рдд рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЛ рддреМрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдирдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдореЗрд░реЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЬреЛ рд╡рд╛рдХреНрдп-рд░рдЪрдирд╛рдПрдБ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИрдВ, рд╡реЗ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреЛрд╕реНрдЯ рд╣реИрдВ:

  • рдЙрдкрд╕рд░реНрдЧ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рднреА рдПрдХ рдирд┐рд░реНрдгрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реАрдорд╛рдВрдХрдХ (рдпрд╛ рддреЛ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдпрд╛ рдкреИрд░реЗрдВрд╕ рдпрд╛ рджреЛрдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛; рдЗрди рд╕рднреА рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВ)ред рдпрд╛рдиреА await(future) рдпрд╛ await { future } ред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рдВрдереЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╢реЛрд░ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рд╕реАрдорд╛рдВрдд рд╡рд┐рдХрд▓реНрдк рднреНрд░рдо рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред
  • рдЙрдкрд╕рд░реНрдЧ ? рдмрд╛рд░реЗ рдореЗрдВ "рдЙрдкрдпреЛрдЧреА" рдкреВрд░реНрд╡рддрд╛ рдХреЗ рд╕рд╛рде рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред (рдпрд╣ рд╣реИ, рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддрдВрдЧ рдмрд╛рдВрдзрддрд╛ рд╣реИ?)ред рдпрд╣ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЛрдб рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд░рд┐рдЯрд░реНрди рдлреНрдпреВрдЪрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред
  • рдЙрдкрд╕рд░реНрдЧ ? рдмрд╛рд░реЗ рдореЗрдВ "рд╕реНрдкрд╖реНрдЯ" рдкреВрд░реНрд╡рддрд╛ рдХреЗ рд╕рд╛рде рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред (рдпрд╣ рд╣реИ, рд╡рд╣ рд╣реИ? рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддрдВрдЧ рдмрд╛рдВрдзрддрд╛ рд╣реИ)ред рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА await? рдПрдХ рд╕рдВрдпреБрдХреНрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдФрд░? рдСрдкрд░реЗрдЯрд░ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЪреАрдиреА рдХреЛ рдЗрд╕ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЖрджреЗрд╢ рдХреЛ рд╕рднреА рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╣рд░ рдХреЛрдИ (await future)? рд╣рд░ рд╕рдордп рд▓рд┐рдЦрддрд╛ рд░рд╣реЗрдЧрд╛, рдЬреЛ рдХрд┐ рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдПрдХ рдмрджрддрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рдЬрд┐рд╕рдХреА рдореИрдВрдиреЗ рдЧрдгрдирд╛ рдХреА рдереАред
  • рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реНрдерд╛рди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рджреЛрдиреЛрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрдкрд╖реНрдЯ рджреГрд╢реНрдп рдХреНрд░рдо рд╣реЛрдиреЗ рд╕реЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдХрд╛рдлреА рд╣рдж рддрдХ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред

рдЬрдм рднреА рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рдореЗрд░реА рдЕрдкрдиреА рд░реИрдВрдХрд┐рдВрдЧ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рдкрд▓ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪреАрдиреА рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕, рдкрд░рд┐рдЪрд┐рдд рдФрд░ рд╕рдордЭ рдХреЗ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрддреБрд▓рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрддреАрдд рдореЗрдВ рдореИрдВ рдпрд╛ рддреЛ рджреЛ рдЕрдиреНрдп рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрдХреНрд╖ рд▓реЗ рдЪреБрдХрд╛ рд╣реВрдВред

рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрди рдирд╛рдореЛрдВ рдХреЛ рдЪрд╛рд░ рд╡рд┐рдХрд▓реНрдк рджреВрдВрдЧрд╛:

рдирд╛рдо | рднрд╡рд┐рд╖реНрдп | рдкрд░рд┐рдгрд╛рдо рдХрд╛ рднрд╡рд┐рд╖реНрдп | рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо
--- --- --- ---
рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд░рд┐рд╕реАрдордирдХрд░реНрддрд╛ | await(future) рдпрд╛ await { future } | await(future)? рдпрд╛ await { future }? | await(future?) рдпрд╛ await { future? }
рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рдЧрд╛рдореА | await future | await future? | await (future?)
рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ w / рдЪреАрдиреА | await future | await? future рдпрд╛ (await future)? | await future?
рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб | future await | future await? | future? await

(рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ "рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ" рдЬреИрд╕реЗ рдЕрдиреНрдп рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред)

рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рддрд╛ рдореЗрдВ 'рдЖрд╢реАрд░реНрд╡рд╛рдж' await future? рдХреА рдХрдорд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдЕрдиреНрдп рдЬреЛ рдХрд┐ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ ? рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ Future рдХрд╛ рдПрдХ рд╕рдВрдЧрдд рддрд░реАрдХреЗ рд╕реЗ Result -methods рдХреА рдкреНрд░рддрд┐рдХреГрддрд┐ рд╣реЛред рдореБрдЭреЗ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдЪрд╛рдирдХ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рд▓реМрдЯреЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬреЛ рдЙрддреНрд╕реБрдХ рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рддрдп рдХрд░рдирд╛ рдЙрддрдирд╛ рд╣реА рдХрдард┐рди рд╣реЛрдЧрд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред (рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдиреАрдЪреЗ рджреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рджреЗрдЦреЗрдВ рдЬрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ ? рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рддрдХрдиреАрдХреА рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╣реИ рдЬреЛ рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ)

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рдорд╛рдорд▓реЗ рд╕реЗ рдЙрдмрд░ рд╕рдХрддреЗ рд╣реИрдВ:

async fn previously() -> Result<_, lib::Error> {
    let _ = await get_result()?;
}

async fn with_recovery() -> Result<_, lib::Error> {
    // Does `or_recover` return a future or not? Suddenly very important but not visible.
    let _ = await get_result().unwrap_or_else(or_recover);
    // If `or_recover` is sync, this should still work as a pattern of replacing `?` imho.
    // But we also want `or_recover` returning a future to work, as a combinator for futures?

    // Resolving sync like this just feel like wrong precedence in a number of ways
    // Also, conflicts with `Result of future` depending on choice.
    let _ = await get_result()?.unwrap_or_else(or_recover);
}

рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреЛрд╕реНрдЯ-рдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ:

async fn with_recovery() -> Result<_, lib::Error> {
    // Also possible in 'space' delimited post-fix await route, but slightly less clear
    let _ = get_result()(await)
        // Ah, this is sync
        .unwrap_or_else(or_recover);
    // This would be future combinator.
    // let _ = get_result().unwrap_or_else(or_recover)(await);
}
// Obvious precedence syntax
let _ = await get_result().unwrap_or_else(or_recover);
// Post-fix function argument-like syntax
let _ = get_result()(await).unwrap_or_else(or_recover);

рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВ, рдбреЙрдЯ рдСрдкрд░реЗрдЯрд░ "рд╕реНрдкрд╖реНрдЯ рд╡рд░реАрдпрддрд╛" await рдСрдкрд░реЗрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреВрд░реНрд╡рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдорддреБрд▓реНрдп рд╣реИ:

let _ = get_result().unwrap_or_else(or_recover)(await);

рдпрд╣ рдареАрдХ рдЙрд╕реА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ or_recover async рд╣реИ рдпрд╛ рдирд╣реАрдВред (рдЬреЛ рдореИрдВ рддрд░реНрдХ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ async рд╣реИ, рдФрд░ рдЖрдк or_recover рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рдЧ async рд╣реИ)ред

рдпрд╣ рдареАрдХ рдЙрд╕реА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╣реИ рдХрд┐ or_recover async рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдмрд┐рд▓рдХреБрд▓ рдирд╣реАрдВред unwrap_or_else рдХреЛ рдХреЙрд░рдЯреАрди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ get_result рдПрдХ рдХреЙрд░рдЯреАрди рд╣реИ (рдЗрд╕рд▓рд┐рдП рдПрдХ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдпрд╛ Result<impl Future, _> (рдФрд░ Ok рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ coroutine рд╣реИ, рдФрд░ Err рдПрдХ рдмрдирд╛рддрд╛ рд╣реИ)ред рдЙрди рджреЛрдиреЛрдВ рдХреА рд╕рдорд╛рди рдЪрд┐рдВрддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рд╡реЗ await рдЕрдиреБрдХреНрд░рдо рдмрд┐рдВрджреБ рдХреЛ join рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрдХреНрд╖рддрд╛ рд▓рд╛рдн рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХреЗрдВ, рдЬреЛ рдХрд┐ рдкреНрд░рдореБрдЦ рдЪрд┐рдВрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдирд┐рд╣рд┐рддрд╛рд░реНрдеред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдордзреНрдпрд╡рд░реНрддреА рд╕рдВрдЧрдгрдирд╛ рдХреЛ рд╕рд┐рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЯрд╛рдЗрдк рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЗрдВрддрдЬрд╛рд░

рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИрдВ, рдбреЙрдЯ рдСрдкрд░реЗрдЯрд░ "рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛" рдкреНрд░рддреАрдХреНрд╖рд╛ рдСрдкрд░реЗрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкреВрд░реНрд╡рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдорддреБрд▓реНрдп рд╣реИ

рдпрд╣ рднреНрд░рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдПрдХ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде ? рдХреА рдЬрдЧрд╣ рдиреЗ await рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ред ? рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЖрдВрд╢рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ expr T , рдореИрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ ( T::unwrap_or_else рдореМрдЬреВрдж рд╣реИред :

  • expr? -> expr.unwrap_or_else(or_recover)
  • <T as Try>::into_result(expr)? -> T::unwrap_or_else(expr, or_recover)

рд╣рд╛рд▓рд╛рдБрдХрд┐, 'рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рдЧрд╛рдореА' рдФрд░ await expr? ( await expr рдкреИрджрд╛рд╡рд╛рд░ T ) рдХреЗ рдмрджрд▓реЗ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ

  • await expr? -> await expr.unwrap_or_else(or_recover)
  • <T as Try>::into-result(await expr) -> await Future::unwrap_or_else(expr, or_recover)

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рд╡рд░реНрддреАрддрд╛ рдореЗрдВ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдм рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реЗрд╢рдирд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдЕрднреА рднреА 'рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдо' рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЖрдк рдПрдХ рд╕рдВрдпреЛрдЬрди рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ? рдХрд┐рд╕реА рднреА рдЙрдкрд╕рд░реНрдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдкрд░рд╛рдВрдареЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдмрд╛рдХреА рдХреА рд░рд╕реНрдЯ-рд▓реИрдВрдЧреНрд╡реЗрдЬ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИ рдХрд┐ 'рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ' рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдСрдЯреЛ-рд░реЗрдл рдореИрдЬрд┐рдХ рд╣реИред

рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрдИ рдкреНрд░рддреАрдХреНрд╖рд╛ / рдХреЛрд╢рд┐рд╢ / рд╕рдВрдпреЛрдЬрди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

// Chain such that we
// 1. Create a future computing some partial result
// 2. wait for a result 
// 3. then recover to a new future in case of error, 
// 4. then try its awaited result. 
async fn await_chain() -> Result<usize, Error> {
    // Mandatory delimiters
    let _ = await(await(partial_computation()).unwrap_or_else(or_recover))?
    // Useful precedence requires paranthesis nesting afterall
    let _ = await { await partial_computation() }.unwrap_or_else(or_recover)?;
    // Obivious precendence may do slightly better, but I think confusing left-right-jumps after all.
    let _ = await? (await partial_computation()).unwrap_or_else(or_recover);
    // Post-fix
    let _ = partial_computation()(await).unwrap_or_else(or_recover)(await)?;
}

рдЬреЛ рдореИрдВ рдЯрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╡рд╣ рд╕реА рдХреЗ рдЯрд╛рдЗрдк рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдЬрдВрдЧ рдПрдирд╛рд▓реЙрдЧ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдмреАрдЪ рдореЗрдВ рдХреВрджрддреЗ рд╣реИрдВ
'рдкреЙрдЗрдВрдЯрд░' рдФрд░ 'рдПрд░реЗ' рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд╛рдПрдБ рдФрд░ рджрд╛рдПрдБ рдкрдХреНрд╖ред

@Withoutboats рдХреА рд╢реИрд▓реА рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐:

| рдирд╛рдо | рднрд╡рд┐рд╖реНрдп | рдкрд░рд┐рдгрд╛рдо рдХрд╛ рднрд╡рд┐рд╖реНрдп | рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо |
| - | - | - | - |
| рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд░рд┐рд╕реАрдордирдХрд░реНрддрд╛ | await(future) | await(future)? | await(future?) |
| рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рдЧрд╛рдореА | await future | await future? | await (future?) |
| рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ | await future | await? future | await future? |
| рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЙрд▓ | future(await) | future(await)? | future?(await) |

| рдирд╛рдо | рдЬрдВрдЬреАрд░ |
| - | - |
| рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд░рд┐рд╕реАрдордирдХрд░реНрддрд╛ | await(await(foo())?.bar())? |
| рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рдЧрд╛рдореА | await(await foo()?).bar()? |
| рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ | await? (await? foo()).bar() |
| рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЙрд▓ | foo()(await)?.bar()(await) |

рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореИрдВ рд╣реВрдВ , рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдпрд╣ рдЙрдиреНрд╣реАрдВ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд▓рдЧрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред foo await.method() рднреНрд░рдорд┐рдд рд╣реИред

рдкрд╣рд▓реЗ рдПрдХ рд╕рдорд╛рди рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ:

| рдирд╛рдо | рднрд╡рд┐рд╖реНрдп | рдкрд░рд┐рдгрд╛рдо рдХрд╛ рднрд╡рд┐рд╖реНрдп | рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо |
| ---------------------- | -------------------- | ----- ---------------- | --------------------- |
| рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд░рд┐рд╕реАрдордирдХрд░реНрддрд╛ | await { future } | await { future }? | await { future? } |
| рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рдЧрд╛рдореА | await future | await future? | await (future?) |
| рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ | await future | await? future | await future? |
| рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб | future await | future await? | future? await |
| рдЙрдкрд╕рд░реНрдЧ рдХреНрд╖реЗрддреНрд░ | future.await | future.await? | future?.await |
| рдЙрдкрд╕рд░реНрдЧ рд╡рд┐рдзрд┐ | future.await() | future.await()? | future?.await() |

рдЕрдм рдПрдХ рдЬрдВрдЬреАрд░ рднрд╡рд┐рд╖реНрдп рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рджреЗрдЦреЗрдВ:

| рдирд╛рдо | рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЬрдВрдЬреАрд░ рд╡рд╛рдпрджрд╛ |
| ---------------------- | -------------------------- ----------- |
| рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд░рд┐рд╕реАрдордирдХрд░реНрддрд╛ | await { await { foo() }?.bar() }? |
| рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рдЧрд╛рдореА | await (await foo()?).bar()? |
| рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ | await? (await? foo()).bar() |
| рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб | foo() await?.bar() await? |
| рдЙрдкрд╕рд░реНрдЧ рдХреНрд╖реЗрддреНрд░ | foo().await?.bar().await? |
| рдЙрдкрд╕рд░реНрдЧ рд╡рд┐рдзрд┐ | foo().await()?.bar().await()? |

рдФрд░ рдЕрдм рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, reqwests , рдЬрд╣рд╛рдБ рдЖрдк рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЬрдВрдЬреАрд░ рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред

let res: MyResponse = client.get("https://my_api").send().await?.json().await?;

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рднрд╛рдЬрдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
let res: MyResponse = client.get("https://my_api").send()/await?.json()/await?;
рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдордЬрдмреВрдд рд░рд╛рдп рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдХреНрдпрд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ (рдпрд╛рдиреА future.await!() ) рдЕрднреА рднреА рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣ рд╕реНрдкрд╖реНрдЯ, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ:

| рднрд╡рд┐рд╖реНрдп | рдкрд░рд┐рдгрд╛рдо рдХрд╛ рднрд╡рд┐рд╖реНрдп | рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо |
| --- --- ---
| future.await! () | future.await! ()? | рднрд╡рд┐рд╖реНрдпред рдЬрд╡рд╛рдИ (!) |

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рдордЭрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рдордЭрдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реИрдВрдЧ рдлрд╝реАрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛)ред

рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреИрд░-рдЬрд╛рджреБрдИ рдЧреБрдгреЛрдВ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рд╕реНрдкрд╖реНрдЯ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреА succinctness рдФрд░ chainability рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ, рдФрд░ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдХреБрдЫ .await_debug!() , .await_log!(WARN) рдпрд╛ .await_trace!()

рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ [...] рдЧреИрд░-рдЬрд╛рджреБрдИ рдЧреБрдгреЛрдВ [...] рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ

@novacrazy рдЗрд╕ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ await! рдореИрдХреНрд░реЛ _would_ рд╣реЛрдирд╛ рдЬрд╛рджреВ рд╣реИ, рдпрд╣ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЬрдирд░реЗрдЯрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреБрдЫ рд╣рдж рддрдХ рдЙрдЬрд╛рдЧрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реЛрдЧрд╛ (рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рд╕рдордп рдЗрд╕рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ rustc -рд░рд╛рдд рдХреЗ рд╕рдорд╛рди рд░рд╛рддреНрд░рд┐рдХрд╛рд▓реАрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред

@ рдирд┐рдореЛ 157 рд╣рдореНрдоред рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реЛрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛ред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдЬрд╛рджреБрдИ рдХреАрд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп "async" рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЬрдирд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #[async] рдЬреИрд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ? рдпрд╣ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдг рд╣реИрдВ, рдФрд░ рдбреЙрдХреНрд╕ рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ #[must_use] рдпрд╛ #[repr(C)] рд╣реИрдВред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдиреА рдЕрдореВрд░реНрдд рдкрд░рддреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд╕реАрдзреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдХреНрдпрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╣рд╛рдВ рдЬрд╛рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╣реИрдХ рдХрд░рдиреЗ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрдЧрд░ рд╡реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╣рдо рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдирд┐рдпрдВрддреНрд░рдг рдЦреЛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреБрдЫ рднреА рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдореИрдВ рдХрдЪреНрдЪреЗ рд╡рд╛рдпрджрд╛ рд╕реЗ рдЪрд┐рдкрдХ рд╕рдХрддрд╛ рд╣реВрдВред

рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рднрд╛рд╖рд╛, рднрд╛рд╖рд╛ рдирд╣реАрдВ ( std / core ), рдХреЗрд╡рд▓ рдпрджрд┐ рд╡реЗ рдЕрд╕рдВрднрд╡ (рдпрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдпрд╛ std рд▓рд┐рдП рд╕рд╛рд░ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред ред рдпрд╣ рдкреВрд░реА async рдЪреАрдЬрд╝ рдЙрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рд╣рд╛рде рд╕реЗ рдирд┐рдХрд▓ рдЧрдИ рд╣реИред рдХреНрдпрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ rustc рдореЗрдВ рдкрд┐рди рдПрдкреАрдЖрдИ рдФрд░ рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдЪрд╛рд╣рд┐рдП?

@ рдиреЛрд╡рд╛рдХреНрд░реЗрдЬреА рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рднрд╛рд╡рдирд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рд▓реЗрдХрд┐рди рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд╕рд╛рде рдирд╣реАрдВред

рдпрджрд┐ рд╡реЗ рдЕрд╕рдВрднрд╡ рд╣реИрдВ (рдпрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЕрд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдпрд╛ рдПрд╕рдЯреАрдбреА рджреНрд╡рд╛рд░рд╛ рдЕрдореВрд░реНрддрддрд╛ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рднрд╛рд╖рд╛ рдореЗрдВ for -loops рд╣реЛрдиреЗ рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ рдЬрдм рд╡реЗ рднреА рдПрдХ рдореИрдХреНрд░реЛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ loop рд╕рд╛рде рд╡рд┐рд░рд╛рдо рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред || closure рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реИ рдЬрдм рдпрд╣ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ рд╡рд╕реНрддреБ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ ? рдкрд░рд┐рдЪрдп рддрдм рдХреНрдпреЛрдВ рджрд┐рдпрд╛ рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА try!() ред рдЬрд┐рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореИрдВ рдЙрди рд╕рд╡рд╛рд▓реЛрдВ рдФрд░ рдЖрдкрдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ, рдЙрдирдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рд╣реИред рдЗрди рдЕрдореВрд░реНрддрддрд╛рдУрдВ рдХрд╛ рдмрд┐рдВрджреБ рди рдХреЗрд╡рд▓ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрд╡рд╣рд╛рд░, рдмрд▓реНрдХрд┐ рдкрд╣реБрдВрдЪ рдХреА рдХреНрд╖рдорддрд╛ рднреА рд╣реИред for -рд╕реНрдереВрд▓рддрд╛, рдкреНрд░рд╛рдердорд┐рдХ рдХреЛрдб рдкрде рдФрд░ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред || -рдкреНрд░рдорд╛рдг рд╡рд░реНрддрдорд╛рди рдореЗрдВ Futures рд╕рдорд╛рди - рдШреЛрд╖рдгрд╛ рдХреА рд╕рддреНрдпрддрд╛ рдореЗрдВ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред try!() рднрд╛рд╡ рдФрд░ рд╕рдВрдпреЛрдЬрдХрддрд╛ рдХреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреНрд░рдо рдореЗрдВ рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ async рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдбреЗрдХреЛрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐ aync-blocks рдФрд░ async || рджреНрд╡рд╛рд░рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдЯрд░реНрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рднрд╛рд╖рд╛ рдХреА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдореИрдХреНрд░реЛ рдХреА рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рд╕рдмреЛрдкреНрдЯреАрдорд▓ рд▓рдЧрддреА рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рднреА рдирд╣реАрдВ рдЕрдЧрд░ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рд╣реИред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╣рд╛рдВ рдЬрд╛рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╣реИрдХ рдХрд░рдиреЗ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ рд╡реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рддрд░реНрдХ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ std api рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП coroutines рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ unsafe рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧреАред рдФрд░ рддрдм рдЙрд▓реНрдЯрд╛ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдпрд╣ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрддрд╛ рд╣реИ тАФ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ рднрд▓реЗ рд╣реА рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдФрд░ рдЕрд░реНрдердкреВрд░реНрдг рддрд░реАрдХрд╛ рд╣реЛ-рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ unsafe рдореЗрдВ рдмрдиреА рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХрд╛ рднрд╛рд░реА рдЬреЛрдЦрд┐рдо рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ extern "rust-call" рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЬрд╛рджреВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХреЗ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдРрд╕реА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ return рдХрднреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ , рднрд▓реЗ рд╣реА рд╕реНрдЯреИрдХрдлреБрд▓ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рднрд╛рдЧреНрдп рдЕрднреА рддрдХ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдПрдХ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╣реБрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ред

рдПрдХ рддрд░рдл: рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд╛рдд рдХрд░реЗрдВ рддреЛ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрдВрднреАрд░ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рдХреНрдпрд╛ рдХреЛрд░рдЯрд╛рдЗрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ extern "await-call" fn () -> T рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ a

trait std::ops::Co<T> {
    extern "rust-await" fn await(self) -> T;
}

impl<T> Co<T> for Future<Output=T> { }

рдЙрд░реНрдлред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдВрддрд░рд┐рдХреНрд╖ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ future.await() ред рдпрд╛ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рднреА рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@HeroicKatora

рдЬрдм рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА try!() рдереЗ, рддрдм рд╣рдордиреЗ ? рдкрд░рд┐рдЪрдп рдХреНрдпреЛрдВ рджрд┐рдпрд╛

рдирд┐рд╖реНрдкрдХреНрд╖ рд╣реЛрдирд╛, рдореИрдВ рдЗрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдореБрдЭ рдкрд░ рдмрдврд╝реА рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛрдЧрд╛ рдпрджрд┐ Try рдХреЛ рдХрднреА рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рд╡рд┐рд╖рдп рд╣реИред

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП "рдЪреАрдиреА" рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдмрд╣реБрдд, рдмрд╣реБрдд рдкрддрд▓реА рдЪреАрдиреА рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ impl MyStruct impl <anonymous trait> for MyStruct рд▓рд┐рдП рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдЪреАрдиреА рд╣реИред рдпреЗ рдЬреАрд╡рди рд╢рд░реНрдХрд░рд╛ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рд╣реИ рдЬреЛ рд╢реВрдиреНрдп рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрдирд░реЗрдЯрд░ рдФрд░ рдПрд╕рд┐рдВрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рди-рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╣рддреНрд╡рд╣реАрди рдУрд╡рд░рд╣реЗрдб рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдирд╕рд┐рдХ рдУрд╡рд░рд╣реЗрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЬреЗрдирд░реЗрдЯрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдард┐рди рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рднрд╛рд╖рд╛ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ async рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, async рдмреНрд▓реЙрдХ рдпрд╛ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдмрд╛рдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдорд╛рдирд╛ рдХрд┐ рдХреЛрдИ рдХреАрд╡рд░реНрдб рд╡рд╣рд╛рдВ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рдЖрдЗрдЯрдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, async рдХреАрд╡рд░реНрдб рдФрд░ #[async] рд╡рд┐рд╢реЗрд╖рддрд╛ / рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдкреВрд░реНрд╡ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдирд┐рдореНрди-рд╕реНрддрд░ рддрдХ рдкрд╣реБрдБрдЪ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдХреЛрдИ рднреА рдЗрдЪреНрдЫрд┐рдд рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ) рдЬрдирд░реЗрдЯрд░ред рдЗрд╕ рдмреАрдЪ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ yield рдХреЛ рдмреНрд▓реЙрдХ рдпрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ async рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рднреА рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

await , рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рджреЛрдиреЛрдВ рд╕рдВрднрд╡ рд╣реИрдВ, рддреЛ рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреАрд╡рд░реНрдб await async рдХреАрд╡рд░реНрдб рдлрд╝рдВрдХреНрд╢рди / рдмреНрд▓реЙрдХ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВ, рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ await!() рдореИрдХреНрд░реЛ #[async] рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВред

рд╕реНрдпреВрдбреЛрдХреЛрдб:

// imaginary generator syntax stolen from JavaScript
fn* my_generator() -> T {
    yield some_value;

    // explicit return statements are only included to 
    // make it clear the generator/async functions are finished.
    return another_value;
}

// `await` keyword would not be allowed here, but the `yield` keyword is
#[async]
fn* my_async_generator() -> Result<T, E> {
    let item = some_op().await!()?; // uses the `.await!()` macro
    // which would really just use `yield` internally, but with the pinning API

    yield future::ok(item.clone());

    return Ok(item);
}

// `yield` would not be allowed here, but the `await` keyword is.
async fn regular_async() -> Result<T, E> {
   let some_op = async || { /*...*/ };

   let item = some_op() await?;

   return Ok(item);
}

рджреЛрдиреЛрдВ рдУрд░ рд╕реЗ рд▓рд╛рднрджрд╛рдпрдХред

рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдПрдХ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдкреНрд░рдЧрддрд┐ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ await рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╣реИред async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рдмреНрд▓реЙрдХ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рдмрд╛рддрдЪреАрдд рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдмрд╛рд╣рд░ рд╣реИ рдХрд┐ await! рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХрднреА рднреА рд░рд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦ рдкрд╛рдПрдВрдЧреЗ рд╕рддрд╣ рднрд╛рд╖рд╛ред

рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рднреА рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХрд╛ рд╡рдЬрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрджрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рдПрдХ рдЕрд▓реНрдк рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡рд┐рдкрдХреНрд╖ рдХреЗ рд╕рд╛рде рдЦрдбрд╝рд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЙрдкрд╕рд░реНрдЧ рд╕реАрдорд╛рдВрдХрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд-рд╕реЗ-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрдВрдкреЗрдЯрд┐рдмрд▓ рдлреЙрд░рд╡рд░реНрдб рд╣реЛрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреБрдЫ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реЛрдВ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрдирдХрд╛ рджреГрдврд╝рддрд╛ рд╕реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред

рддреБрд▓рдирд╛ syntax , example (@mehcode рд╕реЗ reqwest рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ), рддреЛ ( concerns , рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ resolution рдПрдХ рддрд╛рд▓рд┐рдХрд╛) await рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдирдП рд▓реЛрдЧреЛрдВ рдФрд░ рдЕрдиреБрднрд╡реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рджреЗрд╢реА рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╕рднреА рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг, рдХреГрдкрдпрд╛ рдЗрд╕ рднрд╛рдЧ рдХреЛ рдмрд┐рдХреЗрд╢ рди рдХрд░реЗрдВ:

let sent = (await client.get("https://my_api").send())?;
let res: MyResponse = (await sent.json())?;
  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб foo() await?

    • рдЙрджрд╛рд╣рд░рдг: client.get("https://my_api").send() await?.json() await?

    • | рдЪрд┐рдВрддрд╛ | рд╕рдВрдХрд▓реНрдк |

      | - | - |

      | ? рдмрд┐рдирд╛

  • рдЙрдкрд╕рд░реНрдЧ рдХреНрд╖реЗрддреНрд░ foo().await?

    • рдЙрджрд╛рд╣рд░рдг: client.get("https://my_api").send().await?.json().await?

    • | рдЪрд┐рдВрддрд╛ | рд╕рдВрдХрд▓реНрдк |

      | - | - |

      | рдореИрджрд╛рди рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ | |

  • рдЙрдкрд╕рд░реНрдЧ рд╡рд┐рдзрд┐ foo().await()?

    • рдЙрджрд╛рд╣рд░рдг: client.get("https://my_api").send().await()?.json().await()?

    • | рдЪрд┐рдВрддрд╛ | рд╕рдВрдХрд▓реНрдк |

      | - | - |

      | рдПрдХ рд╡рд┐рдзрд┐ рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ | рдЗрд╕реЗ ops:: рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? |

      | рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдирд╣реАрдВ | |

  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЙрд▓ foo()(await)?

    • рдЙрджрд╛рд╣рд░рдг: client.get("https://my_api").send()(await)?.json()(await)?

    • | рдЪрд┐рдВрддрд╛ | рд╕рдВрдХрд▓реНрдк |

      | - | - |

      | рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддрд░реНрдХ рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ | рдХреАрд╡рд░реНрдб + рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ + рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдирд╣реАрдВ |

  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ foo().await!()?

    • рдЙрджрд╛рд╣рд░рдг: client.get("https://my_api").send().await!()?.json().await!()?

    • | рдЪрд┐рдВрддрд╛ | рд╕рдВрдХрд▓реНрдк |

      | - | - |

      | рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдХреНрд░реЛ рдирд╣реАрдВ рд╣реЛрдЧрд╛тАж | |

      | тАж рдпрд╛, await рдЕрдм рдПрдХ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ | |

рд╕рдВрднрд╡рддрдГ рдЬрдирд░реЗрдЯрд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рдмрдирд╛рдо рдЙрдкрд╕рд░реНрдЧ рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдЪрд╛рд░: рдореВрд▓реНрдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, yield рдФрд░ await рджреЛ рд╡рд┐рд░реЛрдзреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдпрд╛рдиреЛрдВ рдкрд░ рдХрдмреНрдЬрд╛ред рдкреВрд░реНрд╡ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рддрдХ рдПрдХ рдорд╛рди рджреЗрддрд╛ рд╣реИ, рдмрд╛рдж рд╡рд╛рд▓рд╛ рдПрдХ рдорд╛рди рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рд╕рд┐рдбреЗрдиреЛрдЯ: рдареАрдХ рд╣реИ, рдкрд╛рдпрдерди рдореЗрдВ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЬрдирд░реЗрдЯрд░ рд╣реИрдВ рдЬрд╣рд╛рдВ yield рдПрдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдордорд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рдПрдХ рдордЬрдмреВрдд рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЪрд▓реЛ рдмрд╣реБрдд рджреВрд░ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рддрд░реНрдХ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рджреЛрдиреЛрдВ рд╣реА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╣реЛрдЧреАред

рдлрд┐рд░, рдореИрдВ рддрд░реНрдХ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рдпреЗ рдмрдпрд╛рди рдПрдХ рдЬреИрд╕реЗ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдВ, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХреЗ рд╕рдорд╛рди, рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдПрдХ рдорд╛рдирджрдВрдб рд╕реЗ рд╡рд┐рдЪрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдм рд╡рд╣ рдорд╛рди рд░реВрд╕реНрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рдФрд░ рдХрдо рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдм рддрдХ рд╣рдо await рдФрд░ рд╕рдорд╛рди рддрд░реНрдХ рдХреНрд░рдо рд╡рд╛рд▓реЗ рдЕрдиреНрдп рднрд╛рд╡реЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдореМрдЬреВрдж рд╣реИ, рддрдм рддрдХ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбрд▓ рд╕реЗ рднреА рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдЪреВрдВрдХрд┐ рдирд┐рд╣рд┐рддрд╛рд░реНрде рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рджреВрд░ рд▓рдЧрддрд╛ рд╣реИред

рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдпрд╣рд╛рдВ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ, рдореИрдВрдиреЗ рдХрднреА рднреА рдЗрд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рд╡рд╛рдпрджрд╛ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрдЦрдж рдирд╣реАрдВ рдкрд╛рдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдЯреЗрдмрд▓ рдкрд░ рдПрдХ рдЧреИрд░-рдЪреЗрди-рд╕рдХреНрд╖рдо рд╕рдВрд╕реНрдХрд░рдг рд╣реИ?

// TODO: Better variable names.
await response = client.get("https://my_api").send();
await response = response?.json();
await response = response?;

рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдпрд╣ рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреИрдЯрд░реНрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рдХрд╣рд╛рдиреА рдЕрдЪреНрдЫреА рд╕реЗ рдХрдо рд╣реИред

// Error comes _after_ future is awaited
let await res = client.get("http://my_api").send()?;

// Ok
let await res = client.get("http://my_api").send();
let res = res?;

рд╣рдореЗрдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдореБрджрд╛рдп рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд▓рдЧрднрдЧ рд╕рднреА рд╡рд╛рдпрджрд╛ рдЧрд┐рд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ ? рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд░ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

await? response = client.get("https://my_api").send();
await? response = response.json();

рджреЛрдиреЛрдВ await рдФрд░ await? рдХреЛ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдпрд╛ рд╣рдо рдЗрд╕реЗ let рддрдХ рдмрдврд╝рд╛рдПрдБрдЧреЗ, рдЕрд░реНрдерд╛рдд let? result = 1.divide(0);

рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ рдХрд┐рддрдиреА рдмрд╛рд░ рдЪреЗрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЬрдВрдЬреАрд░ рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛред рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдЙрдкрд╕рд░реНрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ:

client.get("https://my_api").send().await()?.json().await()?;

рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдЙрд╕реА рддрд░рд╣ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдореИрдВ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд░рд╕реНрдЯ рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ await() рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬрд╛рджреБрдИ (рдЧреИрд░ рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕рд╛) рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред

рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рд╕рдВрд╕реНрдХрд░рдг рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджреЗрдЧрд╛ред рд▓реЛрдЧреЛрдВ рдХреЛ рдЬрдВрдЧ рдХреЗ рдирд┐рд╢рд╛рди рдХреЛ рд╡рд┐рд╕реНрдордпрдХрд╛рд░реА рдЕрд░реНрде рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ "рдпрд╣рд╛рдБ рдЬрд╛рджреВ рд╣реЛ" тАЛтАЛрдФрд░ рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред

client.get("https://my_api").send().await!()?.json().await!()?;

рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА рдХрд╣рд╛, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрд╛рд╖рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА try!(expr) рд╣реИ рдФрд░ рдпрд╣ ? рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдЕрдЧреНрд░рджреВрдд рдерд╛ред await!(expr) рдореИрдХреНрд░реЛ рдЬреЛрдбрд╝рдирд╛ рдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реЛрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ try!(expr) рдФрд░ ? рднрд╛рд╖рд╛ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдП рдЧрдПред

рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ await!(expr) рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рдж рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ ? рд╕реНрдЯрд╛рдЗрд▓ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЪреЗрдирд┐рдВрдЧ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПред ? рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг рд▓реЗрдХрд┐рди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП:

// Not proposing this syntax at the moment. Just an example.
let a = perform()^;

client.get("https://my_api").send()^?.json()^?;

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрдм рдХреЗ рд▓рд┐рдП await!(expr) рдпрд╛ await!{expr} рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рдЙрдЪрд┐рдд рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреЛрдиреЛрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд .await! рдпрд╛ .await!() ) рдмрд╛рдж рдореЗрдВ рдЕрдЧрд░ / рдПрдХ рдмрд╛рд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдмрди рдЬрд╛рдПред (рдпрд╛ рдЕрдВрдд рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд ? рд╢реИрд▓реА рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдорд╛рд░реНрдЧ рдЬрд╛ рд░рд╣рд╛ рд╣реИ ... рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрд┐рдХрдиреЗ рдХреЗ рдмрд╛рдж: ')

FYI рдХрд░реЗрдВ, рд╕реНрдХрд╛рд▓рд╛ рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ Await.result рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ рдХрд┐ рдПрдХ рдЕрд╡рд░реБрджреНрдз рдХреЙрд▓ рд╣реИред рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рдлреНрдпреВрдЪрд░реНрд╕ рдореЛрдирд╛рдб рд╣реИрдВ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдХреЙрд▓ рдпрд╛ for рдореЛрдирд╛рдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

for {
  result <- future.map(further_computation)
  a = result * 2
  _ <- future_fn2(result)
} yield 123

рдЗрд╕ рднрдпрд╛рд╡рд╣ рд╕рдВрдХреЗрддрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде scala-async рдирд╛рдордХ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдИ рдЧрдИ, рдЬрд┐рд╕рдХрд╛ рдореИрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ, рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.async.Async.{async, await}

val future = async {
  val f1 = async { ...; true }
  val f2 = async { ...; 42 }
  if (await(f1)) await(f2) else 0
}

рдпрд╣ рджрд░реНрдкрдг рджреГрдврд╝рддрд╛ рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдВрдЧреА рдХреЛрдб рдЬреИрд╕рд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде, рдФрд░, рдЬреИрд╕реЗ, рдореИрдВ await!() рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд░рд╣рдиреЗ рдкрд░ рджреВрд╕рд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдЕрд░реНрд▓реА рд░рд╕реНрдЯ рдкреНрд░рддреАрдХ рдерд╛ рднрд╛рд░реА, рдФрд░ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╕реЗ рджреВрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ (рдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ) рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЪреАрдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧрдд рд╣реИ, рдФрд░ await!(future) рдХреА рд╕реНрдкрд╖реНрдЯрддрд╛ рдЕрд╕рдВрджрд┐рдЧреНрдз рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦрд┐рдд try! рд╕рд╛рде рд╣реБрдИ рдкреНрд░рдЧрддрд┐ рдХреЛ рднреА рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдЗрд╕реЗ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рддреБрд░рдВрдд рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рд╣реИред ! рдХреЗ рдЬреЛрдбрд╝ рдХреЗ рдмрд┐рдирд╛, рд╕рдВрдкрд╛рджрдХ / рджрд░реНрд╢рдХ рдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХреЙрд▓ рдХреЛ рд╕реНрдкреЙрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдПрдХ рдХрдордЬреЛрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рдореЗрд░реЗ рджреЛ рд╕реЗрдВрдЯ (рдирд┐рдпрдорд┐рдд рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ, fwiw) рдореИрдВ try! рдХреЗ рдореЙрдбрд▓ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдВрд╢рд┐рдХ рд╣реВрдБред рдпрд╣ рдПрдХ рдмрд╛рд░ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдереЗред

рддреЛ рдореЗрд░рд╛ рд╡реЛрдЯ рд╣реЛрдЧрд╛: await!(...) рд╕рд╛рде рд╕реНрдерд┐рд░ рдХрд░реЗрдВ рдФрд░ рд░рд╕реНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдЪреНрдЫреА рдЪреЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдкрд░ рдкрдВрдЯ рдХрд░реЗрдВред рдЖрд╡рд╛ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ, рд▓реЗрдХрд┐рди ! рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреБрдЫ "рдЬрд╛рджреВ" рд╣реИ рдФрд░ рдХреЛрд╖реНрдардХ рдЗрд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд░рдЦрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рддреБрд▓рдирд╛:

| рдЙрдкрд╕рд░реНрдЧ | рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ |
| --- | --- |
| .await | client.get("https://my_api").send().await?.json().await? |
| .await! | client.get("https://my_api").send().await!?.json().await!? |
| .await() | client.get("https://my_api").send().await()?.json().await()? |
| ^ | client.get("https://my_api").send()^?.json()^? |
| # | client.get("https://my_api").send()#?.json()#? |
| @ | client.get("https://my_api").send()@?.json()@? |
| $ | client.get("https://my_api").send()$?.json()$? |

рдореЗрд░рд╛ рддреАрд╕рд░рд╛ рдкреНрд░рддрд┐рд╢рдд рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ @ ("рдкреНрд░рддреАрдХреНрд╖рд╛" рдХреЗ рд▓рд┐рдП) рдФрд░ # (рдмрд╣реБ-рдереНрд░реЗрдбрд┐рдВрдЧ / рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдкрд╕рдВрдж рд╣реИред

рдореБрдЭреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ @ рднреА рдкрд╕рдВрдж рд╣реИ! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рдХреБрдЫ рднрд╛рд╡рдирд╛рдПрдВ рд▓рдЧрддреА рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред

  • _ @ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП_ рдПрдХ рдЕрдЪреНрдЫрд╛ рдФрд░ рдЖрд╕рд╛рди рд╕реНрдорд░рдг рд╢рдХреНрддрд┐ рд╣реИ
  • ? рдФрд░ @ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП @ рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рдж ? рд╕реАрдЦрдирд╛ рдПрдХ рдРрд╕реА рдЫрд▓рд╛рдВрдЧ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
  • рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдВрдж рд╕реАрдорд╛рдВрдХрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдбреНрд╕,

рдореИрдВ await? foo рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЧрдгрд┐рдд рдореЗрдВ рджреЗрдЦреЗ рдЧрдП рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред sin x рдХрд╛ рдорддрд▓рдм (sin x) used рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдЖрджрдд рдбрд╛рд▓рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП await!() рдХреЛ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╕рд╛рде рдЕрдиреБрдХреВрд▓ рд╣реВрдВ, рдЕрднреА рдХреЗ рд▓рд┐рдП try!() , рдФрд░ рдЕрдВрдд рдореЗрдВ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗред рдЕрдЧрд░ рд╣рдо рдПрдХ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ await!() рдХреЙрд▓ рдХреЛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЕрднреА рднреА рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рдФрд░ рднреА рдмреЗрд╣рддрд░ред

рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рд╡рд┐рдХрд▓реНрдк рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдЬреЗрддрд╛ рд╣реИред

  • рдХреЛрдИ рдкреВрд░реНрд╡рддрд╛ / рдЖрджреЗрд╢ рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рдХреЛрд╖реНрдардХреЛрдВ рдХреЗ рд╕рд╛рде рдЖрджреЗрд╢ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрддреНрдпрдзрд┐рдХ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ (рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рддрд░реНрдХ) рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ? 'рдХреЛрд╢рд┐рд╢' ()! 'рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВред

  • рдпрд╣ рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рдЪреЗрдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ (@earthengine рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рдХреА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ), рдФрд░ рдлрд┐рд░, рдЖрджреЗрд╢ рджреЗрдиреЗ рдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рднреНрд░рдо рдирд╣реАрдВ рд╣реИред рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ / рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрд╖реНрдардХ рдирд╣реАрдВ:

let x = x.do_something() await
         .do_another_thing() await;
let x = x.foo(|| ...)
         .bar(|| ...)
         .baz() await;
  • рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЙрдзрд╛рд░ рджреЗрддрд╛ рд╣реИ! () рдореИрдХреНрд░реЛ (@novacrazy рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рдХреА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ):
macro_rules! await {
    ($e:expr) => {{$e await}}
}
  • рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХрд▓-рдкрдВрдХреНрддрд┐, рдирдЧреНрди ('рдХреЗ рдмрд┐рдирд╛?'), рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдХреАрд╡рд░реНрдб рдЪрд╛рдЗрдирд┐рдВрдЧ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╣рдо рдПрдХ рдореВрд▓реНрдп рдХреА рд╡рд╛рдкрд╕реА рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдмрд╛рдж рдореЗрдВ рд╡рд┐рдзрд┐ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реА рдХрд░реВрдВрдЧрд╛ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд░рд╕реНрдЯрдлрд╝рдПрдордЯреА рдХреЛрдб рдкрд╕рдВрдж рдХрд░реЗрдВ)ред рдЕрдВрддрд░рд┐рдХреНрд╖ рд▓рд╛рдЗрди рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдПрдХ рджреГрд╢реНрдп рд╕рдВрдХреЗрддрдХ / рдХреНрдпреВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:
client.get("https://my_api").send() await.unwrap().json() await.unwrap()

рдПрдХ рдФрд░ рдЙрдореНрдореАрджрд╡рд╛рд░ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЖрдЧреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ (рд╢рд╛рдпрдж рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛), рдПрдХ рдордЬреЗрджрд╛рд░ рдбрдмрд▓-рдбреЙрдЯ '..' 'рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрд╣ рдореБрдЭреЗ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреБрдЫ (рдкрд░рд┐рдгрд╛рдо!) рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ...

client.get("https://my_api").send()..?.json()..?

рдореБрдЭреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ @ рднреА рдкрд╕рдВрдж рд╣реИ! рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рдХреБрдЫ рднрд╛рд╡рдирд╛рдПрдВ рд▓рдЧрддреА рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред

  • _ @ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП_ рдПрдХ рдЕрдЪреНрдЫрд╛ рдФрд░ рдЖрд╕рд╛рди рд╕реНрдорд░рдг рд╢рдХреНрддрд┐ рд╣реИ
  • ? рдФрд░ @ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реЛрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП @ рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рдж ? рд╕реАрдЦрдирд╛ рдПрдХ рдРрд╕реА рдЫрд▓рд╛рдВрдЧ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
  • рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдВрдж рд╕реАрдорд╛рдВрдХрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдбреНрд╕,

рдореИрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП @ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред рдпрд╣ рдПрдХ рдлрд┐рди / рд╕реНрд╡ рд▓реЗрдЖрдЙрдЯ рд▓реЗрдЖрдЙрдЯ рдкрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЬреАрдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреЗ рджрд╛рд╣рд┐рдиреЗ рдЕрдВрдЧреВрдареЗ рдХреЗ рд╕рд╛рде рдСрд▓-рдЬреАрдЖрд░ рдорд╛рд░рдирд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдирдВрдмрд░ рдкрдВрдХреНрддрд┐ рдкрд░ рдХреБрдВрдЬреА 2 рдорд╛рд░рд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, @ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдЕрд░реНрде рд╣реИ (рдкрд░) рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрд░реНрде рдХреНрдпреЛрдВ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрд╕ await рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рдХреАрдмреЛрд░реНрдб рдХрд▓рд╛рдмрд╛рдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреЗрдЬреА рд╕реЗ рд╣реИред

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдЕрдкрдирд╛, рдмрд╣реБрдд рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ, рдореВрд▓реНрдпрд╛рдВрдХрди рд╣реИред рдореИрдВрдиреЗ future@await рднреА рдЬреЛрдбрд╝рд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИред

| рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ | рдиреЛрдЯреНрд╕ |
| --- | --- |
| await { f } | рдордЬрдмреВрдд:

  • рдмрд╣реБрдд рд╕реАрдзрд╛
  • рд╕рдорд╛рдирддрд╛рдПрдВ for , loop , async рдЖрджрд┐ред
рдХрдордЬреЛрд░:
  • рдмрд╣реБрдд рдХреНрд░рд┐рдпрд╛ (5 рдЕрдХреНрд╖рд░, 2 рдмреНрд░реЗрд╕рд┐рдЬрд╝, 3 рд╡реИрдХрд▓реНрдкрд┐рдХ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд▓рд┐рдВрдЯреЗрдб рд╕реНрдкреЗрд╕)
  • рдХрдИ рдиреЗрд╕реНрдЯреЗрдб рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдореЗрдВ рдЪреЗрдирд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо ( await { await { foo() }?.bar() }? )
|
| await f | рдордЬрдмреВрдд:
  • рд╕рдорд╛рдирддрд╛рдПрдВ рдкрд╛рдпрдерди, рдЬреЗрдПрд╕, рд╕реА # рдФрд░ рдбрд╛рд░реНрдЯ рд╕реЗ await рд╕рд┐рдВрдЯреИрдХреНрд╕
  • рд╕реАрдзрд╛, рдЫреЛрдЯрд╛
  • рджреЛрдиреЛрдВ рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рддрд╛ рдмрдирд╛рдо рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ ? ( await fut? рдмрдирд╛рдо await? fut ) рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИ
рдХрдордЬреЛрд░:
  • рдЕрд╕реНрдкрд╖реНрдЯ: рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдо рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ рд╕реАрдЦрдиреА рд╣реЛрдЧреА
  • рдЬрдВрдЬреАрд░ рднреА рдмрд╣реБрдд рдмреЛрдЭрд┐рд▓ рд╣реИ ( await (await foo()?).bar()? рдмрдирд╛рдо await? (await? foo()).bar() )
|
| fut.await
fut.await()
fut.await!() | рдордЬрдмреВрдд:
  • рдмрд╣реБрдд рдЖрд╕рд╛рди рдЪреЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • рдХрдо
  • рдЕрдЪреНрдЫрд╛ рдХреЛрдб рдкреВрд░рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ
рдХрдордЬреЛрд░:
  • рдпрд╣ рдПрдХ рдХреНрд╖реЗрддреНрд░ / рдлрд╝рдВрдХреНрд╢рди / рдореИрдХреНрд░реЛ рдХреЛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдореВрд░реНрдЦ рдмрдирд╛рддрд╛ рд╣реИред рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ @jplatte рд╕реЗ рд╕рд╣рдордд await!() рдХрдо рд╕реЗ рдХрдо рдЬрд╛рджреБрдИ рд▓рдЧрддрд╛ рд╣реИ
|
| fut(await) | рдордЬрдмреВрдд:
  • рдмрд╣реБрдд рдЖрд╕рд╛рди рдЪреЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • рдХрдо
рдХрдордЬреЛрд░:
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдореЗрдВ рдореВрд░реНрдЦ рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд╣реАрдВ рди рдХрд╣реАрдВ await рдЪрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрд╕ рд╡рд╛рдпрджрд╛ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
|
| f await | рдордЬрдмреВрдд:
  • рдмрд╣реБрдд рдЖрд╕рд╛рди рдЪреЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • рдХрдо
рдХрдордЬреЛрд░:
  • рд╕рдорд╛рдирддрд╛ рдХреЗ рдЬрдВрдЧ рдореЗрдВ рдХреБрдЫ рднреА рд╕рдорд╛рдирддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ
  • рдореЗрд░рд╛ рдорд╕реНрддрд┐рд╖реНрдХ client.get("https://my_api").send() await.unwrap().json() await.unwrap() client.get("https://my_api").send() , await.unwrap().json() рдФрд░ await.unwrap() ( рдкрд╣рд▓реЗ рд╕рдореВрд╣рдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдлрд┐рд░ . ) рдЬреЛ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ
  • Haskellers рдХреЗ рд▓рд┐рдП: рдХрд░реА рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ
|
| f@ | рдордЬрдмреВрдд:
  • рдмрд╣реБрдд рдЖрд╕рд╛рди рдЪреЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • рдмрд╣реБрдд рдЫреЛрдЯрд╛
рдХрдордЬреЛрд░:
  • рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓реЗ)
  • @ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдЕрдиреБрдХреВрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
  • рдЕрдирджреЗрдЦреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ
  • рдЕрдиреНрдп рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ @ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
|
| f@await | рдордЬрдмреВрдд:
  • рдмрд╣реБрдд рдЖрд╕рд╛рди рдЪреЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
  • рдХрдо
  • рдЕрдЪреНрдЫрд╛ рдХреЛрдб рдкреВрд░рд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ
  • await рдХреЛ рдХреАрд╡рд░реНрдб рдмрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
  • рдлреЙрд░рд╡рд░реНрдб-рд╕рдВрдЧрдд: рдирдП рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ @operator рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ? @try рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛ред
  • рдореЗрд░рд╛ рдорд╕реНрддрд┐рд╖реНрдХ рд╕рд╣реА рд╕рдореВрд╣реЛрдВ рдореЗрдВ client.get("https://my_api").send()@await.unwrap().json()@await.unwrap() рд╕рдореВрд╣ рдмрдирд╛рддрд╛ рд╣реИ ( . рдкрд╣рд▓реЗ рд╕рдореВрд╣реАрдХреГрдд, рдлрд┐рд░ @ )
рдХрдордЬреЛрд░:
  • рдЕрдиреНрдп рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ @ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
  • рдХрдИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ
|

рдореЗрд░рд╛ рд╕реНрдХреЛрд░:

  • рдкрд░рд┐рдЪрд┐рдд (рдкрд╛рд░рд┐рд╡рд╛рд░рд┐рдХ): рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬреНрдЮрд╛рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдХрд┐рддрдирд╛ рдХрд░реАрдм рд╣реИ (рдЬрдВрдЧ рдФрд░ рдЕрдиреНрдп, рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рдпрдерди, рдЬреЗрдПрд╕, рд╕реА #)
  • рд╕реНрдкрд╖реНрдЯрддрд╛ (obv): рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдореЗрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдкрдврд╝ рд░рд╣реЗ рдереЗ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХрд╛ рдЕрд░реНрде, рдкреВрд░реНрд╡рддрд╛ рдЖрджрд┐ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рдкрд╛рдПрдВрдЧреЗ?
  • рд╡рд░реНрдмреЛрд╕рд┐рдЯреА (vrb): рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХрд┐рддрдиреЗ рдЕрдХреНрд╖рд░ рд▓рдЧрддреЗ рд╣реИрдВ
  • рджреГрд╢реНрдпрддрд╛ (рд╡рд┐рдЬрд╝рди): рдХреЛрдб рдореЗрдВ рд╕реНрдкреЙрдЯ рдХрд░рдирд╛ (рдмрдирд╛рдо рдЕрдирджреЗрдЦреА рдХрд░рдирд╛) рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ
  • chaining (рдЪрд╛): . рдФрд░ рдЕрдиреНрдп await s рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдЪреЗрди рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ
  • рд╕рдореВрд╣реАрдХрд░рдг (рдЬреАрдЖрд░рдкреА): рдХреНрдпрд╛ рдореЗрд░рд╛ рдорд╕реНрддрд┐рд╖реНрдХ рдХреЛрдб рдХреЛ рд╕рд╣реА рд╡рд┐рдЦрдВрдбрди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ
  • рдлреЙрд░рд╡рд░реНрдб-рдХрдореНрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА (fwd): рдХреНрдпрд╛ рдпрд╣ рдмрд╛рдж рдореЗрдВ рдЧреИрд░-рдмреНрд░реЗрдХрд┐рдВрдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

| рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ | рдлреИрдо | obv | vrb | рд╡рд┐рдЬрд╝ | рдЪрд╛ | рдЬреАрдЖрд░рдкреА | fwd |
| --------------------- | ----- | ----- | ----- | ----- | --- - | ----- | ----- |
| await!(fut) | ++ | + | - | ++ | - | 0 | ++ |
| await { fut } | ++ | ++ | - | ++ | - | 0 | + |
| await fut | ++ | - | + | ++ | - | 0 | - |
| fut.await | 0 | - | + | ++ | ++ | + | - |
| fut.await() | 0 | - | - | ++ | ++ | + | - |
| fut.await!() | 0 | 0 | - | ++ | ++ | + | - |
| fut(await) | - | - | 0 | ++ | ++ | + | - |
| fut await | - | - | + | ++ | ++ | - | - |
| fut@ | - | - | ++ | - | ++ | ++ | - |
| fut@await | - | 0 | + | ++ | ++ | ++ | 0 |

рдпрд╣ рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдХрдЯ рдореЗрдВ try!() рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдорд┐рд░рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ await!(expr) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ / рдЬрдм рд╣рдо рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ ..

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ рдмрджрд╕реВрд░рдд рд▓рдЧ рд░рд╣рд╛ рд╣реИ, "рдкрд░" рдХреЗ рд▓рд┐рдП "async" рдореБрдЭреЗ рдРрд╕рд╛ рд╕рд╣рдЬ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреАрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

async рдмрд┐рдирд╛ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдЧреИрд░ рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рдЧрд╛рдореА рдпрд╛ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдкрд░рдиреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм ? (рдЬреЛ рдЕрдХреНрд╕рд░ рд╣реЛрдЧрд╛) рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ .await!() рдЪреЗрди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдЗрд╕рдХреЗ рдЕрд░реНрде рдореЗрдВ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ ! рд╣реИрдВ, рдореБрдЭреЗ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЬрд╛рджреВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдХрдо рдЙрдкрдиреНрдпрд╛рд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП "рдЕрдЧрд▓рд╛ рдХрдЯ" рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдПрд╣рд╕рд╛рди рд╣реЛрдЧрд╛ред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╛рдХреА рд╣реИ рдХрд┐ рдкрд╣рд▓реА рдХрдЯ await! (expr) рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдХрд┐рддрдирд╛ рд╕реБрдзрд╛рд░ рд╣реЛрдЧрд╛ред

рдореИрдВ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ:
let result = await task;
рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдмрд╛рдПрдВ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
let result = somehowkindoflongtask await;
рдЬрдм рддрдХ рдЖрдк рдЙрд╕ рдХрд╛рд░реНрдп рдХреЗ рдЕрдВрдд рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рддрдм рддрдХ рдЖрдкрдХреЛ рдпрд╣ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╡рд╣ рд▓реМрдЯрддрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЕрдзреАрди рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдХреЗ рднрд╡рд┐рд╖реНрдп рд╕реЗ рд╕реАрдзреЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ) рдХрд┐ IDEs рдХреЗ рд░реВрдк рдореЗрдВ рдирд╛рдо рдФрд░ рдмрд░рд╛рдмрд░реА рдХреЗ рдмреАрдЪ рдХреЗ рд░реВрдк рдореЗрдВ (рдХрд┐рд╕реА рднреА рдирд┐рдЬреАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ) рдЗрдирд▓рд╛рдЗрди рдЯрд╛рдЗрдк рдХрд░реЗрдВред
рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд┐рддреНрд░ рджреЗрдВ:
6voler6ykj

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реА рд░рд╛рдп рдЙрдкрд╕рд░реНрдЧ рдХреА рдУрд░ рдПрдХ рд╕реМ рдкреНрд░рддрд┐рд╢рдд рд╣реИред рдЬрдм рдкрд░рд┐рдгрд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрд╣реБрдд рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рдХреЗ рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдЕрд░реНрде рд╣реИ:
future await?
future? await
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рдкрд░ рдЧреМрд░ рдХрд░реЗрдВ, рдпреЗ рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рд╕рдЪ рд╣реИ, рдПрдХ рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ:
await future? === await (future?)
await future? === (await future)?

рдореИрдВ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ: await future ред

рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдкрд░рд┐рдЪрд┐рдд рд╣реИ рдЬреЛ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВред

await future? рдХреА рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ?

  • рдПрдХ рд╕рдорд╛рд░реЛрд╣ Result<Future> рд▓реМрдЯ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред
  • рдПрдХ рднрд╡рд┐рд╖реНрдп рдЬрд┐рд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдЬреЛ Result : Future<Result> ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рджреМрд░рд╛рди рджреВрд╕рд░рд╛ рдорд╛рдорд▓рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ I / O рд╕рдВрдЪрд╛рд▓рди рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП:

await future? <=> (await future)?

рдХрдо рдЖрдо рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрд╖реНрдардХ рд╣реЛрдирд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ: await (future?) ред рдпрд╣ try! рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЗрд╕реЗ рдШрдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛: await try!(future) ред рдЗрд╕ рддрд░рд╣, await рдФрд░ рдкреНрд░рд╢реНрди рдЪрд┐рд╣реНрди рдСрдкрд░реЗрдЯрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкрдХреНрд╖реЛрдВ рдкрд░ рдирд╣реАрдВ рд╣реИрдВред

await рдХреЛ рдкрд╣рд▓реЗ async рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛?

async fn await_chain() -> Result<usize, Error> {
    let _ = partial_computation(await)
        .unwrap_or_else(or_recover)
        .run(await)?;
}

client.get("https://my_api")
    .send(await)?
    .json(await)?

let output = future
    .run(await);

рдпрд╣рд╛рдБ future.run(await) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ await future ред
рдпрд╣ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ async рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдмрд╕ await!() рдореИрдХреНрд░реЛ рдЙрд╕ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

рд╕реА ++ (рдХрдВрдЬреЗрдВрд╕реА рдЯреАрдЖрд░)

auto result = co_await task;

рдпрд╣ рдХреЛрд░рд╛рдЯрд╛рдЗрдиреНрд╕ рдЯреАрдПрд╕ рдореЗрдВ рд╣реИ, рди рдХрд┐ рд╕рдорд╡рд░реНрддреАред

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ become рдХреАрд╡рд░реНрдб рдХреА рдЬрдЧрд╣ await :

async fn become_chain() -> Result<usize, Error> {
    let _ = partial_computation_future(become)
        .unwrap_or_else(or_recover_future)
        .start(become)?;
}

client.get("https://my_api")
    .send_future(become)?
    .json_future(become)?

let output = future.start(become);

become рдЧрд╛рд░рдВрдЯреАрдХреГрдд TCO рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдЙрд╕ [рдЕрд╡рд▓реЛрдХрди] рдХреЗ рд▓рд┐рдП @EyeOfPython рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рдЕрдм рдХреЗрд╡рд▓ рдмрд╛рдЗрдХ-рд╢реЗрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╣рдо f await рд╕реЗ рджреВрд░ рд░рд╣реЗрдВрдЧреЗ, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рдЕрди-рджреЗрд╣рд╛рддреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ рдФрд░ рдпрд╣ рдереЛрдбрд╝реЗ рд╡рд┐рд╢реЗрд╖ рдФрд░ рдЬрд╛рджреВ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдЗрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрди рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрд╣реБрдд рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд░реБрд╕реНрдЯ рджрд┐рдЧреНрдЧрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рднреА, рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред

@novacrazy рдЗрд╕ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ await! рдореИрдХреНрд░реЛ _would_ рд╣реЛрдирд╛ рдЬрд╛рджреВ рд╣реИ, рдпрд╣ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ

@ рдирд┐рдореЛ 157 рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ await! рдореИрдХреНрд░реЛ рдЬрд╛рджреВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред std рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рдХрдИ рдореИрдХреНрд░реЛ рд╣реИрдВ, рдЬреИрд╕реЗ compile_error! рдФрд░ рдореИрдВрдиреЗ рдХрд┐рд╕реА рдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдкрд┐рдЫрд▓реЗ рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕-рдореИрдХреНрд░реЛ await!(expr) рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕-рдореИрдХреНрд░реЛ рдореЗрдВ рдПрдХ рдмрд╛рд░ рд╕рдВрдХреНрд░рдордг рд╣реЛрдЧрд╛ рдЬреЛ expr.await рдмрдЬрд╛рдп рдПрдХ рдЪреАрдЬрд╝ рд╣реИред" (рдореИрдЬрд┐рдХ рдХрдВрдкрд╛рдЗрд▓рд░-рдмрд┐рд▓реНрдбрд┐рди рдлреАрд▓реНрдб) рдпрд╛ expr.await() (рдореИрдЬрд┐рдХ рдХрдВрдкрд╛рдЗрд▓рд░-рдмрд┐рд▓рд┐рди рдореЗрдердб)ред рд╡реЗ рджреЛрдиреЛрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдирдпрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЖрдИрдПрдордУ рдЬреЛ рднрд╛рд╖рд╛ рдХреЛ рдЕрд╕рдВрдЧрдд рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИред

@EyeOfPython рдЕрдкрдиреА рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ future(await) рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИ? future.await() рдХреЗ рдЖрдкрдХреЗ рдЖрдХрд▓рди рдХреЗ рд╕рднреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХрд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВ

рдЪреВрдВрдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рд╡рдЬреВрдж, foo.await рдмрд╣реБрдд рдЕрдзрд┐рдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ, рд╣рдо рдЯреЛрдХрди . # рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп foo#await рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

let foo = alpha()#await?
    .beta#await
    .some_other_stuff()#await?
    .even_more_stuff()#await
    .stuff_and_stuff();

рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЧрд┐рдЯрд╣рдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдЧрд╛, рдЖрдЗрдП await рдХреЛ match рд╕рд╛рде рдмрджрд▓реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдорд╛рди рд▓рдВрдмрд╛рдИ рдХреЗ рд╣реИрдВ:

let foo = alpha()#match?
    .beta#match
    .some_other_stuff()#match?
    .even_more_stuff()#match
    .stuff_and_stuff();

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рджреЛрдиреЛрдВ рд▓рдЧрддрд╛ рд╣реИред

# рд▓рд┐рдП рддрд░реНрдХ рдХреЗ рдмрдЬрд╛рдп рдХреБрдЫ рдЕрдиреНрдп рдЯреЛрдХрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯреЛрдХрди рдХрд╛рдлреА рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдПрдХ рдФрд░ рдЕрд╡рдзрд╛рд░рдгрд╛: рдпрджрд┐ рднрд╡рд┐рд╖реНрдп рд╕рдВрджрд░реНрдн рдерд╛ :

async fn log_service(&self) -> T {
   let service = self.myService.foo(); // Only construction
   *self.logger.log("beginning service call");
   let output = *service.exec(); // Actually wait for its result
   *self.logger.log("foo executed with result {}.", output);
   output
}

async fn try_log(message: String) -> Result<usize, Error> {
    let logger = *acquire_lock();
    // Very terse, construct the future, wait on it, branch on its result.
    let length = (*logger.log_into(message))?;
    *logger.timestamp();
    Ok(length)
}

async fn await_chain() -> Result<usize, Error> {
    *(*partial_computation()).unwrap_or_else(or_recover);
}

(*(*client.get("https://my_api").send())?.json())?

let output = *future;

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрджрд╕реВрд░рдд рдФрд░ рдЕрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред рдХрдо рд╕реЗ рдХрдо рдЙрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЦрдВрдбрди рдХрд░реЗрдВ:

async fn log_service(&self) -> T {
   let service = self.myService.foo(); // Only construction
   $self.logger.log("beginning service call");
   let output = $service.exec(); // Actually wait for its result
   $self.logger.log("foo executed with result {}.", output);
   output
}

async fn try_log(message: String) -> Result<usize, Error> {
    let logger = $acquire_lock();
    // Very terse, construct the future, wait on it, branch on its result.
    let length = ($logger.log_into(message))?;
    $logger.timestamp();
    Ok(length)
}

async fn await_chain() -> Result<usize, Error> {
    $($partial_computation()).unwrap_or_else(or_recover);
}

($($client.get("https://my_api").send())?.json())?

let output = $future;

рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдмрджрд╕реВрд░рдд (рдФрд░ рдЕрднреА рддрдХ рдмрджрддрд░ рдпрд╣ рдЧрд┐рдЯрдмрдЯ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЛ

async fn log_service(&self) -> T {
   let service = self.myService.foo(); // Only construction
   self.logger.$log("beginning service call");
   let output = service.$exec(); // Actually wait for its result
   self.logger.$log("foo executed with result {}.", output);
   output
}

async fn try_log(message: String) -> Result<usize, Error> {
    let logger = $acquire_lock();
    // Very terse, construct the future, wait on it, branch on its result.
    let length = logger.$log_into(message)?;
    logger.$timestamp();
    Ok(length)
}

async fn await_chain() -> Result<usize, Error> {
    ($partial_computation()).$unwrap_or_else(or_recover);
}

client.get("https://my_api").$send()?.$json()?

let output = $future;

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ! рди рдХреЗрд╡рд▓ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП ( $ ), рдмрд▓реНрдХрд┐ рдбреЗрд░реЗрдлрд╝ ( * ) рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ ( ! ) рдХреЗ рд▓рд┐рдП рднреАред

рдЗрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдореЗрдВ рдХреБрдЫ рдЪреЗрддрд╛рд╡рдиреА:

  1. рдСрдкрд░реЗрдЯрд░ рдкреВрд░реНрд╡рддрд╛: рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣реИ?
  2. рдореИрдХреНрд░реЛрдЬрд╝ рдЗрдВрдЯрд░реЛрдк: $ рдкреНрд░рддреАрдХ рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛?
  3. рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрд╕рдВрдЧрддрддрд╛: рдЕрдЧреНрд░рдгреА рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдкреВрд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд┐рд▓рдВрдмрд┐рдд рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЗрд╡рд▓ . рд╕реАрдорд╛рдВрдХрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ ( await_chain fn рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ) рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рднреНрд░рд╛рдордХ рд╣реИ?
  4. рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди: рдХреНрдпрд╛ рд╡рд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд░реНрд╡рдорд╛рдиреНрдп рд╣реИ?

@Centril
IMO # рдХрдЪреНрдЪреЗ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ r#"A String with "quotes""#

IMO # рдХрдЪреНрдЪреЗ рд╢рд╛рдмреНрджрд┐рдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ r#"A String with "quotes""#

рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ рд╕рдВрджрд░реНрдн рд╕реЗ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИред

@Centril
рдпрд╣ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╢реИрд▓реА Rust IMHO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рджреЗрд╢реА рд╣реИред рдпрд╣ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред

@Laaas рди рддреЛ ? рдерд╛ рдЬрдм рдЗрд╕реЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ .await рд╕рд╛рде рдЬрд╛рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА; рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдЗрд╕рд╕реЗ рджреБрдЦреА рд▓рдЧрддреЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреБрдЫ рдФрд░ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдпрд╛рдиреА рд╕реНрдкрд╖реНрдЯ, рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ, рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЖрд╕рд╛рди рд╣реИ, рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рд╣реИ, рдЕрдЪреНрдЫрд╛ рдкреВрд░реНрд╡рддрд╛ рд╣реИ) рдФрд░ foo#await рдЙрд╕ рд╕рднреА рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИред

? рдкрд╛рд╕ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдиреНрдп рдЕрдЪреНрдЫреЗ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ, рдЬрдмрдХрд┐ # рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрдЬрд╛рдп рдордирдорд╛рдирд╛ рд▓рдЧрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ .await , рдХреНрдпреЛрдВ рдирд╣реАрдВ .await! ?

@ рдХреЗрдВрджреНрд░ рд╕реЗ future(await) рдкреАрдЫреЗ рдореБрдЦреНрдп рдФрдЪрд┐рддреНрдп рдерд╛, рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрдЯрд░ рдпрд╛ рд╡рд┐рджреЗрд╢реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред

рдЬрдмрдХрд┐ # рдЬрд╡рд╛рдд рдордирдорд╛рдирд╛ рд▓рдЧрддрд╛ рд╣реИред

# рдордирдорд╛рдирд╛ рд╣реИ, рд╣рд╛рдБ - рдпрд╣ рд╣реИ рдХрд┐ рдмрдирд╛рдУ рдпрд╛ рддреЛрдбрд╝реЛ? рдЬрдм рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдирдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдордирдорд╛рдирд╛ рд╣реЛрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдпрд╛ рдмрдирд╛ рд╣реБрдЖ рдЕрд░реНрде рд╣реИред

.await! рдХреНрдпреЛрдВ рдирд╣реАрдВ?

рдпрд╣ рднреА рдЙрддрдирд╛ рд╣реА рдордирдорд╛рдирд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рд╣реИред

@ рд╕реЗрдВрдЯреНрд░рд┐рд▓, future(await) рдкреАрдЫреЗ рдореБрдЦреНрдп рддрд░реНрдХ рдерд╛, рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрд░реЗрдЯрд░ рдпрд╛ рд╡рд┐рджреЗрд╢реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк await рд╕реЗ future ; рдХрд┐ "рдлреАрд▓реНрдб рдПрдХреНрд╕реЗрд╕" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ; рдХрд┐ "рдлреАрд▓реНрдб рдПрдХреНрд╕реЗрд╕" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╣ рд╕рд╣рдорддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдерд╛ред Await рдХрдИ рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдлрдВрдХреНрд╢рди рдХреЙрд▓ (рдЖрдкрдХреЗ рдФрд░ рдЖрдкрдХреЗ рд░рд┐рдЬрд▓реНрдЯ рдХреЗ рдмреАрдЪ рдореЗрдВ рдХреИрд▓реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ), рдФрд░ рдЙрд╕ рдлрдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рддрд░рд╣ рдХрд╛ рдХреЙрд▓ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреАрд╡рд░реНрдб рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реНрдХ рдХреЗ рд╕рдорд╛рди рд╣реИред (рдорд╛рдЗрдирд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдФрд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрд░рд░ рдореИрд╕реЗрдЬреЗрд╕ рдЙрд╕ рдореИрд╕реЗрдЬ рдХреЛ рдлрд┐рд░ рд╕реЗ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдлреНрдпреВрдЪрд░реНрд╕ рдХреЛ рд╡реЗрдЯ рд╣реЛрдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

@Centril

рдордирдорд╛рдирд╛ рд╣реЛрдирд╛ рдХреЛрдИ рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рд╕рдорд╛рдирддрд╛ рд╣реЛрдирд╛ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрд╛рдд рд╣реИред .await! рд░реВрдк рдореЗрдВ рдордирдорд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ; рд╕рдм рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕рд┐рд░реНрдл await рдирд╛рдо рд╡рд╛рд▓рд╛ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ await рд▓рд┐рдП рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреЛ рд╕реНрдкрд╖реНрдЯ / рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рд░рд╕реНрдЯ 1.0 (рдЬреИрд╕реЗ union ) рдХреЗ рдмрд╛рдж рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди AFAIK рдПрдХ рдПрдХрд▓ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ (рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЕрдВрддрд░рд┐рдХреНрд╖, рдбреЙрдЯ, рдпрд╛ рдХреБрдЫ рдФрд░ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) ред рдореИрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рднреА рдирд╣реАрдВ рд╕рдХрддрд╛, рдЬрд┐рд╕рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рд╣реИрдВред

IMHO рдПрдХрдорд╛рддреНрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдЬреЛ рд░рд╕реНрдЯ рдХреА рд╡рд┐рдЪрд┐рддреНрд░рддрд╛ рдХреЛ рдХрд╛рдлреА рдирд╣реАрдВ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╣реИ, рдЗрд╕реЗ рдорд┐рд░рд░ рдореЗрдердб рдХреЙрд▓реНрд╕ рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдкрд╣рд▓реЗ рд░рд╕реНрдЯ рдореИрдХреНрд░реЛ рджреЗрдЦрд╛ рд╣реИред

рдореБрдЭреЗ рднреА рдорд╛рдирдХ await!() рдореИрдХреНрд░реЛ рдкрд╕рдВрдж рдЖрдпрд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд░рд▓ рд╣реИред
рдореИрдВ awaited рд░реВрдк рдореЗрдВ рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб-рдЬреИрд╕реА рдкрд╣реБрдВрдЪ (рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдЙрдкрд╕рд░реНрдЧ) рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

  • рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ / рд╕рд╣реА рдЖрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд░рд╣реЗрдЧрд╛ред рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛, рдЬреЛ рдкрд╣рд▓реЗ рдЖрдпрд╛ / рдЫреЛрдбрд╝рд╛ред
  • рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ cloned() рдкрджреНрдзрддрд┐ рдХрд╛ рд╕реБрд╕рдВрдЧрддред

рдФрд░ рдореБрдЭреЗ @? ? -рд╕рдорд╛рди рдЪреАрдиреА рднреА рдкрд╕рдВрдж рд╣реИред
рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ &? рд╕рдВрдпреЛрдЬрди рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ @ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓рд╛рдЗрди рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╣реА рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред & рднреА рд▓рдВрдмрд╛ (рдЕрдЪреНрдЫрд╛) рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрдбрд░рд╕реНрдХреНрд░реВрдЯреНрд╕ (рдЕрдЪреНрдЫрд╛ рднреА рдирд╣реАрдВ) рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ & рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрд░реНрде рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ ? .. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред

Lorem@?
  .ipsum@?
  .dolor()@?
  .sit()@?
  .amet@?
Lorem@?.ipsum@?.dolor()@?.sit()@?.amet@?

Lorem&?
  .ipsum&?
  .dolor()&?
  .sit()&?
  .amet&?
Lorem&?.ipsum&?.dolor()&?.sit()&?.amet&?

рдореЗрд░реЗ рд▓рд┐рдП, @ рдПрдХ рдлреВрд▓рд╛ рд╣реБрдЖ рдЪрд░рд┐рддреНрд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдкрдврд╝рдиреЗ рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, &? рд╕реБрдЦрдж рд▓рдЧрддрд╛ рд╣реИ, (рдореЗрд░реЗ) рдкрдврд╝рдиреЗ рдХреЛ рд╡рд┐рдЪрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ & рдФрд░ ? рдмреАрдЪ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реНрдерд╛рди рд╣реИред

рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд░рд▓ await! рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рдореИрдХреНрд░реЛ рдХреЛ рдХреЗрд╡рд▓ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдирд╣реАрдВ?

@ рд▓рд╛рд╕рд╛ рдЬрд┐рддрдирд╛ рдореИрдВ рд╡рд╣рд╛рдВ рд░рд╣рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд░рд╕реНрдЯ рдореЗрдВ рдЕрднреА рддрдХ рдХреЛрдИ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ foo.await!.bar рдФрд░ foo.await!().bar рдПрдХ рд╣реА рд╕рддрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдФрд░ рдмрд┐рд▓рд┐рди рдореИрдХреНрд░реЛ рд╣реЛрдЧрд╛ (рдЬреЛ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ await рджреЗрдиреЗ рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ)ред

@jplatte

рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рд░реБрд╕реНрдЯ 1.0 рдХреЗ рдмрд╛рдж рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг union )

union рдПрдХ рд╕рдВрдпреБрдХреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрдЪрд╛рд▓рдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕ рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рд░рд╕реНрдЯ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ 3 рд╕реНрдерд┐рд░ рдпреВрдирд┐рд░реА рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ ( return , break , рдФрд░ continue ) рдФрд░ рдЙрди рд╕рднреА рдХреЛ ! рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╣рдореНрдо ... @ рдореЗрд░рд╛ рдкрд┐рдЫрд▓рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ:

client.get("https://my_api").@send()?.@json()?

let output = @future;

let foo = (@alpha())?
    .<strong i="8">@beta</strong>
    .@some_other_stuff()?
    .@even_more_stuff()
    .stuff_and_stuff();

@ рд╕реЗрдВрдЯреНрд░рд┐рд▓ рдореЗрд░реА рдмрд╛рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ await!() рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ .await!() FYIред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ await рдХреЛ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдкрд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рдЖрд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

union рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕ рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рд░рд╕реНрдЯ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ 3 рд╕реНрдерд┐рд░ рдпреВрдирд┐рдлрд╝рд┐рдХ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ ( return , break , рдФрд░ continue ) рдФрд░ рдпреЗ рд╕рднреА ! рдЯрд╛рдЗрдк рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ-рдХреАрд╡рд░реНрдб рд╕рдВрд╕реНрдХрд░рдг рднрд┐рдиреНрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рдореВрд╣ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕-рдХреАрд╡рд░реНрдб рд╡реИрд░рд┐рдПрдВрдЯ рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╡рд┐рдЪрд▓рди рд╣реИ, рдПрдХ рдЬреЛ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рднрд╛рд╖рд╛ рдореЗрдВ await рдХреЗ рдорд╣рддреНрд╡ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИред

рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рдФрд░ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: await рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб рдмрдиреЗ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдХреНрд░реЛ рддрдм рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рд▓реИрдВрдЧ рдЖрдЗрдЯрдо рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдпрд╣ рдмрд┐рдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд r# рдХреЗ рдирд╛рдо рдХреЗ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ r#await!() рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдЙрд╕реА рдореИрдХреНрд░реЛ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣реА рд╣реИ, await рдХреЛ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦреЗрдВ рд▓реЗрдХрд┐рди await! рдПрдХ рд▓реИрдВрдЧ-рдЖрдЗрдЯрдо рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд░реЗрдВред

@HeroicKatora рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб рдмрдиреЗ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

@ рд▓рд╛рд╕рд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╣рдо рд╕рдВрдХреНрд░рдордг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЦреБрд▓рд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд░рд╣рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдХреАрд╡рд░реНрдб рдЖрд░рдХреНрд╖рдг рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рд░рд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

@Centril

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ foo.await! .Bar рдФрд░ foo.await! ()ред рдмрд╛рд░ рдПрдХ рд╣реА рд╕рддрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИрдВред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдФрд░ рдмрд┐рд▓рд┐рди рдореИрдХреНрд░реЛ рд╣реЛрдЧрд╛ (рдЬреЛ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ)ред

рдХреНрдпрд╛ рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдореИрдХреНрд░реЛ (рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдзрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛) рдХреЗ рд▓рд┐рдП ! await рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рдХреАрд╡рд░реНрдб рдмрдирд╛рдХрд░ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рддрдм рдпрд╣ рдПрдХ рдХреАрд╡рд░реНрдб рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдПрдХ рдореИрдХреНрд░реЛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

@HeroicKatora await x.await!() рдЖрд░рдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдХреНрдпреЛрдВ рд╣реЛрдЧрд╛?

рдпрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рдХреЛ рдЕрдирд╕реБрд▓рдЭрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╡рд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рдЕрджреНрд╡рд┐рддреАрдп рд╕рд╣рдордд рдереЗ, рддреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдЗрд╕ рд╕рдЯреАрдХ рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЕрдкрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдПрдХ рдФрд░ рд╕рдордп рд╣реИ рдЬрдм рд╣рдо рдПрдХ рдРрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ рдЬреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЗрд╕рдХрд╛ рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг try! рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрдВрддрддрдГ рдЕрдкрдирд╛ рдкреНрд░рддреАрдХ ? ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдЦрд┐рд░реА рдмрд╛рд░ рдирд╣реАрдВ рд╣реИ рдЬрдм рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рд╣реИ рдФрд░ рд╣рдо рд╕рдм рдХреБрдЫ рдЕрдкрдиреЗ рд╡рд┐рд╢реЗрд╖ рдЪрд░рдЦреЗ рдХреЛ рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо @ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╢реИрд▓реА .await!() рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред

let x = foo().try!();
let y = bar().await!();

рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрд░реНрде рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдпрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп await!(foo) рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ foo.await!() рдпрд╛ foo@ рддрдХ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдЧрд░ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рддреАрдХ рдХреЛ рд╡рд╛рд░рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЗрд╕ рдореИрдХреНрд░реЛ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЬрд╛рджреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдХрд┐ std рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдЬреИрд╕рд╛ @jplatte рдиреЗ рдбрд╛рд▓рд╛:

@ рдирд┐рдореЛ 157 рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ await! рдореИрдХреНрд░реЛ рдЬрд╛рджреВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред std рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдРрд╕реЗ рдХрдИ рдореИрдХреНрд░реЛ рд╣реИрдВ, рдЬреИрд╕реЗ compile_error! рдФрд░ рдореИрдВрдиреЗ рдХрд┐рд╕реА рдХреЛ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдЖрд╡рд░реНрддреА рдореБрджреНрджрд╛ рдЬрд┐рд╕реЗ рдореИрдВ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдЪрд╛рдЗрдирд┐рдВрдЧ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдЬрдВрдЬреАрд░реЛрдВ рдореЗрдВ рдЬрдХрдбрд╝рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ред рд╢рд╛рдпрдж рдХреЛрдИ рдФрд░ рдЙрдкрд╛рдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдЕрдЧрд░ рд╣рдо рдЪрд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╡реЗрдЯ рдХрд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрд╕ рдЬрд╛рдиреЗ рджреЗрдВ:
await foo = future

рдлрд┐рд░ рдЪрд┐рдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣рдо await res = fut1 -> fut2 рдпрд╛ await res = fut1 >>= fut2 рдЬреИрд╕реЗ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЗрд╡рд▓ рдЧрд╛рдпрдм рдорд╛рдорд▓рд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреБрдЫ рд╢реЙрд░реНрдЯрдХрдЯ
await res = fut; res ред
рдпрд╣ рдПрдХ рд╕рд╛рджрд╛ await fut рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ (рдХрдо рд╕реЗ рдХрдо рдХреЗ рд▓рд┐рдП) рджреЗрдЦрд╛ рд╣реИ
рдЬрдВрдЬреАрд░), рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣рд╛рдБ рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

@HeroicKatora рдореИрдВрдиреЗ рд╕реВрдЪреА рдореЗрдВ fut(await) рдЬреЛрдбрд╝рд╛ рд╣реИ рдФрд░ рдореЗрд░реА рд░рд╛рдп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрд╕реЗ рд░реИрдВрдХ рдХрд┐рдпрд╛ рд╣реИред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд╕реНрдХреЛрд░рд┐рдВрдЧ рдмрдВрдж рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ!

рд╕рд┐рдВрдЯреЗрдХреНрд╕-рд╡рд╛рд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ .await!() рд╕рд╛рдл рд╣реИ рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╖рдорддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рдЪреЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдореЗрдВ рдХрднреА рднреА "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрднрд╡рддрдГ .r#await!() рдЫрд╛рдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрдмрдХрд┐ .await!() рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

рдореИрдВ "рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб" рд╡рд┐рдХрд▓реНрдк рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд╣реБрдд рдордЬрдмреВрдд рд╣реВрдВ (рдЬреИрд╕реЗ рдПрдХ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ: foo() await?.bar() await? ), рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдпрд╣ рддрдереНрдп рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ await рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╡рд╣ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдЬрд┐рд╕ рдкрд░ рд╡рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдБ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рддреАрдХ рдХреЛ рдмрд╣реБрдд рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рдФрд░ рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд╡рдЬреВрдж рднреА рдЗрд╕ рдкрд░ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рд╕реНрдкрд╖реНрдЯ рд╡рд░реАрдпрддрд╛" ( await? рдЪреАрдиреА рдХреЗ рд╕рд╛рде) рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрд╕рд░реНрдЧ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдПрдХ рдПрдХрд▓ рдХрдерди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд░реНрдж рд╣реИ, рдФрд░ "рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рддрд╛" рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рд╕рд╣рдЬ, рдФрд░ рдЗрд╕ рддрд░рд╣ рднреНрд░рдорд┐рддред

рд╕рд┐рдВрдЯреЗрдХреНрд╕-рд╡рд╛рд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ .await!() рд╕рд╛рдл рд╣реИ рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╖рдорддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рдЪреЗрдирд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдореЗрдВ рдХрднреА рднреА "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрднрд╡рддрдГ .r#await!() рдЫрд╛рдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрдмрдХрд┐ .await!() рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

рдЕрдЧрд░ рд╣рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдорд┐рд▓рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо .await!() рддреЛ рд╣рдо рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ await рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЗрд╕реЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдореИрдХреНрд░реЛ рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдПрдХ рдЬрд╛рджреБрдИ рдЬрд╛рджреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдЬ compiler_error! рддрд░рд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореИрдХреНрд░реЛ рд╣реЛрдЧрд╛ред

@EyeOfPython рд╢рд╛рдпрдж рдЖрдк forward-compatibility рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ рдХрд┐ fut@await fut.await!() рдФрд░ await { future } await!(future) рд╕реЗ рдХрдо рдХреА рджрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред verbosity рдХреЙрд▓рдо рднреА рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ, рдХреБрдЫ рднрд╛рд╡ рдХрдо рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░реЗрдЯрд┐рдВрдЧ рдХрдо рд╣реЛрддреА рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдЬрдВрдЬреАрд░ рд╕рдВрдмрдВрдзреА рдХрдердиреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐ рд╕рдм рдХреБрдЫ рд╕рдВрддреБрд▓рд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЕрдм рддрдХ рдХреЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╕рдВрдШрдирд┐рдд рд╡реНрдпрд╛рдкрдХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреА рддрд░рд╣ред

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп await!() рдореИрдХреНрд░реЛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдореИрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдЪ рдорд╛рдиреВрдВрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рд╕рднреА рдХреА рд░рд╛рдп рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛: рдХреНрдпрд╛ рд╣рдо рд╕рднреА рдХреЛ рдЕрдм рдХреЗ рд▓рд┐рдП await!(future) рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд╕рд╣рдордд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЙрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдореИрдХреНрд░реЛ рднреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЪрд┐рдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрджрд╕реВрд░рдд рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЗрд╕реЗ рдирд┐рдкрдЯрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдореНрдореАрдж рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдкрдХреНрд╡ рдЕрдиреБрднрд╡, рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рд╕рдВрдХрд▓рдХ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

@HeroicKatora рдореИрдВрдиреЗ рдЗрд╕реЗ рдЙрдЪреНрдЪ рджрд░реНрдЬрд╛ рджрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ await рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдиреНрдп рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЬрдмрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ fut.await!() рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ await рдЖрд░рдХреНрд╖рд┐рдд рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдБ рдЕрдЧрд░ рдпрд╣ рдЙрдЪрд┐рдд рд╣реИ, рдпрд╣ рднреА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорд╛рдиреНрдп рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ fut.await!() рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

await { future } рдмрдирд╛рдо await!(future) , рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд░рд╣рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ await future рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ ( рдЬреИрд╕рд╛ рдХрд┐ @withoutboats рдХреА рдмреНрд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ fwd(await { future }) < fwd(await!(future)) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрд░рд┐рдпрд╛рддреНрдордХрддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдЙрдкрд╕рдореВрд╣реЛрдВ рдореЗрдВ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдХреНрд░рд┐рдпрд╛-рдХреНрд╖рдорддрд╛ рдХрд╛ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рд╕рднреА рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрджреНрджреЗрд╢реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реВрдВрдЧрд╛, рдзрдиреНрдпрд╡рд╛рдж!

await!(future) рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕рдВрднрд╡ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

  1. рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ await рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХреА рднрд╛рд╖рд╛ рдХрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
  2. рдпрд╣ рдЬрд╛рдирдмреВрдЭрдХрд░ try!(result) рд╕рд╛рде рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рд▓реЗ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╡рдВрдЪрд┐рдд рдХрд┐рдпрд╛ (рдФрд░ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП r#try!(result) 201 рдореЗрдВ

    • рдпрджрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ await!(future) рдЦрд░рд╛рдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рд╡рдВрдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрдЪреНрдЫрд╛рд╢рдХреНрддрд┐ рддрдХрдиреАрдХреА рдЛрдг рдкреИрджрд╛ рдХрд░ рд░рд╣реА рд╣реИред

    • рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, try!(..) рдХреЛ Rust рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрдмрдХрд┐ await!(future) рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдХрд▓рдХ рдЬрд╛рджреВ рд╣реЛрдЧрд╛ред

    • try!(..) рдХреЛ рд╣рдЯрд╛рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдерд╛ рдФрд░ рд╕рд╛рдорд╛рдЬрд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдЯреЛрд▓ рд▓рд┐рдпрд╛ред рдлрд┐рд░ рдЙрд╕ рдЕрдЧреНрдирд┐ рдкрд░реАрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ рдЖрдХрд░реНрд╖рдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ред

  3. рдпрд╣ рднрд╛рд╖рд╛ рдХреЗ рдПрдХ рдХреЗрдВрджреНрд░реАрдп рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛; рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рдирд╣реАрдВ рд╣реИред
  4. await!(future) рд╢реЛрд░ рд╣реИ ; рд╡рд┐рдкрд░реАрдд await future рдЖрдк рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд !( ... ) ред
  5. рдЬрдВрдЧ рдПрдкреАрдЖрдИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Iterator s рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрдо рдмрд╛рдд рд╣реИред await { future } рдФрд░ await future , await!(future) рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХрдард┐рди рдмрдирд╛ рджреЗрдЧрд╛ рдФрд░ рдЕрд╕реНрдерд╛рдпреА let рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдФрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдмреБрд░рд╛ рд╣реИред

@ рд╕реЗрдВрдЯреНрд░реАрд▓ рдореИрдВ рд╕рд╣рдордд рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдХреБрдЫ рдЦреБрд▓реЗ рдкреНрд░рд╢реНрди рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк 1. рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ? рдпрджрд┐ рд╣рдо рдЗрд╕реЗ 'рдЬрд╛рджреВ' рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рджреВ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рдореИрдВрдиреЗ 2. рдХреЗ рд╕рд╛рдорд╛рдЬрд┐рдХ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Rust рдореЗрдВ рдмрд╣реБрдд рджреЗрд░ рдХрд░ рджреАред рдПрдХ рдЧрд▓рддреА рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдЖрдХрд░реНрд╖рдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдХреБрдЫ рдХреЛрдб рдЕрднреА рднреА try! рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рдерд╛ред рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░рд╛ рдЗрд░рд╛рджрд╛ async/await рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдХреЗ рд░реВрдк рдореЗрдВ 2018 рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╣реИ рдпрд╛ рдлрд┐рд░ рдзреИрд░реНрдп рд░рдЦреЗрдВ рдФрд░ рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдПрдВ рдирд╣реАрдВред

рджреЛ рдЕрдиреНрдп (imho) рдХреЗрдВрджреНрд░реАрдп рд╕реБрд╡рд┐рдзрд╛рдПрдБ 3. : vec![] рдФрд░ format! / println! ред рдкреВрд░реНрд╡ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдБ рдХреЛрдИ рд╕реНрдерд┐рд░ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реИ, рдмрд╛рдж рдореЗрдВ рдкреНрд░рд╛рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрд╛рд░рдг рдФрд░ рдирд┐рд░реНрднрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдгред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрди рддреБрд▓рдирд╛рдУрдВ рдиреЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ 4. рдХреЛ рджреВрд╕рд░реЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред

рдореИрдВ рдХрд┐рд╕реА рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИред IE, "рдкреНрд░рддреАрдХреНрд╖рд╛ x" рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рддрд░рд╣ рдХреБрдЫ рдкрдврд╝рддрд╛ рд╣реИред "x # !! @! &" рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред "x.await" рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рддрд░рд╣ tantalizingly рдкрдврд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддрдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм x рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд░реЗрдЦрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд▓рдВрдмреЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдпрд╛ рдЬрдВрдЬреАрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛, рдЖрджрд┐ред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ "рдХреАрд╡рд░реНрдб x" рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдХреАрд╡рд░реНрдб рд╕рдВрднрд╡рддрдГ await ред рдореИрдВ рджреЛрдиреЛрдВ C ++ рдХреЛрд░рдЯрд╛рдЗрди рдЯреАрдПрд╕ рдФрд░ рдпреВрдирд┐рдЯреА рдХреЗ c # рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрддрд╛ рд╣реВрдВ, рдЬреЛ рджреЛрдиреЛрдВ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдмрд╣реБрдд рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдЖрдкрдХреА рдкреИрджрд╛рд╡рд╛рд░ рдХреЗ рдмрд┐рдВрджреБ рдХрд╣рд╛рдБ рд╣реИрдВ, рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ, рдмрд┐рд▓реНрдХреБрд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ред рдЬрдм рдЖрдк рдЗрдВрдбреЗрдВрдЯ рд▓рд╛рдЗрди рдХреЛ рд╕реНрдХрд┐рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХрд╛ рдлрдВрдХреНрд╢рди, рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдХреЗ, рдкреНрд░рддреНрдпреЗрдХ 200 yield return рдлрдВрдХреНрд╢рди рдореЗрдВ co_await / yield return рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╣реА рдбреЙрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рдж рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдЪ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдЙрдкрд╕рд░реНрдЧ "рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдвреЗрд░" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ await рдПрдХ рдореМрд▓рд┐рдХ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрд╢рди рд╣реИред рдЗрд╕реЗ 'if , while , match , рдФрд░ return рдХреЗ рд╕рдорд╛рди рд╕рдореНрдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдЪрд╛рд▓рдХ рдереЗ - рд░рд╕реНрдЯ рдХреЛрдб рдкрдврд╝рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╕рдкрдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рддрд░реНрдХ рдХреА рддрд░рд╣, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдк рдХрд┐рд╕реА рднреА рд░рд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЗрдВрдбреЗрдВрдЯ рд▓рд╛рдЗрди рдХреЛ рд╕реНрдХрд┐рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рднреА рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ @ejmahler рд╕реЗ рд╕рд╣рдордд рд╣реВрдБред рд╣рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреВрд╕рд░реЗ рдкрдХреНрд╖ - рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХреЛ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдмрд╣реБрдд рдмрд╛рд░ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдФрд░ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдкрд░ рдкреИрджрд╛рд╡рд╛рд░ рдЕрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ Useful precedence рд▓рд┐рдП рдорддрджрд╛рди рдХрд░реВрдВрдЧрд╛ред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣:

...
let response = await client.get("https://my_api").send()?;
let body: MyResponse = await response.into_json()?;

рдмрд▓реНрдХрд┐ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ:

...
let body: MyResponse = client.get("https://my_api").send().await?.into_json().await?;

@HeroicKatora

@ рд╕реЗрдВрдЯреНрд░реАрд▓ рдореИрдВ рд╕рд╣рдордд рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдХреБрдЫ рдЦреБрд▓реЗ рдкреНрд░рд╢реНрди рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк 1. рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ? рдпрджрд┐ рд╣рдо рдЗрд╕реЗ 'рдЬрд╛рджреВ' рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рджреВ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ?

рддрдХрдиреАрдХреА рддреМрд░ рдкрд░? рд╕рдВрднрд╡рддрдГред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрдд рдФрдЪрд┐рддреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╛рджреВ рдкрд░ рдЬрд╛рджреВ рдЙрдЪрд┐рдд рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреЗ рд╕рд╡рд╛рд▓ рдХреЛ рд▓рд╛рддрд╛ рд╣реИ async/await рдПрдХ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ 2018 рдпрд╛ рдмрд▓реНрдХрд┐ рд╣реЛ рд░реЛрдЧреА рдФрд░ рдЗрд╕ рджреЛрд╣рд░рд╛рдирд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣рдордиреЗ рдХрднреА рдХрд╣рд╛ рдХрд┐ рд╣рдордиреЗ рдирдП рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЗрд░рд╛рджрд╛ рдХрд┐рдпрд╛ рд╣реИ, async / await , рдФрд░ try { .. } рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рд╣реЛ; рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдЗрд░рд╛рджреЗ рдЪрд╛рд╣реЗ рдЬреЛ рднреА рд╣реЛрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЛрдЧ рдЕрдВрддрддрдГ рдмреЗрд╣рддрд░ рдФрд░ рдЕрдзрд┐рдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред

рджреЛ рдЕрдиреНрдп (imho) рдХреЗрдВрджреНрд░реАрдп рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдмрд╣реБрдд рдкрд╕рдВрдж рдХрд░рддреА рд╣реИрдВ 3. : vec![] рдФрд░ format! / println! ред рдкреВрд░реНрд╡ рдмрд╣реБрдд рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╕реНрдерд┐рд░ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рд╣реИ,

рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рдФрд░ рд▓рд┐рдЦрд╛ рд╣реИ vec![1, 2, 3, ..] , рд╢рд╛рдмреНрджрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреИрд╕реЗ [1, 2, 3, ..] ред

@ejmahler

"x.await" рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рддрд░рд╣ tantalizingly рдкрдврд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рддрдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм x рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рд░реЗрдЦрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд▓рдВрдмреЗ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓, рдпрд╛ рдЬрдВрдЬреАрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛, рдЖрджрд┐ред

рдЬрдВрдЬреАрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдЧрд▓рдд рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЬрдВрдЧ рд╣реИред
rustfmt рдЯреВрд▓ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЛ рднреА рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛ (рдлрд┐рд░ рд╕реЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП match рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ):

let foo = alpha().match?  // or `alpha() match?`, `alpha()#match?`, `alpha().match!()?`
    .beta
    .some_other_stuff().match?
    .even_more_stuff().match
    .stuff_and_stuff();

рдпрджрд┐ рдЖрдк .await "

рдФрд░ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдЖрдкрдХреА рдкреИрджрд╛рд╡рд╛рд░ рдХреЗ рдмрд┐рдВрджреБ рдХрд╣рд╛рдБ рд╣реИрдВ, рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ, рдмрд┐рд▓реНрдХреБрд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ред

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ await рдХреИрд╕реЗ рдЙрдкрд╛рд░реНрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ rustfmt рд╕реНрд╡рд░реВрдкрдг рдореЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

let foo = alpha().match?;
let bar = foo.beta.some_other_stuff().match?;
let baz = bar..even_more_stuff().match;
let quux = baz.stuff_and_stuff();

рдпрджрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ред

рдХреЛрдИ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдХреЗ рд╕рд╛рде рд╕реЗрдХрдВрдб рдХреЗ рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ 200-рд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВред

рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 200 рдПрд▓рдУрд╕реА рд╢рд╛рдпрдж рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ await рдПрдХ рдореМрд▓рд┐рдХ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрд╢рди рд╣реИред

рддреЛ ? ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, await рдФрд░ ? рджреЛрдиреЛрдВ рдкреНрд░рднрд╛рд╡реА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрдЪрд╛рд▓рди рд╣реИрдВ рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ "рд╕рдВрджрд░реНрдн рд╕реЗ рдмрд╛рд╣рд░ рдореВрд▓реНрдп рдирд┐рдХрд╛рд▓реЗрдВ"ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЖрдк рдЗрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ await : impl Future<Output = T> -> T рдФрд░ ? : impl Try<Ok = T> -> T рд╣реЛрдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░ рдпрд╣рд╛рдБ рдЕрдкрд╡рд╛рдж ? ?

@andreytkachenko

рдореИрдВ @ejmahler рд╕реЗ рд╕рд╣рдордд рд╣реВрдБред рд╣рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреВрд╕рд░реЗ рдкрдХреНрд╖ - рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХреЛ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдмрд╣реБрдд рдмрд╛рд░ рдкрдврд╝реА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдФрд░ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрд╕рд╣рдорддрд┐ рдкрдардиреАрдпрддрд╛ рдФрд░ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реЛрдЧреАред

рдмрд▓реНрдХрд┐ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ:

...
let body: MyResponse = client.get("https://my_api").send().await?.into_json().await?;

рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХреИрд╕реЗ рд╣реЛрдЧрд╛; rustfmt рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

let body: MyResponse = client
    .get("https://my_api")
    .send()
    .match?
    .into_json()
    .match?;

@ejmahler @andreytkachenko рдореИрдВ рдпрд╣рд╛рдБ @Centril рд╕реЗ рд╕рд╣рдордд рд╣реВрдБ, рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдкрд░рд┐рд╡рд░реНрддрди (рдХреБрдЫ рд╕реБрдзрд╛рд░ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛) рдЖрдк рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдЕрдкрдиреЗ рдмрдпрд╛рдиреЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ - рдЬрдм рддрдХ рдХрд┐ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХреЗред Rust-y рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрд╡рд░реВрдкрдг рдирд┐рдпрдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЙрдкрдЬ-рдмрд┐рдВрджреБ рдХреЛ рдЕрдзрд┐рдХ рдЕрд╕реНрдкрд╖реНрдЯ рдорд╛рдирддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ await рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдХреЛрдб рдмрд┐рдВрджреБ рдкрд░ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рдЙрдкрдЬ рджреЗрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред

рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ, рдмрд▓реНрдХрд┐ await рд╕рд╛рде let рдХреЗ рдмрджрд▓реЗ рдореЗрдВ

await? response = client.get("https://my_api").send();
await? body: MyResponse = response.into_json();

рд▓реЗрдХрд┐рди рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рд╡реНрдпрд╛рдХрд░рдг рдореЗрдВ рдЙрдирдХреА рдХрдордЬрд╝реЛрд░реА рдФрд░ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд▓рд╛рдн рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

рд╣рдореНрдо ... рдХреНрдпрд╛ рдпрд╣ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпрдп рджреЛрдиреЛрдВ рд░реВрдкреЛрдВ рдореЗрдВ рд╣реЛрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ? рдпрд╛ рд╕рд┐рд░реНрдл рдкреНрд░рддреНрдпрдп рдХрд╛ рд░реВрдк?

рд╕рд╛рде рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ рдореЗрдердб рдХреЙрд▓рд┐рдВрдЧ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдФрд░ рдмрд╣реБрдд рдХрдо рд╣рдж рддрдХ рд╡рд┐рдХрд▓реНрдк, рд▓реЗрдХрд┐рди рдЙрд╕рд╕реЗ рдЕрд▓рдЧ, рдЬрдВрдЧ рд╣реИ
рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ рдкрд╣рд▓реЗ рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рджреВрд╕рд░реАред

рдореИрдВ рдпрд╣ рддрд░реНрдХ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рдЪрдореБрдЪ рдореЗрдВ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдореИрдВ рдорд╛рдХрди рд╣реВрдВ
рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рд▓реЛрдб рддрд░реНрдХ рдЬреЛ рдПрдХ рд╢реАрд░реНрд╖ рд╕реНрддрд░реАрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ,
'рд╡рд╛рдкрд╕реА' рдХреЗ рд╕рдорд╛рди рдорд╣рддреНрд╡ рд░рдЦрддреЗ рд╣реБрдП, рдЬрдм рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдмрдврд╝рддрд╛ рд╣реИ
рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдХрд░реАрдм рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ - рдФрд░ рдореИрдВ
рдЙрддреНрдкрд╛рджрди рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рддрд░реНрдХ рджреЗрдирд╛ред

рд╕рдд рдкрд░, 19 рдЬрдирд╡рд░реА, 2019 рдХреЛ рд╕реБрдмрд╣ 11:59 рдмрдЬреЗ рдорд╛рдЬрд╝рджрд╛рдХ рдлрд╝рд╛рд░реЛрдЬрд╝рдЦрд╛рдж рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@HeroicKatora https://github.com/HeroicKatora

@Centril https://github.com/Centril рдореИрдВ рд╕рд╣рдордд рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рд╣реИрдВ
рдХреБрдЫ рдЦреБрд▓реЗ рд╕рд╡рд╛рд▓ред рдХреНрдпрд╛ рдЖрдк 1 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ? рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ 'рдЬрд╛рджреВ' рдмрдирд╛ рд▓реЗрддреЗ
рд╣рдо рдЗрд╕реЗ рдмрд┐рдирд╛ рдореИрдХреНрд░реЛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╛рджреВ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ
рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдЫреЛрдбрд╝рдирд╛

рддрдХрдиреАрдХреА рддреМрд░ рдкрд░? рд╕рдВрднрд╡рддрдГред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдХреЗ рд▓рд┐рдП рдордЬрдмреВрдд рдФрдЪрд┐рддреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╛рджреВ рдкрд░ рдЬрд╛рджреВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ
рдиреНрдпрд╛рдпрд╕рдВрдЧрддред

рдпрд╣ рд╕рд╡рд╛рд▓ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░рд╛ рдЗрд░рд╛рджрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реЛрдиреЗ рдХрд╛ рд╣реИ
2018 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреНрд░рд╡рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдзреИрд░реНрдп рд░рдЦреЗрдВ рдФрд░ рдирд╣реАрдВ
рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдПрдВред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдордиреЗ рдХрднреА рдХрд╣рд╛ рдХрд┐ рд╣рдо рдирдП рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЗрд░рд╛рджрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, async /
рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдФрд░ рдкреНрд░реЛрддреНрд╕рд╛рд╣рди рдХреЗ рд▓рд┐рдП {..} рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ; рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рдЗрд░рд╛рджрд╛ рдЪрд╛рд╣реЗ рдЬреЛ рднреА рд╣реЛ
рд╡реЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рд╣рдо рдЕрдВрддрддрдГ рд▓реЛрдЧреЛрдВ рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдмреЗрд╣рддрд░ рдФрд░ рдЕрдзрд┐рдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирдИ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ
рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВред

рджреЛ рдЕрдиреНрдп (imho) рдХреЗрдВрджреНрд░реАрдп рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИрдВ 3: vec! [] рдФрд░ рдкреНрд░рд╛рд░реВрдк!
println !. рдкреВрд░реНрд╡ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╕реНрдерд┐рд░ рдмреЙрдХреНрд╕рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ
рдирд┐рд░реНрдорд╛рдг afaik,

рдкреВрд░реНрд╡ рдореМрдЬреВрдж рд╣реИ, рдФрд░ vec рд▓рд┐рдЦрд╛ рд╣реИ! [1, 2, 3, ..], рдорд┐рдорд┐рдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП
рд╢рд╛рдмреНрджрд┐рдХ рднрд╛рд╡, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП [1, 2, 3, ..]ред

@ejmahler https://github.com/ejmahler

"x.await" рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рддрд░рд╣ tantalizingly рдкрдврд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм x рдПрдХ рд╣реИ
рдЧреИрд░-рддреБрдЪреНрдЫ рд░реЗрдЦрд╛, рдЬреИрд╕реЗ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рд▓рдВрдмреЗ рдирд╛рдореЛрдВ, рдпрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдХрд╣рддреЗ рд╣реИрдВ
рдЬрдЗрдпреВрдЯреЗрдб рдЗрдЯрд░реЗрдЯрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА, рдЖрджрд┐ред

рдЬрдВрдЬреАрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рдЧрд▓рдд рдХреНрдпрд╛ рд╣реИ? рд╡рд╣ рдЕрд▓рдЧ рд╣реИ
рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЬрдВрдЧред
рд░рд╕реНрдЯрдлрд╝реЗрдордЯ рдЯреВрд▓ рд╡рд┐рднрд┐рдиреНрди рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЛ рднреА рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░реЗрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк
рдлрд┐рд░ рд╕реЗ (рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):

рдЪрд▓реЛ рдлреВ = рдЕрд▓реНрдлрд╝рд╛ ()? // рдпрд╛ alpha() match? , alpha()#match? , alpha().match!()?
.beta
.some_other_stuff ()ред рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ?
.even_more_stuff ()ред рдореИрдЪ
.stuff_and_stuff ();

рдпрджрд┐ рдЖрдк рдкрдврд╝рддреЗ рд╣реИрдВред "рддреЛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдПред

рдФрд░ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╛рдирдирд╛рдЬрд╣рд╛рдБ рдЖрдкрдХреЗ рдЙрдкрдЬ рдмрд┐рдВрджреБ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ, рдмрд┐рд▓реНрдХреБрд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ ред

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЦрд╛рд╕рддреМрд░ рдкрд░ рд╕рд░рд╕рд░рд╛рд╣рдЯ рдореЗрдВ
рдКрдкрд░ рд╕реНрд╡рд░реВрдкрдгред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:

let foo = Alpha ()ред; match; let bar = foo.beta.some_other_stuff;); match; let baz = bar..even_more_stuff ()ред match; let quux = baz .stuff_and_stuff ()ред

рдпрджрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ред

рдХреЛрдИ рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдХреЗ рд╕рд╛рде рд╕реЗрдХрдВрдб рдХреЗ рдПрдХ рдорд╛рдорд▓реЗ рдореЗрдВ 200-рд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВред

рд╡рд┐рд╢реЗрд╖ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ
200 LOC рд╢рд╛рдпрдж рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреА рд╣реИ рдФрд░ рдХрд░рддреА рд╣реИ
рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрд╛рдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ, рдореИрдВ
рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрдХ рдореМрд▓рд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрд╢рди рд╣реИред

рддреЛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрдВрддрдЬрд╛рд░ рд╣реИ рдФрд░? рджреЛрдиреЛрдВ рдкреНрд░рднрд╛рд╡реА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ "рд╕рдВрджрд░реНрдн рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдореВрд▓реНрдп"ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕реНрдерд╛рдиреАрдп рдореЗрдВ
рд╕рдВрджрд░реНрдн, рдЖрдк рдЗрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдирд┐рд╣рд┐рдд
рднрд╡рд┐рд╖реНрдп-> рдЯреА рдФрд░ : рдХреЛрд╢рд┐рд╢ рдХрд░реЛ-> рдЯреАред

рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕рд░рддред

рдФрд░ рдпрд╣рд╛рдБ рдЕрдкрд╡рд╛рдж рд╣реИ? ?

@andreytkachenko https://github.com/andreytkachenko

рдореИрдВ @ejmahler https://github.com/ejmahler рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рд╣рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдиреНрдп рдкрдХреНрд╖ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ - рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ред рд╕реЛрд░реНрд╕ рдХреЛрдб рд╡рд╛рд▓реА рдлрд╛рдЗрд▓ рд╣реИ
рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдлрд┐рд░ рд▓рд┐рдЦрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдкрдврд╝рдирд╛-рд╕рдордЭрдирд╛ рдФрд░ рдлрд┐рд░ рд▓рд┐рдЦрдирд╛ред

рдЕрд╕рд╣рдорддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдФрд░
рд╢реНрд░рдорджрдХреНрд╖рддрд╛ рд╢рд╛рд╕реНрддреНрд░ред

рдмрд▓реНрдХрд┐ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИ:

... рджреЗрд╣: myResponse = client.get ("https: // my_api") .send () рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ? .into_json ()ред рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ ?;

рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХреИрд╕реЗ рд╣реЛрдЧрд╛; рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЬрдВрдЧ рдЦрд╛рдП рд╣реБрдП рд╕реНрд╡рд░реВрдкрдг
рд╣реИ:

рд▓реЗрдЯ рдмреЙрдбреА: MyResponse = рдХреНрд▓рд╛рдЗрдВрдЯ
.Get ( "https: // my_api")
.send ()
.match?
.into_json ()
.match ?;

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/57640#issuecomment-455810497 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABGmeocFJpPKaypvQHo9LpAniGOUFrmzks5vE3kXgaJpZM4aBlba
ред

@ejmahler рд╣рдо рдлрд┐рд░ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реИрдВред "рдЫреБрдкрд╛ рд░рд╣реЗ рд╣реИ"; рдЙрдиреНрд╣реАрдВ рддрд░реНрдХреЛрдВ рдХреЛ wrt рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред

? рдСрдкрд░реЗрдЯрд░ рдмрд╣реБрдд рдХрдо рд╣реИ, рдФрд░ рдЕрддреАрдд рдореЗрдВ рдПрдХ рд╡рд╛рдкрд╕реА рдХреЛ "рдЫрд┐рдкрд╛рдиреЗ" рдХреЗ рд▓рд┐рдП рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЧрдИ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдмрд╛рд░ рдХреЛрдб рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓рд┐рдЦрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред ?! рд▓рд┐рдП рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ рдЗрд╕реЗ рджреЛ рдЧреБрдирд╛ рд▓рдВрдмрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ред

рдлрд┐рд░ рднреА, рд╣рдордиреЗ рдЕрдВрддрддрдГ ? рд╕реНрдерд┐рд░ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рддрдм рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рдлрд▓ рд░рд╣реА рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рдкреНрд░рд╛рдХреГрддрд┐рдХ рд░реАрдбрд┐рдВрдЧ рдСрд░реНрдбрд░ (рдХрдо рд╕реЗ рдХрдо рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рднрд╛рд╖рд╛ рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП) рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдбреЗрдЯрд╛-рдлреНрд▓реЛ рдСрд░реНрдбрд░ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред

рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рдХреБрдЫ рдкреНрд░рддреАрдХреНрд╖рд┐рдд-рд╕рдВрдмрдВрдзрд┐рдд рдХреЛ рдЙрдЬреНрдЬреНрд╡рд▓ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ await рд╢рдмреНрдж рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреНрд░рддреАрдХ рдерд╛, рддреЛ рднреА рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рдкрдардиреАрдп рдФрд░ рдЦреЛрдЬрдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдЧрд╛ред рдЙрд╕ рдХреЗ рд╕рд╛рде, рдореИрдВ рдЕрднреА рднреА await рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рд░реНрдл рдордирдореБрдЯрд╛рд╡ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ - рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рддреАрдХ рдХреЗ рдмрдЬрд╛рдп await рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ @ рдпрд╛ #, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╡реНрдпрд╛рдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред

рдпрд╣ рд╕рдм рд░реЙрдХреЗрдЯ рд╕рд╛рдЗрдВрд╕ рдирд╣реАрдВ рд╣реИ

let body: MyResponse = client.get("https://my_api").send()...?.into_json()...?;

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ ... рдмреЗрд╣рдж рдкрдардиреАрдп рд╣реИ, рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдпрд╛рдж рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рд╕реБрдкрд░ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдХреЛрдбрд┐рдВрдЧ рдЕрдиреБрд░реЗрдЦрдг рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рдкреВрд░реНрд╡рддрд╛ / рд╕реНрдереВрд▓ shenanigans рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдкрд░рд┐рдЪрд┐рдд sigils рд╕реЗ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрди рд╢реЛрд░, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рджреАрд░реНрдШрд╡реГрддреНрдд рджреЗрдЦрд╛ рд╣реИред

(@solson рд╕реЗ рдорд╛рдлреА)

@ ben0x539 рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореИрдВ future()....start рдЬреИрд╕реЗ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рджрд╕реНрдп рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддрд╛ рд╣реВрдБ? рдпрд╛ рдЗрддрдиреА range()..... рддрд░рд╣ рдПрдХ рд╕реАрдорд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ? рдФрд░ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ no precedence/macro shenanigans necessary and рдЕрд░реНрде рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рджреАрд░реНрдШрд╡реГрддреНрдд .. рдХреЛ рджрд╛рдИрдВ рдУрд░ рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдпрд╛ рдкреИрд░реЗрдиреНрдереЗрд╕рд┐рд╕ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рднрдпрд╛рдирдХ рд░реВрдк рд╕реЗ рдХрд░реАрдм рд╣реИред

рд╣рд╛рдБ ? рд╕рдВрдЪрд╛рд▓рдХ рдореМрдЬреВрдж рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдереЗ
рдЕрдкрд╡рд╛рдж рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИред рдХрд┐рд╕реА рдореЗрдВ рднреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣
рдЬрдВрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЙрдкрд╕рд░реНрдЧ рдЦреЛрдЬрд╢рдмреНрджреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред

рд╕рдд, 19 рдЬрдирд╡рд░реА, 2019 рдХреЛ рджреЛрдкрд╣рд░ 1:51 рдмрдЬреЗ рдмреЗрдВрдЬрд╛рдорд┐рди рд╣реЗрд░реЗ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @ithub.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдпрд╣ рд╕рдм рд░реЙрдХреЗрдЯ рд╕рд╛рдЗрдВрд╕ рдирд╣реАрдВ рд╣реИ

рд▓реЗрдЯ рдмреЙрдбреА: MyResponse = client.get ("https: // my_api") .send () ...?? in_json () ...??

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ ... рдмреЗрд╣рдж рдкрдардиреАрдп рд╣реИ, рдПрдХ рдирдЬрд╝рд░ рдФрд░ рд╕реБрдкрд░ рдкрд░ рдпрд╛рдж рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ
рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдЬрдм рд╕реЗ рдЖрдк рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдХреЛрдб рдСрдл рдЯреНрд░реЗрд▓рд┐рдВрдЧ рдСрдл рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ
рдЬрдмрдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдо рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдирд╣реАрдВ
рдкреВрд░реНрд╡рд╡рд░реНрддреА / рдореИрдХреНрд░реЛ рд╢реЗрдВрдирд┐рдЧрдиреНрд╕ рдЖрд╡рд╢реНрдпрдХ рдФрд░ рд╕реЗ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрди рд╢реЛрд░ рдирд╣реАрдВ
рдЕрдкрд░рд┐рдЪрд┐рдд sigils, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдХреЛрдИ рдкрд╣рд▓реЗ ellipses рджреЗрдЦрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/57640#issuecomment-455818177 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABGmen354fhk7snYsANTfp5oOuDb4OLYks5vE5NSgaJpZM4aBlba
ред

@HeroicKatora рдЬреЛ рдереЛрдбрд╝рд╛ рдХреГрддреНрд░рд┐рдо рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рдБ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреНрдп рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕реЙрд▓реНрдпреВрд╢рдВрд╕ рдХреА рддрд░рд╣, рдпрд╣ await x? рд▓рд┐рдП рдХрд╛рдЙрдВрдЯрд░рд┐рдирд┐рдЯрд┐рд╡ рдкреВрд░реНрд╡рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдореИрдХреНрд░реЛ рдирд╣реАрдВ рд╣реИред

@ejmahler

рд╣рд╛рдБ ? рд╕рдВрдЪрд╛рд▓рдХ рдореМрдЬреВрдж рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ рдХрд┐ рдЕрдкрд╡рд╛рдж рдереЗред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реИред

рджреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд░реВрдк рд╣реИрдВ рдЬреЛ keyword expr , рдЕрд░реНрдерд╛рддреН return expr рдФрд░ break expr рдлрд┐рдЯ рд╣реИрдВред рдкреВрд░реНрд╡ рдмрд╛рдж рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИред continue 'label рдлреЙрд░реНрдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрдм рд╕реЗ рдирд╣реАрдВ рдЧрд┐рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдпрд╣ keyword expr рдлреЙрд░реНрдо рдХрд╛ рдирд╣реАрдВ рд╣реИред рддреЛ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ 2 рдкреВрд░реЗ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдПрдХрд░реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдлреЙрд░реНрдо рдФрд░ 1 рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдпреВрдирд┐рд░реА рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдлреЙрд░реНрдо рд╣реИрдВред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдпрд╣ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ рдХрд┐ ? рдФрд░ await await рдФрд░ return рд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╛рди рд╣реИрдВ, рдореИрдВ рд╢рд╛рдпрдж рд╣реА return/break expr рдХреЙрд▓ рдХрд░реВрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП ? рд▓рд┐рдП рдПрдХ рдирд┐рдпрдоред

рдХрд┐рд╕реА рднреА рдЬрдВрдЧ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдкреВрд░реНрд╡реЛрдХреНрдд, break expr рдпрд╣ рд╕рдм рдЖрдо рдирд╣реАрдВ рд╣реИ ( break; рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдФрд░ return; рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИрдВ рдФрд░ рд╡реЗ рдПрдХрд╛рддреНрдордХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд░реВрдк рдирд╣реАрдВ рд╣реИрдВ)ред рдЬреЛ рд╢реЗрд╖ рд╣реИ рд╡рд╣ return expr; s рд╣реИ рдФрд░ рдпрд╣ рдореБрдЭреЗ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ match , ? рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдиреЗрд╕реНрдЯреЗрдб if let s рдФрд░ else s, рдФрд░ for рд▓реВрдкред рдПрдХ рдмрд╛рд░ try { .. } рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ред

@ ben0x539 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╡реИрд░рд┐рдПрдирд┐рдХ рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП ... рдЖрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП, рдПрдХ рдмрд╛рд░ рд╣рдо рдЙрдирдХреЗ рдкрд╛рд╕ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдирд╡рд╛рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐рддрдирд╛ рдмреЗрд╣рддрд░ рдХреЛрдб рдЬрдм рд╣рдо рдЙрдкрд╕рд░реНрдЧ рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ рдХрд░ рджрд┐рдпрд╛ try! рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЛ ? ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд░реБрд╕реНрдЯ рд╕рдореБрджрд╛рдп рдореЗрдВ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рдХрд┐ рдХреЛрдб рдХреЛ рдХрд┐рддрдирд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдЧрд░ рд╣рдо .await рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд░рдЪрдирд╛рддреНрдордХрддрд╛ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрд╕ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ++ рдпрд╛ @ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

:( рдореБрдЭреЗ рдЕрднреА рдФрд░ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред

рд╣рд░ рдХреЛрдИ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рд╣реИ, рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рдЬреЛ рдЕрдиреНрдп рд░рд╛рдп рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред

рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ "рдореИрдЬрд┐рдХ рдореИрдХреНрд░реЛ" рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╢рд╛рдпрдж рд╣реА рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рд▓реЛрдЧ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдбреЙрдХреНрд╕ рдореЗрдВ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрд╛рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

рдирд┐рдпрдорд┐рдд рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдРрдкреНрдкрд▓ рдкрд╛рдИ рдХреА рддрд░рд╣ рдереЛрдбрд╝реЗ рд╣реИ, рдпрд╣ рд╣рд░ рдХрд┐рд╕реА рдХрд╛ рджреВрд╕рд░рд╛ рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд░рд┐рд╡рд╛рд░ рдХрд╛ рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рдХрд▓реНрдк [рдХреЛ реж]ред рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдХреЛрд╢рд┐рд╢ рдХреА рддрд░рд╣! рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╣рдореЗрд╢рд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЙрддрдиреА рд╣реА рдЬрд▓реНрджреА рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрддреНрдкрд╛рджрдХ рдмрди рд╕рдХрддреЗ рд╣реИрдВ!

[реж] (рдкрд╣рд▓реЗ рдорд┐рдирдЯ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд) https://www.ted.com/talks/kenneth_cukier_big_data_is_better_data/transcript?language=en

рдореИрдЪ, рдЕрдЧрд░, рдЕрдЧрд░, рдЬрдм, рдЬрдмрдХрд┐, рдЪрд▓реЛ, рдФрд░ рд╕рднреА рд╡реНрдпрд╛рдкрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╣реИрдВ
рдЬреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд┐рдЯрд┐рдВрдЧ рдмреНрд░реЗрдХ рдФрд░ рдЬрд╛рд░реА рдПрдХрдорд╛рддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╣реИ
рдХреАрд╡рд░реНрдб рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд░реВрдк рд╕реЗ рднреНрд░рд╛рдордХ рд╣реИрдВред

Sat, 19 рдЬрдирд╡рд░реА, 2019 рдХреЛ 3:37 рдмрдЬреЗ Yazad Daruvala рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

:( рдореБрдЭреЗ рдЕрднреА рдФрд░ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред

рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╣рд░ рдХреЛрдИ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╣реИ, рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рд╣реИрдВ
рдЕрдиреНрдп рд░рд╛рдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЕрдВрдд рд▓рдЧрддрд╛ рд╣реИред

рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ "рдореИрдХреНрд░реЛ рдореИрдХреНрд░реЛ" рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдореИрдХреНрд░реЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ рдкрд░рд╡рд╛рд╣ рд╣реИ
рд╡рд┐рд╕реНрддрд╛рд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЬреЛ рд▓реЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрд╛рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ
рдбреЙрдХреНрд╕ рдореЗрдВ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВред

рдирд┐рдпрдорд┐рдд рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рд╕реЗрдм рдкрд╛рдИ рдХреА рддрд░рд╣ рдереЛрдбрд╝реЗ рд╣реИ, рдпрд╣ рд╣рд░ рдХрд┐рд╕реА рдХрд╛ рджреВрд╕рд░рд╛ рд╣реИ
рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рдХрд▓реНрдк рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ [рдХреЛ реж]ред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ, рдХреЛрд╢рд┐рд╢ рдХреА рддрд░рд╣! рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рд╣рдореЗрд╢рд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрддрд░
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЙрддрдиреА рд╣реА рдЬрд▓реНрджреА рд╣рдо рд╕рдм рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдЙрддреНрдкрд╛рджрдХ рд╣реЛрдирд╛!

[реж] (рдкрд╣рд▓реЗ рдорд┐рдирдЯ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд)
https://www.ted.com/talks/kenneth_cukier_big_data_is_better_data/transcript?language=en

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/57640#issuecomment-455824275 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABGmesz5_LfDKdcKn6zMO5uuSJs9lFiYks5vE6wygaJpZM4aBlba
ред

@mitsuhiko рдореИрдВ рд╕рд╣рдордд рд╣реВрдБ! рдЪрд┐рдирд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдЕрдзрд┐рдХ рджреЗрд╣рд╛рддреА рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд fut@await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдмрд╣реБрдд рджреВрд░ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдбрд╛рдЙрди-рдЯреВ-рдЕрд░реНрде рд╕рдВрд╕реНрдХрд░рдг рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

@ejmahler

рдореИрдЪ, рдпрджрд┐, рдпрджрд┐, рдЬрдмрдХрд┐, рдЬрдмрдХрд┐, рдЪрд▓реЛ, рдФрд░ рд╕рднреА рд╡реНрдпрд╛рдкрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╣реИрдВ рдЬреЛ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рд┐рдЯрд┐рдВрдЧ рдмреНрд░реЗрдХ рдФрд░ рдЬрд╛рд░реА рдПрдХрдорд╛рддреНрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреАрд╡рд░реНрдб рд╣реИрдВ рдЬреЛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд░реВрдк рд╕реЗ рднреНрд░рд╛рдордХ рд╣реИрдВред

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рднреНрд░рд╛рдордХ рдирд╣реАрдВ рд╣реИред рдЗрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡реНрдпрд╛рдХрд░рдг рд▓рдЧрднрдЧ рд╣реИ:

Expr = kind:ExprKind;
ExprKind =
  | If:{ "if" cond:Cond then:Block { "else" else_expr:ElseExpr }? };
  | Match:{ "match" expr:Expr "{" arms:MatchArm* "}" }
  | While:{ { label:LIFETIME ":" }? "while" cond:Cond body:Block }
  | For:{ { label:LIFETIME ":" }? "for" pat:Pat "in" expr:Expr body:Block }
  ;

Cond =
  | Bool:Expr
  | Let:{ "let" pat:Pat "=" expr:Expr }
  ;

ElseExpr =
  | Block:Block
  | If:If
  ;

MatchArm = pats:Pat+ % "|" { "if" guard:Expr }? "=>" body:Expr ","?;

рдпрд╣рд╛рдБ, рдлреЙрд░реНрдо if/while expr block , for pat in expr block , рдФрд░ match expr { pat0 => expr0, .., patn => exprn } ред рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ рдЬреЛ рдЗрди рд╕рднреА рд░реВрдкреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ "рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ"ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпреЗ рд╕рднреА рдмреНрд▓реЙрдХ рд░реВрдк рд╣реИрдВ рдФрд░ рди рдХрд┐ рдЕрдкрд░рд┐рдкрдХреНрд╡ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ред await expr рд╕рд╛рде рддреБрд▓рдирд╛ рдЗрд╕рд▓рд┐рдП рднреНрд░рд╛рдордХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдмреЛрд▓рдиреЗ рдХреА рдХреЛрдИ рдирд┐рд░рдВрддрд░рддрд╛ рдпрд╛ рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдмреНрд▓реЙрдХ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ await block рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рди рдХрд┐ await expr ред

@mitsuhiko рдореИрдВ рд╕рд╣рдордд рд╣реВрдБ! рдЪрд┐рдирд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдЕрдзрд┐рдХ рджреЗрд╣рд╛рддреА рд▓рдЧрддрд╛ рд╣реИред

рдЬрдВрдЧ рджреНрд╡реИрддрд╡рд╛рджреА рд╣реИред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:

await foo.bar();
foo.bar().await;

рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕реНрдХрд╛рд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЙрд╕ рддрд░рд╣ рдХреА рдХрдИ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╢реМрдХ рдерд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ match рдФрд░ if рд░реБрд╕реНрдЯ рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкрджреЛрдВ рдкрд░ рд╣реЛрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

foo.bar().await.match {
   Bar1(x, y) => {x==y},
   Bar2(y) => {y==7},
}.if {
   bazinga();
}

рдЕрдм рддрдХ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢

рд╡рд┐рдХрд▓реНрдк рдореИрдЯреНрд░рд┐рд╕реЗрд╕:

рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рд╕рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ @ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ):

| рдирд╛рдо | Future<T> | Future<Result<T, E>> | Result<Future<T>, E> |
| --- | --- | --- | --- |
| PREFIX | - | - | - |
| рдХреАрд╡рд░реНрдб рдореИрдХреНрд░реЛ | await!(fut) | await!(fut)? | await!(fut?) |
| рдХреАрд╡рд░реНрдб рдлрдВрдХреНрд╢рди | await(fut) | await(fut)? | await(fut?) |
| рдЙрдкрдпреЛрдЧреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ | await fut | await fut? | await (fut?) |
| рд╕реНрдкрд╖реНрдЯ рд╡рд░реАрдпрддрд╛ | await fut | await? fut | await fut? |
| POSTFIX | - | - | - |
| рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде Fn | fut(await) | fut(await)? | fut?(await) |
| рдХреАрд╡рд░реНрдб рдлрд╝реАрд▓реНрдб | fut.await | fut.await? | fut?.await |
| рдХреАрд╡рд░реНрдб рд╡рд┐рдзрд┐ | fut.await() | fut.await()? | fut?.await() |
| рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдореИрдХреНрд░реЛ | fut.await!() | fut.await!()? | fut?.await!() |
| рдЕрдВрддрд░рд┐рдХреНрд╖ рдЦреЛрдЬрд╢рдмреНрдж | fut await | fut await? | fut? await |
| рд╕рд┐рдЧрд┐рд▓ рдХреАрд╡рд░реНрдб | fut@await | fut@await? | fut?@await |
| рд╕рд┐рдЧрд┐рд▓ | fut@ | fut@? | fut?@ |

"рд╕рд┐рдЧрд┐рд▓ рдХреАрд╡рд░реНрдб" sigil _cannot_ # рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрдм рдЖрдк рдЗрд╕реЗ r рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗред ... рд░реВрдк рдореЗрдВ рд╕рдЬрдЧ рдХреЛ рдореЗрд░реА рдкрд╣рд▓реА рдЪрд┐рдВрддрд╛ рдХреА рддрд░рд╣ рдЯреЛрдХрди рдмрджрд▓рдирд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ ред

рдЕрдзрд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХрд╛ рдЙрдкрдпреЛрдЧ (PM me other _real_ рдХрдИ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ await urlo рдкрд░ рдФрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ

| рдирд╛рдо | (reqwest) Client |> Client::get |> RequestBuilder::send |> await |> ? |> Response::json | > ? |
| --- | --- |
| PREFIX | - |
| рдХреАрд╡рд░реНрдб рдореИрдХреНрд░реЛ | await!(client.get("url").send())?.json()? |
| рдХреАрд╡рд░реНрдб рдлрдВрдХреНрд╢рди | await(client.get("url").send())?.json()? |
| рдЙрдкрдпреЛрдЧреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ | (await client.get("url").send()?).json()? |
| рд╕реНрдкрд╖реНрдЯ рд╡рд░реАрдпрддрд╛ | (await? client.get("url").send()).json()? |
| POSTFIX | - |
| рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде Fn | client.get("url").send()(await)?.json()? |
| рдХреАрд╡рд░реНрдб рдлрд╝реАрд▓реНрдб | client.get("url").send().await?.json()? |
| рдХреАрд╡рд░реНрдб рд╡рд┐рдзрд┐ | client.get("url").send().await()?.json()? |
| рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдореИрдХреНрд░реЛ | client.get("url").send().await!()?.json()? |
| рдЕрдВрддрд░рд┐рдХреНрд╖ рдЦреЛрдЬрд╢рдмреНрдж | client.get("url").send() await?.json()? |
| рд╕рд┐рдЧрд┐рд▓ рдХреАрд╡рд░реНрдб | client.get("url").send()@await?.json()? |
| рд╕рд┐рдЧрд┐рд▓ | client.get("url").send()@?.json()? |

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдиреЛрдЯ: рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ Response::json рд▓рд┐рдП рднреА рдПрдХ Future , рдЬрд╣рд╛рдБ send рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ IO рдФрд░ json send рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ json (рдпрд╛ рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдиреНрдп рд╡реНрдпрд╛рдЦреНрдпрд╛) рдЖрдиреЗ рд╡рд╛рд▓реЗ IO рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╕рд╛рд░реНрдердХ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ IO рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рднреА рдЪреЗрдирд┐рдВрдЧ рдореБрджреНрджрд╛ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рд╣реИ, рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ ( await? рдЪреАрдиреА рдХреЗ рд╕рд╛рде) рд╕рдмрд╕реЗ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ, рддрд╛рдХрд┐ рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрджреНрдпрдкрд┐ рдЙрдкрд╕рд░реНрдЧ рдкрд╕рдВрдж рдореЗрдВ рд▓рдЧрднрдЧ рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рдорд╛рдзрд╛рди рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЗрд╕ рдкрд░ рдХреЛрдИ рдЖрдо рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рд╕рднреА рдЖрд╕рд╛рди рднреНрд░рдо рдХреА рд╕реНрдерд┐рддрд┐ рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдХреАрд╡рд░реНрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдХрдо):

  • Fn with Keyword => await f
  • рдХреАрд╡рд░реНрдб рдлрд╝реАрд▓реНрдб => рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕
  • рдХреАрд╡рд░реНрдб рд╡рд┐рдзрд┐ => рд╡рд┐рдзрд┐ рдХреЙрд▓
  • рдореИрдХреНрд░реЛ (рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕) => await рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ рдпрд╛ рдирд╣реАрдВ?
  • рд╕реНрдкреЗрд╕ рдХреАрд╡рд░реНрдб => рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдореВрд╣реАрдХрд░рдг рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ (рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рдмреЗрд╣рддрд░?)
  • рд╕рд┐рдЧрд┐рд▓ => рдирдП рд╕рд┐рдЧрд┐рд▓ рдХреЛ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рддрд░реНрдХ-рднрд╛рд░реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЕрдиреНрдп рдЕрдзрд┐рдХ рдХрдареЛрд░ рд╕реБрдЭрд╛рд╡:

  • рдЙрдкрд╕рд░реНрдЧ (рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рд╡рд░реНрддреА) рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ "рдлрд╝реАрд▓реНрдб" рджреЛрдиреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдВ (рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреИрдЯрд░реНрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП match , if рдЖрджрд┐ рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рдХреАрд╡рд░реНрдб рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ рдЗрд╕ рдмрд╣рд╕ рдореЗрдВ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ) [[рд╕рдВрджрд░реНрдн] (https://github.com/rust-lang/rust/issues/57640#issuecomment-455827164)]
  • await рдкреИрдЯрд░реНрди рдореЗрдВ рд╡рд╛рдпрджрд╛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХреЛрдИ рдЬрдВрдЬреАрд░ рдирд╣реАрдВ) [[рд╕рдВрджрд░реНрдн] (https://github.com/rust-lang/rust/issues/57640)]
  • рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╡рд┐рд▓рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ [[рд╕рдВрджрд░реНрдн] (https://github.com/rust-lang/rust/issues/57640#issuecomment-455782394)]

рдПрдХ рдХреАрд╡рд░реНрдб рдореИрдХреНрд░реЛ await!(fut) рд╕рд╛рде рд╕реНрдерд┐рд░ рд╣реЛрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЗ рд╕рд╛рде рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХреЛ рдирд┐рдпрдорд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдмрдЬрд╛рдп рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЬреНрдпрд╛рджрд╛рддрд░ рдЙрджрд╛рд╣рд░рдг-рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рдИрд╢ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рджреЛ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛; рдЕрдм рддрдХ рдХрд┐рд╕реА рдиреЗ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ await рдЕрдзрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ, рдЬреИрд╕рд╛ рдХрд┐ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрджрд┐ рдореИрдВ рдЗрд╕ рд╕рд╛рд░рд╛рдВрд╢ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдКрдкрд░ рдХреБрдЫ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдпрд╛рдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ urlo рдкрд░ рдкреАрдПрдо рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдХрд┐рд╕реА рдФрд░ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдЬреЛрд░ рд╕реЗ рдЖрд╡рд╛рдЬ рдкрдХреНрд╖рдкрд╛рдд рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред)

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХреАрд╡рд░реНрдб рдореИрдХреНрд░реЛ await!(fut) рд╕рд╛рде рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рднреА рд╣рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдПрдХ рдЧреИрд░-рдореИрдХреНрд░реЛ рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рд░рд╛рдВрд╢ рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореБрдЭреЗ "рдХреАрд╡рд░реНрдб рдлреАрд▓реНрдб" рдкрд╕рдВрдж рдЖрдиреЗ рд▓рдЧрд╛ред "рд╕реНрдкреЗрд╕ рдХреАрд╡рд░реНрдб" рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИ:

client
    .get("url")
    .send() await?
    .json()?

рд▓реЗрдХрд┐рди рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрдЬреАрдм рд╡рд┐рд░рд╛рдо рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рд╕рдореВрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ: client.get("url").send() await?.json()? ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреАрд╡рд░реНрдб рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде, рдпрд╣ рджреЛрдиреЛрдВ рд░реВрдкреЛрдВ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ: client.get("url").send().await?.json()?

client
    .get("url")
    .send()
    .await?
    .json()?

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдХреАрд╡рд░реНрдб рд╡рд┐рдзрд┐" рдмреЗрд╣рддрд░ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗ рддреЛ рд╣рдо _could_ Future рдкрд░ рдЗрд╕реЗ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ" рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ:

trait Future<..> {
    ..
    extern "rust-await" fn r#await(self) -> _;
}

( extern "rust-await" рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рджреВ рдХреЗ рд╕рднреА рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ fn рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдПрдХ рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рдХреАрд╡рд░реНрдб рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред)

рдЙрдкрд╕рд░реНрдЧ (рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛) рдФрд░ рдЙрдкрд╕рд░реНрдЧ "рдХреНрд╖реЗрддреНрд░" рджреЛрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ ...

рдпрджрд┐ рдХреЛрдИ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рдЕрдЧрд░ рд╕рд╛рде рдореЗрдВ рдпрд╛ рдЙрдкрд╕рд░реНрдЧ рдПрдХ рдХреЗ рдмрдЬрд╛рдп), рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рд╣реЛрдЧрд╛: рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рдХреАрд╡рд░реНрдб рд╣реИрдВ рдЬреЛ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рдВрдХреЗрддрди рджреЛрдиреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ рджреВрд╕рд░реЗ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рд╣рдо рджреЛрдиреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдФрд░ рдирд┐рдпрдореЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╣реБрдП, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд╢рд╛рдпрдж рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЪрд░реНрдЪрд╛ рд╣реИ, рдЕрдЧрд░ рдкреЛрд╕реНрдЯрд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ await ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдг рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

: +1:


рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдерд╛ ( рдЬреИрд╕реЗ @mehcode s ): рдПрдХ рд╢рд┐рдХрд╛рдпрдд рдЬреЛ рдореБрдЭреЗ .await рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ тАа рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЖрдо рддреМрд░ рдкрд░ рдЧрд┐рд░рд╛рд╡рдЯ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдХреНрд╕рд░ .await? рд╣реИ рд╡реИрд╕реЗ рднреА рдЗрд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

Something рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХреАрд╡рд░реНрдб рдХреЛ рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ


@ejmahler

рдореИрдВ рдХрд┐рд╕реА рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИ

request.get().await рддрд░рд╣ рдХреБрдЫ рдФрд░ body.lines().collect() рдЬреИрд╕рд╛ рдХреБрдЫ рдкрдврд╝рддрд╛ рд╣реИред "рдЬрдВрдЬреАрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рдЧреБрдЪреНрдЫрд╛" рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ _prefix_ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрджрддрд░ рдкрдврд╝рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ "рдкреНрд░рддреАрдХреНрд╖рд╛" рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдХрд╣рд╛ рдерд╛, рдФрд░ рдЬрдм рдЖрдк рдХреБрдЫ рд╕реБрдирддреЗ рд╣реИрдВ рддреЛ рдХрднреА рднреА рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдПрдХ рдЙрджреНрдпрд╛рди рдкрде рд╡рд╛рдХреНрдп рдХреА рддрд░рд╣ рдереЛрдбрд╝реЗред

рдФрд░ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдирд╛ рдХрд┐ рдЖрдкрдХреА рдкреИрджрд╛рд╡рд╛рд░ рдХреЗ рдмрд┐рдВрджреБ рдХрд╣рд╛рдБ рд╣реИрдВ, рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ, рдмрд┐рд▓реНрдХреБрд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЬрдм рдЖрдк рдЗрдВрдбреЗрдВрдЯ рд▓рд╛рдЗрди рдХреЛ рд╕реНрдХрд┐рдо рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХрд╛ рдлрд╝рдВрдХреНрд╢рди, рддреЛ рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рднрд╛рд░ рдХреЗ, рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ 200-рд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ co_await / рдЙрдкрдЬ рд░рд┐рдЯрд░реНрди рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рднреА рдХрднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИ рдЬреЛ рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд░рд╕реНрдЯ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐-рдЙрдиреНрдореБрдЦ рдкреНрд░рдХреГрддрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред рдФрд░ рдХрдо рд╕реЗ рдХрдо C # await , рдпрд╣ CallSomething(argument, await whatever.Foo() рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдкреНрд░рд╢рдВрд╕рдиреАрдп рд╣реИред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ async _will_ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдЖрд╕рд╛рди рдХреНрдпреЛрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ рд╣реЛрдЧрд╛ред

рдЗрд╕реЗ be рдЕрдЧрд░, рдЬрдмрдХрд┐, рдореИрдЪ, рдФрд░ рд╡рд╛рдкрд╕реА тАЩрдХреЗ рд╕рдорд╛рди рд╕рдореНрдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдпрджрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдЪрд╛рд▓рдХ рдереЗ - рд░рд╕реНрдЯ рдХреЛрдб рдкрдврд╝рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╕рдкрдирд╛ рд╣реЛрдЧрд╛ред

return (рдФрд░ continue рдФрд░ break ) рдФрд░ while рд░реВрдк рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ _completely_ рдмреЗрдХрд╛рд░ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ ! рдФрд░ () ред рдФрд░ рдЬрдм рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдиреЗ for рдЫреЛрдбрд╝рд╛ рд╣реИ, рддреЛ рд╣рдордиреЗ рдХреЛрдб рдХреЛ .for_each() рдмреБрд░реЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░реЗрдпрд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдареАрдХ рд▓рд┐рдЦрд╛ рд╣реБрдЖ рджреЗрдЦрд╛ рд╣реИред

рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рд╢рд╛рдВрддрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ async/await рдПрдХ рдкреНрд░рдореБрдЦ рднрд╛рд╖рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИред рдпрд╣ рд╕рднреА рддрд░рд╣ рдХреЗ рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдпрд╣ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рд╡реНрдпрд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ - рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдпрд╣ ? рдЬрд┐рддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕реЗ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдирддреАрдЬрддрди, рд╣рдо рд╕рдЪреЗрдд рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░реЗрдЧрд╛ рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдХреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░реЗрдЧрд╛ред

рд╣рдореЗрдВ рдпрд╣ рднреА рд╕рдордЭрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЬрд╛рдирд╛ рд╣реИ, await рдПрдХ рдЕрд▓рдЧ рддрд░рд╣ рдХрд╛ рдЬрд╛рдирд╡рд░ рд╣реИред return , break , continue рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ yield рдЬреИрд╕реЗ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ jmp рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рд╣рдо рдЗрдиреНрд╣реЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реА рдЖрдБрдЦреЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдЙрдЫрд▓рддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬрд┐рд╕ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдХрд╣реАрдВ рдФрд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдмрдХрд┐ await рдорд╢реАрди рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рдЖрдВрдЦреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреЛрдб рдХреА рд╣рдорд╛рд░реА рд╕рд╣рдЬ рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рд╣рдореЗрдВ return рдпрд╛ break рдЪреЗрди рдХреА рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреЙрд▓ рдХрд╛ рдкреНрд░рд▓реЛрднрди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд▓рд╛рд▓рдЪ рдирд╣реАрдВ рд╣реИред рдЗрди рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреА рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡реЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдкрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрд╣реАрдВ рднреА рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред await рдСрдкрд░реЗрдЯрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдВрдЬреАрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрдВрдд рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдЗрд╕ рд╕реВрдЭрдмреВрдЭ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдирд┐рдпрдореЛрдВ рдкрд░ рдкрдЫрддрд╛рд╡рд╛ рдХрд░реЗрдВрдЧреЗред

рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдШреЛрдбрд╝реЛрдВ рдХреЗ рдЙрдореНрдореАрджрд╡рд╛рд░ рдЕрдм await!(expr) рд╕рд╛рде рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреБрдЫ рдмреЗрд╣рддрд░ рдмрд╛рдж рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред @ рд╕реЗрдВрдЯреНрд░рд┐рд▓ рдХреА рдЯрд┐рдкреНрдкрдгреА рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рд╢рд╛рдпрдж рдЗрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд╣рд┐рдд рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЙрдирдХреЗ рддрд░реНрдХ рдореБрдЭреЗ рд╕рдордЭрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ Rust рдореЗрдВ рдореЗрдердб рдХреЙрд▓ рдЪреЗрдирд┐рдВрдЧ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рдиреЗ ? рдХреАрд╡рд░реНрдб рдХреЛ рдЕрдкрдирд╛рдпрд╛, рдЬреЛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдФрд░ рдмреЗрддрд╣рд╛рд╢рд╛ рд╕рдлрд▓ рд╣реИред рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреЛ рд╣рдореЗрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдирд┐рд░рд╛рд╢ рдХрд░реЗрдЧрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рддрдХрдиреАрдХреА рдЛрдг рдЬреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред

рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ, @withoutboats рдиреЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдХреЗрд╡рд▓ рдЪрд╛рд░ рдореМрдЬреВрджрд╛ рд╡рд┐рдХрд▓реНрдк рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ, рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ expr await рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЦреБрд╢ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдпрд╣ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдЪрд┐рддреНрд░ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЖрд╢реНрдЪрд░реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ ? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд┐рдзрд┐ рдЬрдВрдЬреАрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд╣реАрдВ рддреЛрдбрд╝рддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рд╕рдлрд▓ ? рдСрдкрд░реЗрдЯрд░ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдорд┐рд╕рд╛рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ await ? рдЕрдзрд┐рдХ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ return , break , рдпрд╛ yield ред рдЬрдмрдХрд┐ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдЧреИрд░-рдкреНрд░рддреАрдХ рдСрдкрд░реЗрдЯрд░ рдЬрдВрдЧ рдореЗрдВ рдирдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, async/await рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдЬрдмрдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдк рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд▓рдЧрддреЗ рд╣реИрдВ, expr await рдХреЗ рдХреБрдЫ рдлрд╛рдпрджреЗ рд╣реИрдВред рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ await рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ, рдЬреЛ рдЬрд╛рджреВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдкрд░ рдЬреЛрд░ рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред expr.await , expr.await() expr.await! , expr.await!() , рдЖрджрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдпрд╣ рд╕рдордЭрд╛рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдХреНрд╖реЗрддреНрд░ / рд╡рд┐рдзрд┐ / рдореИрдХреНрд░реЛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рд╣рдо рд╕рднреА рдХреЛ рдпрд╣рд╛рдБ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╡рд┐рднрд╛рдЬрдХ рдХреА рдЖрджрдд рд╣реЛрдЧреАред

рд╡рд░реНрддрдиреА await @ рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд┐рд╕рд╕реЗ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рди рд╣реЛред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░реНрдпрд╛рдкреНрдд рдСрдкрд░реЗрдЯрд░ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░, рдЕрдВрдд рдореЗрдВ, рдЗрд╕реЗ await рд╡рд░реНрддрдиреА рд╣реЛрдирд╛ рд╣реЛрдЧрд╛, рддреЛ рдпрд╣ рдареАрдХ рд░рд╣реЗрдЧрд╛ред рдЬрдм рддрдХ рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ _real_ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ ... рдореИрдВ рдПрдХ (tokei рдХреЗ рдЕрдиреБрд╕рд╛рд░) 23,858 рд▓рд╛рдЗрди рд░рд╕реНрдЯ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реВрдВ рдЬреЛ рдмрд╣реБрдд рднрд╛рд░реА async рд╣реИ рдФрд░ рд╡рд╛рдпрджрд╛ 0.1 await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ)ред рдЖрдЗрдП рдЬрд╛рдиреЗ (рд░рд┐рдбрдХреНрдЯреЗрдб) тАЛтАЛрд╕реНрдкреЗрд▓реБрдирдХрд┐рдВрдЧ (рдиреЛрдЯ рд╕рдм рдХреБрдЫ рд╕рд░рд╕рд░рд╛рд╣рдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ):

// A
if !await!(db.is_trusted_identity(recipient.clone(), message.key.clone()))? {
    info!("recipient: {}", recipient);
}

// B
match await!(db.load(message.key))? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = await!(client
    .get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .send())?
.error_for_status()?;

// D
let mut res =
    await!(client.get(inbox_url).headers(inbox_headers).send())?.error_for_status()?;

let mut res: InboxResponse = await!(res.json())?;

// E
let mut res = await!(client
    .post(url)
    .multipart(form)
    .headers(headers.clone())
    .send())?
.error_for_status()?;

let res: Response = await!(res.json())?;

// F
#[async]
fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let (_, mut res) = await!(self.request(url, Method::GET, None, true))?;
    let user = await!(res.json::<UserResponse>())?
        .user
        .into();

    Ok(user)
}

рдЕрдм рдЗрд╕реЗ рдЪреАрдиреА рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг, рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд░рдлрд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд╣реАрдВ рдЪрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ рдЕрдЧрд░ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИред

// A
if await? db.is_trusted_identity(recipient.clone(), message.key.clone()) {
    info!("recipient: {}", recipient);
}

// B
match await? db.load(message.key) {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = (await? client
    .get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .send())
.error_for_status()?;

// D
let mut res =
    (await? client.get(inbox_url).headers(inbox_headers).send()).error_for_status()?;

let mut res: InboxResponse = await? res.json();

// E
let mut res = (await? client
    .post(url)
    .multipart(form)
    .headers(headers.clone())
    .send())
.error_for_status()?;

let res: Response = await? res.json();

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let (_, mut res) = await? self.request(url, Method::GET, None, true);
    let user = (await? res.json::<UserResponse>())
        .user
        .into();

    Ok(user)
}

рдЕрдВрдд рдореЗрдВ, рдЗрд╕реЗ рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ, "рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдлреАрд▓реНрдб"ред

// A
if db.is_trusted_identity(recipient.clone(), message.key.clone()).await? {
    info!("recipient: {}", recipient);
}

// B
match db.load(message.key).await? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .send().await?
    .error_for_status()?;

// D
let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .send().await?
    .error_for_status()?
    .json().await?;

// E
let mut res: Response = client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .send().await?
    .error_for_status()?
    .json().await?;

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.request(url, Method::GET, None, true).await?
        .res.json::<UserResponse>().await?
        .user
        .into();

    Ok(user)
}

рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдХрдИ рдЪреАрдЬреЗрдВ рдорд┐рд▓реАрдВред

  • рдореИрдВ рдЕрдм await? foo рд╕рдЦреНрдд рдЦрд┐рд▓рд╛рдл рд╣реВрдВред рдпрд╣ рд╕рд░рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ рд▓реЗрдХрд┐рди ? рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдЦреЛрдпрд╛ рд╣реБрдЖ рд▓рдЧрддрд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рдЙрдкрд╕рд░реНрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░реЗ рдкрд╛рд╕ "рдЙрдкрдпреЛрдЧреА" рдкреВрд░реНрд╡рддрд╛ рд╣реИред

  • рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд▓реЗрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред

  • рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ _field_ рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдореБрдЭреЗ рдЬрдВрдЧ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рд▓рд╛рдЗрди рдХреА рдмрдЬрд╛рдП рдЗрд╕рдХреЗ рдЗрдВрддрдЬрд╛рд░ рдореЗрдВ рд▓рд╛рдЗрди рдореЗрдВ .await? рд▓рдЧрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рдореИрдВ рдЙрдкрд░реНрдпреБрдХреНрдд рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдХреЗрддрди "..." рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдКрдкрд░ рд╕реЗ рдЗрд╕рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдореЗрдВ рджреЛрдиреЛрдВ рдХреБрдЫ рдФрд░ рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рдард╣рд░рд╛рд╡ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред (рдЬреИрд╕реЗ рдХрд┐ async рд╡реНрдпрд╡рд╣рд╛рд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!), рдпрд╣ рдПрдХ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪреЗрди рдХрд░рддрд╛ рд╣реИред

let resultValue = doSomethingAndReturnResult()...?;
let resultValue = doSomethingAndReturnResult()...?.doSomethingOnResult()...?;
let value = doSomethingAndReturnValue()....doSomethingOnValue()...;
let arrayOfValues = vec![doSomethingA(),doSomethingB()]...?;
// Showing stacking
let value = doSomethingWithVeryLongFunctionName()...?
                 .doSomethingWithResult()...?;

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рджреГрд╖реНрдЯрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рд╛рд░реНрдердХ рд╣реЛрдЧрд╛ред

рдП

let mut res: Response = (await client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .send().await?
    .error_for_status()?
    .json())?;

рдЦ

let mut res: Response = await client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .send().await?
    .error_for_status()?
    .json());
let res = res.unwrap();

рдпрд╣ рднреА рдЗрдВрддрдЬрд╛рд░ рдХреА рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд░реВрдк рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдмрд╕ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ Future рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ?

рдпрджрд┐ рдЖрдк рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдмреИрдХрдЕрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдпрд╣ рд▓рдЧрддрд╛ рд╣реИ:

let value = await some_op()
                 .and_then(|v| v.another_op())
                 .and_then(|v2| v2.final_op())
                 .or_else(|| backup_op());

value.unwrap()

рдЗрд╕рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ:

let value = match await some_op() {
    Ok(v) => match await v.another_op() {
        Ok(v2) => await v2.final_op(),
        Err(_) => await backup_op(),
    },
    Err(_) => await backup_op(),
};

value.unwrap()

рд╣рдорд╛рд░реЗ рд╣рд╛рде рдореЗрдВ рд╢реВрдиреНрдп рд▓рд╛рдЧрдд рд╡рд╛рд▓реЗ рд╡рд╛рдпрджрд╛ рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдЕрднреА рднреА рд╣реИ, рдЖрдЦрд┐рд░рдХрд╛рд░ред

рдЙрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗред

@EyeOfPython рдореИрдВ @ future@await рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд╣рдо future~await рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ ~ рдПрдХ рдЕрд░реНрдз рд╣рд╛рдЗрдлрд╝рди рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рд╣рд╛рдЗрдлрд╝рди - рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдЗрдирд╕ рдСрдкрд░реЗрдЯрд░ рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди ~ рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд╕реНрдЯ рдореЗрдВ рдвреЗрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЕрдиреНрдпрдерд╛ рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдмреЛрдпрд╛ рдЧрдпрд╛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдо рднреНрд░рдо рджреЗрддрд╛ рд╣реИред

@earthengine рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж future~ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ, рдЬрд╣рд╛рдВ ~ рдХреЛ await рдХреАрд╡рд░реНрдб рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред (рдЬреИрд╕реЗ ? рдкреНрд░рддреАрдХред

рднрд╡рд┐рд╖реНрдп | рдкрд░рд┐рдгрд╛рдо рдХрд╛ рднрд╡рд┐рд╖реНрдп | рднрд╡рд┐рд╖реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо
- | - | -
рднрд╡рд┐рд╖реНрдп ~ | рднрд╡рд┐рд╖реНрдп ~ |? рднрд╡рд┐рд╖реНрдп ~?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬрдВрдЬреАрд░ рд╡рд╛рдпрджрд╛:

let res: MyResponse = client.get("https://my_api").send()~?.json()~?;

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ async рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдБ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдкрд╛рдпрд╛ред рдЧреЛ рдореЗрдВ рд╡рд╛рдпрджрд╛ рдХрд╛ рдирд┐рдХрдЯрддрдо рд╡рд┐рдХрд▓реНрдк рдЪреИрдирд▓ рд╣реИрдВред рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП await рдпрд╛ рдЕрдиреНрдп рдЪрд┐рд▓реНрд▓рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдЧреЛ рдЪреИрдирд▓ рдХреЗрд╡рд▓ рдЙрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП <- рдСрдкрд░реЗрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╕рд╛рдл рдФрд░ рд╕реАрдзрд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдЕрдХреНрд╕рд░ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЕрдкрдиреА рд╕рд░рд▓ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдФрд░ рдЕрдЪреНрдЫреЗ рдПрд╕рд┐рдВрдХреНрд╕ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЧреЛ рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕реАрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред

Unfortunatelly, рд╣рдо рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рд╣реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдереЗ рдХреНрдпреЛрдВрдХрд┐ рд░рд╕реНрдЯ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЧреЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдг рдмреНрд░реЗрд╕рд┐рдЬрд╝ рд╣реИрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдХрд╛рд░рдгред рдпрд╣ <- рдСрдкрд░реЗрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реВрдХреНрд╖реНрдо рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЦрдж рдирд╣реАрдВ рд╣реИред рдПрдХ рдФрд░ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ -> рд╡рд┐рдкрд░реАрдд рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдФрд░ рдлрд┐рд░ рднреА рдПрдХ рдФрд░ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ <- sigil рдХреЛ placement new рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛, рддрд╛рдХрд┐ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рдЧрд▓рдд рдЕрд░реНрде рдирд┐рдХрд╛рд▓ рд╕рдХреЗрдВред

рдЗрд╕рд▓рд┐рдП, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рдж рдореИрдВ <-- sigil рдкрд░ рд░реБрдХ рдЧрдпрд╛:

let output = <-- future;

async рд╕рдВрджрд░реНрдн <-- рдореЗрдВ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ <- рд╕реЗ рдХрдо рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдпрд╣ <- рд╕рд╛рде-рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ await рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдмрдбрд╝рд╛ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫрд╛ рдЦреЗрд▓рддрд╛ рд╣реИред

async fn log_service(&self) -> T {
   let service = self.myService.foo();
   <-- self.logger.log("beginning service call");
   let output = <-- service.exec();
   <-- self.logger.log("foo executed with result {}.", output));
   output
}

async fn try_log(message: String) -> Result<usize, Error> {
    let logger = <-- acquire_lock();
    let length = <-- logger.log_into(message)?;
    <-- logger.timestamp();
    Ok(length)
}

async fn await_chain() -> Result<usize, Error> {
    <-- (<-- partial_computation()).unwrap_or_else(or_recover);
}

рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдСрдкрд░реЗрдЯрд░ await (рдЬреЛ рдХреЛрдб рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреАрд╡рд░реНрдб рдпрд╛ рдЪрд░ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рджрд┐рдЦрддрд╛ рд╣реИ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЕрджреНрд╡рд┐рддреАрдп рдФрд░ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬреАрдердм рдкрд░ рдпрд╣ рдореЗрд░реЗ рдХреЛрдб рд╕рдВрдкрд╛рджрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкрддрд▓рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдШрд╛рддрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдЕрд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдпрд╛ рдмреЗрд╣рддрд░ рдлрд╝реЙрдиреНрдЯ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рд┐рдЧрдЪрд░ рдХреЗ рд╕рд╛рде) рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ "рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЕрднреА рддрдХ рдпрд╣рд╛рдБ рдирд╣реАрдВ рд╣реИ" рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреАрд░ рдХреА рдмрд╛рдИрдВ рджрд┐рд╢рд╛ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдЙрд╕ рджрд┐рд╢рд╛ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИ рдЬреЛ рд╣рдо рдкрд╛рда рдкрдврд╝рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ "рднрд╡рд┐рд╖реНрдп рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬ" рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред <-- рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд▓рдВрдмрд╛ рдЖрдХрд╛рд░ рднреА рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ "рдХреБрдЫ рдЯрд┐рдХрд╛рдК рд╕рдВрдЪрд╛рд▓рди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ"ред рдПрдВрдЧрд▓ рдмреНрд░реИрдХреЗрдЯ рдФрд░ future рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рджреЛ рд╣рд╛рдЗрдлрд╝рди "рдирд┐рд░рдВрддрд░ рдорддрджрд╛рди" рдХрд╛ рдкреНрд░рддреАрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╣рдо рдЕрднреА рднреА рдЗрд╕реЗ "рдкреНрд░рддреАрдХреНрд╖рд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ рдЬреИрд╕реЗ рдпрд╣ рдкрд╣рд▓реЗ рдерд╛ред
рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЬреНрдЮрд╛рди рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдордЬрд╝рд╛ рдЖ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдкрджреНрдзрддрд┐ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рд╡рд┐рд▓рдВрдмрд┐рдд рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдпрд╣рд╛рдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдлрд┐рдЯ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╣реЛрдВрдЧреЗред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдПрдХреНрд╕реНрдЯреНрд░рд╛ рднреА рдкреЗрд╢ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдЬреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдкрд╣рд▓реЗ рднреА рдХрдИ рдореМрдХреЛрдВ рдкрд░ рдЪрд╛рд╣рд┐рдП рдереЗ: рджреЗрд░реА рд╕реЗ

рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрджрд┐ рд╡рд┐рд▓рдВрдмрд┐рдд рд╢рдмреНрдж рдпрд╣рд╛рдВ рдЙрдЪрд┐рдд рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрд▓рдЧ рдирд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

client.get("https://my_api").<--send()?.<--json()?

let not_empty = some_vec.!is_empty();

let deref = value.*as_ref();

рдСрдкрд░реЗрдЯрд░ рдкреВрд░реНрд╡рддрд╛ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрддреА рд╣реИ: рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ is_not_* рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреА рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреЗрд╡рд▓ bool рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдирдХрд╛рд░рдирд╛ рдФрд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реИред рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмреВрд▓рд┐рдпрди / рдбреЗрд░реЗрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдзрд┐рдХ рдХреНрд▓реАрдирд░ рд╣реЛрдЧрд╛ред


рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ @mehcode рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реНрд╡ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ рдХрд┐ рдХреИрд╕реЗ <-- рдкрджреНрдзрддрд┐ рдХреЙрд▓ рдЪреЗрди рдХреЗ рдЕрдВрджрд░ async рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЙрдЪрд┐рдд рдЬреЛрд░ рджреЗрддреА рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рдХреЗрд╡рд▓ рдирд┐рдпрдорд┐рдд рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ (рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдпрд╛ рд╕реНрд╡рд░реВрдкрдг рдХреЗ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рднреЗрдж рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИред

// A
if db.<--is_trusted_identity(recipient.clone(), message.key.clone())? {
    info!("recipient: {}", recipient);
}

// B
match db.<--load(message.key)? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .<--send()?
    .error_for_status()?;

// D
let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .<--send()?
    .error_for_status()?
    .<--json()?;

// E
let mut res: Response = client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .<--send()?
    .error_for_status()?
    .<--json()?;

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.<--request(url, Method::GET, None, true)?
        .res.<--json::<UserResponse>()?
        .user
        .into();

    Ok(user)
}

рдЖрдЦрд┐рд░рдХрд╛рд░: рд╡рд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЬреЛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

@novacrazy

рдпрд╣ рднреА рдЗрдВрддрдЬрд╛рд░ рдХреА рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд░реВрдк рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрд╕ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп combinators рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдЧрд▓рдд рдирд╣реАрдВ рд╕рдордЭрд╛, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрднреА рднреА рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

let value = some_op()
    .and_then(|v| v.another_op())
    .and_then(|v2| v2.final_op())
    .or_else(|| backup_op())
    .await;

рд▓реЗрдХрд┐рди рдЗрд╕ рдХрд╛рдо рдХреЗ рд▓рд┐рдП, and_then рдХреНрд▓реЙрдЬ рдХреЛ FnOnce(T) -> impl Future<_> рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рди рдХрд┐ рдХреЗрд╡рд▓ FnOnce(T) -> U ред рднрд╡рд┐рд╖реНрдп рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдЬреНрд╡рд▓рдВрдд рд╕рдВрдпреЛрдЬрдХреЛрдВ рдХреЛ рдХрд░рдирд╛ рдХреЗрд╡рд▓ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рддреНрдпрд╛рдЧ рдХреЗ рдмрд┐рдирд╛ рд╕рдлрд╛рдИ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

let result = load_local_file()
    .or_else(|_| request_from_server()) // Async combinator
    .await
    .and_then(|body| serde_json::from_str(&body)); // Sync combinator

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдкреЛрд╕реНрдЯ-рдлрд╝рд┐рдХреНрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХреА рдкреВрд░реНрд╡рд╡рд░реНрддреАрддрд╛ рдХреЗ рдкреНрд░рд╢реНрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдБрдЧрд╛ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд╣рдж рддрдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдлрд┐рдХреНрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдпреЗ рдкреВрд░реНрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВред рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╡рд░реНрддрдорд╛рди рдСрдкрд░реЗрдЯрд░ рдХреА рдкреВрд░реНрд╡рддрд╛ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

  • рд╡рд┐рдзрд┐ рдХреЙрд▓ ( future.await() )
  • рдлрд╝реАрд▓реНрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ ( future.await )
  • рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ ( future(await) )

рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдЕрдВрддрд░ рдХрдо рдмрд▓реНрдХрд┐ рд╡рд┐рджреНрдпрдорд╛рди рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдЗрди рд╕рднреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛, рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдкрд░рд┐рдорд┐рдд рд╣реИред рдЙрди рд╕рднреА рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреА рд╡рд┐рдкрд░реАрддрддрд╛ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рди рдХрд░реЗрдВ, рдпрд╣ рд╕рдмрд╕реЗ рд╕рдВрдХреБрдЪрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдЕрдВрддрд░ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

struct Foo<A, F, S> where A: Future<Output=F>, F: FnOnce(usize) -> S {
    member: A,
}

// What we want to do, in macro syntax:
let foo: Foo<_, _, _> = тАж;
(await!(foo.member))(42)
  • рд╡рд┐рдзрд┐ рдХреЙрд▓: foo.member.await()(42)
    рд╕рдмрд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рдмрд╛рдБрдзрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдкрд░рдорд╛рдирдВрдж рдирд╣реАрдВ рд╣реИ
  • рд╕рджрд╕реНрдп: (foo.member.await)(42)
    рдЬрдм рдпрд╣ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рддреЛ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рджрд╕реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╕рджрд╕реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рд╕рд╛рде рднреНрд░рдо рд╣реИред рдЗрд╕рд╕реЗ рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: let тАж { await: value } = foo.member; value(42) рдХрд┐рд╕реА рддрд░рд╣?
  • рдлрдВрдХреНрд╢рди рдХреЙрд▓: (foo.member)(await)(42)
    рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА (рд╣рдо рд╕рджрд╕реНрдп рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд) рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЬрдм рд╣рдо рдХрд┐рд╕реА рд╕рджрд╕реНрдп рдХреЗ рдХрджрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рди рддреЛ рдЗрдирдкреБрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рди рд╣реА рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрди рддреАрди рдкреВрд░реНрд╡рд╡рд░реНрддреА рд╡рд░реНрдЧреЛрдВ рдХреЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдмрд╛рдж рд╕реАрдзреЗ рдЖрдиреЗ рдкрд░ рд╕рднреА рдХреЛ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИред рд╣рдо рд╡рд╛рдпрджрд╛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдореЗрдердб рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рд┐рд░реНрдл self рд▓реЗрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдХреЙрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рджрд╕реНрдп рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдирд┐рд╣рд┐рдд рд╕рджрд╕реНрдп await рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рд╡рд┐рдирд╛рд╢ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдХрджрдо рд╕реЗ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдореЛрдЯреЗ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЙрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред рдореИрдВ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рднрд╛рд╖рд╛ рдХреЙрд░реНрдкрд╕ рдХреЗ рд╕рдмрд╕реЗ рд╕рд╛рдл рдЬреЛрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ (рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдореЗрдВ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рд╕рдорд╛рдирддрд╛ рджреЗрддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдмрд┐рдВрджреБ рд╣реИрдВ рдФрд░ .await рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрднреА рднреА рд▓рдВрдмрд╛ рдирд╣реАрдВ рд╣реИред

@HeroicKatora рд╣рдо .await foo.await(42) рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрд╕рдВрдЧрдд / рддрджрд░реНрде рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, (foo.await)(42) рд╕рд░реНрд╡рд┐рд╕рд┐рдмрд▓ рд▓рдЧрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдлреНрдпреВрдЪрд░реНрд╕ рдЖрдЙрдЯрдкреБрдЯ рдХреНрд▓реЛрдЬрд░ рдореМрдЬреВрдж рд╣реИрдВ, рд╡реЗ рд╢рд╛рдпрдж рдпрд╣ рд╕рдм рдЖрдо рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрджрд┐ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢реЗрд╖ рд░рд╛рд╢рд┐ рдореЗрдВ () рд╕реЗ .await рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

@ рдХреЗрдВрджреНрд░ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рд╕рдВрдЧрддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЬрдм рдореБрдЭреЗ рдХреБрдЫ рдРрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдореИрдВ рд╕рдВрд╢реНрд▓реЗрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд╕рд░реЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ .await рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдирддрд╛ рдХреЛ рдирд╖реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдПрдХ рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдпреЗ рдкреНрд░рднрд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВ?)ред рдЬрдм рдореИрдВ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рджреЗрдЦрддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рддреБрд░рдВрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рд▓реЗрдЯ-рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдореВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджреЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рд╕рджрд╕реНрдп рдирд╣реАрдВ рд╣реИ рдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдкреНрд░рдХрд╛рд░ рд╕рд┐рд░реНрдл impl Future<Output=F> (рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╕рд┐рджреНрджреЛрддреЗ: рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ let _ = , funnily┬╣ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЙрдкрд╕рд░реНрдЧ await _ = рд╡рд╛рдкрд╕ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛)ред

рдпрд╣ рд╡рд╛рдХреНрдп-рдкреНрд░рддрд┐-рд╕реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕реАрдЦрдиреЗ рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЕрдЧрд░ рдпрд╣ рдЕрдВрддрд┐рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЛрд░рджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрдордЬреЛрд░реА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред


┬╣ рдпрд╣ рдПрдХ рдкреИрдЯрд░реНрди рдореЗрдВ рдирд╛рдореЛрдВ рдХреЗ рдкреАрдЫреЗ ? рдЕрдиреБрдорддрд┐ рджреЗрдХрд░ ? рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реБрдП рд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

  • await value? = failing_future();

Ok Result рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдореИрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдСрдл-рдЯреЙрдкрд┐рдХ рдореЗрдВ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ await рд▓рд┐рдП рдорд┐рд▓рд╛рди рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рднреА рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╡рд╛рдХреНрдп-рдкреНрд░рддрд┐-рд╕реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдордирд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕реАрдЦрдиреЗ рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЕрдЧрд░ рдпрд╣ рдЕрдВрддрд┐рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬреЛрд░рджрд╛рд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрдордЬреЛрд░реА рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рдЖрдпрд╛рдо рдпрд╛ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рдХрдореА рд╣реЛрдЧреАред рд╕рдВрдЧрддрд┐, рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕, рдЪреЗрдирдмрд┐рд▓рд┐рдЯреА, рдкрдардиреАрдпрддрд╛, ... рдпрд╣ рдЗрд╕реЗ рдбрд┐рдЧреНрд░реА рдХрд╛ рдорд╣рддреНрд╡, рдорд╛рдорд▓реЛрдВ рдХрд╛ рдорд╣рддреНрд╡, рдареЗрда рд░рд╕реНрдЯ рдХреЛрдб рдФрд░ рдПрдкреАрдЖрдИ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдлрд┐рдЯрдиреЗрд╕ рдмрдирд╛рддрд╛ рд╣реИред

foo.await(42) рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ ...

struct HasClosure<F: FnOnce(u8)> { closure: F, }
fn _foo() {
    let foo: HasClosure<_> = HasClosure { closure: |x| {} };

    foo.closure(42);
}

... рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫреЗ рдирд┐рджрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:

5 |     foo.closure(42);
  |         ^^^^^^^ field, not a method
  |
  = help: use `(foo.closure)(...)` if you meant to call the function stored in the
          `closure` field

foo.await(42) рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЯреНрд╡рд┐рдХ рдХрд░рдирд╛ рдХрд╛рдлреА рдкреНрд░рд╛рдкреНрдп рд▓рдЧрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (foo.await)(42) рдЗрд░рд╛рджрд╛ рд░рдЦрддрд╛ рд╣реИ рдЬрдм foo.await(42) рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ cargo fix ed рдореЗрдВ MachineApplicable рддреМрд░ рддрд░реАрдХрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдЧрд░ рд╣рдо foo.await рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди foo.await(42) рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо foo.await(42) рдмрд╛рдж рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╛рдиреВрдиреА рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рддреЛ рд╣рдо рдмрд╛рдж рдореЗрдВ рднреА рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЧреЗ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ (рдЬреИрд╕реЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рднрд╡рд┐рд╖реНрдп - рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдо рд╣реЛрдЧрд╛):
`` `рдЬрдВрдЧ
рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╣реИрд╕рдХреНрд▓реЛрдЬрд░ fn _foo () -> рдкрд░рд┐рдгрд╛рдо <(), ()> {
рдЪрд▓рд┐рдП рдлреВ: рд╣рд╕ рдХреНрд▓реЛрдЬрд░ <_ i = "27"> = рд╣рд╕рдХреНрд▓реЛрдЬрд░ {рдХреНрд▓реЛрдЬрд░: рдУрдХреЗ (| = {{})}};

foo.closure?(42);

Ok(())

}

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрд▓реЛрдЬрд░ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рднрд╡рд┐рд╖реНрдп - рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдо рд╣реЛрдЧрд╛

рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддреНрдпрдп ? рдСрдкрд░реЗрдЯрд░ рдХрд┐рд╕реА рднреА рдкреЛрд╕реНрдЯ-рдлрд╝рд┐рдХреНрд╕ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдХреЛрдИ рдЬрд░реВрд░реА рдирд╣реАрдВ ред рд╕рдорд╕реНрдпрд╛рдПрдВ рдХреЗрд╡рд▓ .member рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рдЖрд╡реЗрджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрджрдо-рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ рд▓рд┐рдЦрдирд╛ рдХрдард┐рди рд╣реЛрдЧрд╛ред рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЕрдиреНрдп .member рдЙрдкрдпреЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдорд┐рд▓рд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореВрд▓ рдкреЛрд╕реНрдЯ рдЙрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рд╡рдЬрдиреА рдереАред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: future.await(42) рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛, рдЕрдирд╛рдпрд╛рд╕ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреЛрдЦрд┐рдо (рдХ) рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИ рдЬрд╣рд╛рдВ рд╕рджрд╕реНрдп рдХреЗ рдЕрдиреБрдорддрд┐ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рд░рдг рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ; рдЦ) рднрд╡рд┐рд╖реНрдп рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд░реЛрдХрдирд╛ рдЬрд╣рд╛рдВ рд╣рдо await рдХреЛ рддрд░реНрдХ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, Future рдПрдХ рдХреНрд▓реЛрдЬрд░ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдирд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рджрдмрд╛рд╡ рд╡рд╛рд▓рд╛ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@novacrazy рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрд╕ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ combinators рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдлреНрдпреВрдЪрд░реНрд╕ 0.3 рдХреЗ рд╕рд╛рде рдХрд┐рддрдирд╛ рдЕрдиреБрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдЕрдкреЗрдХреНрд╖рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкреНрд░рд╛рдердорд┐рдХ / рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЙрдкрдпреЛрдЧ async / рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЕрд╕рд┐рдВрдХ / рд╡реЗрдЯ рдХрд╛ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдкрд░ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрдкрдЬ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдпреЛрдЬрдирдХрд░реНрддрд╛ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдмрд╣реБрдд рдкрд╣рд▓реЗ рдореМрдЬреВрдж рдереЗ, рд▓реЗрдХрд┐рди async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП!

Async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдпрд╣рд╛рдБ рд░рд╣рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕реЗ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ (рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рд╕рд╣рд┐рдд) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдмреЗрд╢рдХ рд▓реЛрдЧ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ рдпрджрд┐ рд╡реЗ рдЪрд╛рд╣реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬреИрд╕рд╛ рдХрд┐ @cramertj рдиреЗ рдХрд╣рд╛, рдЖрдЗрдП рдЪрд░реНрдЪрд╛ рдХреЛ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд░рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рди рдХрд┐ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╡рд┐рдХрд▓реНрдкред

рдпрджрд┐ рдЖрдк рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдмреИрдХрдЕрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

let value = try {
    let v = await some_op()?;
    let v2 = await v.another_op()?;
    await v2.final_op()?
};

match value {
    Ok(value) => Ok(value),
    Err(_) => await backup_op(),
}.unwrap()

рдЗрд╕рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЦреБрд╢рд╣рд╛рд▓ рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИрдВред

рдпрд╣ async / рдЗрдВрддрдЬрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд╣рд╛рди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ: рдпрд╣ рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреНрдп рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓реВрдк, рд╢рд╛рдЦрд╛рдПрдВ, match , ? , try , рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, await , рдпрд╣ рд╡рд╣реА рдХреЛрдб рд╣реИ рдЬреЛ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдлреНрдпреВрдЪрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рдереЗред

рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЕрдЧрд░ рдЖрдк or_else combinator рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ:

let value = await async {
    try {
        let v = await some_op()?;
        let v2 = await v.another_op()?;
        await v2.final_op()?
    }
}.or_else(|_| backup_op());

value.unwrap()

рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЛ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдФрд░ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдП:

async fn doit() -> Result<Foo, Bar> {
    let v = await some_op()?;
    let v2 = await v.another_op()?;
    await v2.final_op()
}
let value = await doit().or_else(|_| backup_op());

value.unwrap()

(рдпрд╣ @joshtriplett рдХреА рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдЙрддреНрддрд░ рд╣реИ )ред

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЛрд╖реНрдардХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ , рдореИрдВрдиреЗ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдмрд┐рдирд╛ рдХреЛрд╖реНрдардХ рдХреЗ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИред рдЗрд╕рд▓рд┐рдП рдХреЛрд╖реНрдардХ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╢реИрд▓реАрдЧрдд рдкрд╕рдВрдж рд╣реИ (рдХреЗрд╡рд▓ рдЬрдЯрд┐рд▓ рд╡рди-рд▓рд╛рдЗрдирд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА)ред

рд╕рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрд╖реНрдардХ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рд╣рдо

рд╕рд╛рде рд╣реА, рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╢рд╛рдпрдж рдЖрдкрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЙрдкрд╕рд░реНрдЧ await рд╡рдХрд╛рд▓рдд рдХрд░ рд░рд╣рд╛ рдерд╛? рдореИрдВ рдирд╣реАрдВ рдерд╛, рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рдкрд╕рдВрдж рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рднреА рдкрд╕рдВрдж рд╣реИрдВред

рдореИрдВ fut.await рд╕рд╛рде рд╕рд╣рдЬ рд╣реЛрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреА рд╢реБрд░реБрдЖрддреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдпрд╣реА рд╣реИ рдХрд┐ рдЖрдк рдХреИрд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЕрдЬреАрдм?" рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рд╡реЗ рдЗрд╕реЗ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред рдмреЗрд╢рдХ, @await рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИ, рдЬреЛ .await рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИред

рдЙрд╕ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде, рд╣рдо рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреБрдЫ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

`.await``@ Await`
let value = try {
    some_op().await?
        .another_op().await?
        .final_op().await?
};

match value {
    Ok(value) => Ok(value),
    Err(_) => backup_op().await,
}.unwrap()
let value = try {
    some_op()@await?
        .another_op()@await?
        .final_op()@await?
};

match value {
    Ok(value) => Ok(value),
    Err(_) => backup_op()<strong i="21">@await</strong>,
}.unwrap()

рдЗрд╕рд╕реЗ рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ ? , await some_op()? , рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ some_op() рд╣реЛ рдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдоред

@Pauan

рдореИрдВ рдпрд╣рд╛рдБ рд╡рд┐рд╖рдп рд╕реЗ рдзреНрдпрд╛рди рд╣рдЯрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдПрдХ рдмреБрд▓рдмреБрд▓реЗ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЪреАрдЬреЗрдВ рдПрдХ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрджрд░реНрд╢ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рддрдм рднреА рдореИрдВ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╕реНрдЯрдо рдлреНрдпреВрдЪрд░ рдФрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд┐ рд╡реЗ рдирд░рдо рдкрджрд╛рд╡рдирдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдореБрдЭреЗ рд░реБрд╕реНрдд рдХреА рд╕рдВрдкреВрд░реНрдг рджрд┐рд╢рд╛ рдкрд░ рдкреНрд░рд╢реНрдирдЪрд┐рдиреНрд╣ рд▓рдЧрддрд╛ рд╣реИред

рдЖрдк рдЬрд┐рди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрддреЗ рд╣реИрдВ, рд╡реЗ рдЕрдм рднреА рдХрдВрдмрд╛рдЗрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрдпрд╛рдирдХ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдирд░реЗрдЯрд░ рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдзрд┐рдХ рдорд╢реАрди рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдЗрдВрддрдЬрд╛рд░ рд╣реИ, рдпрд╣ рд╕рдм рдЙрдкрд╕рд░реНрдЧ / рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдЧрдирд▓ / рдХреАрд╡рд░реНрдб рдмрд╛рдЗрдХреЗрдбрд┐рдВрдЧ рдЕрджреНрднреБрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рд╣рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд░реБрд╕реНрдЯ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред Ie: рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб

рдпрд╣ рд╡рд░реНрд╖ рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рддреЗрдЬреА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрдирд╡рд░реА рднреА рдЬреНрдпрд╛рджрд╛рддрд░ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦреБрд╢ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ 2019/2020 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рднреА рдПрдХ "hindight 2020 рд╣реИ" рдордЬрд╛рдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

@novacrazy

рд╕рд╛рдорд╛рдиреНрдп рд╕рд╣рдорддрд┐ рдореИрдВрдиреЗ рджреЗрдЦреА рд╣реИ рдХрд┐ _earliest_ рд╣рдо рддреАрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ 2022 рд╣реИред рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрд╕рдкрд╛рд╕ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; 2018 рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд▓рд╛рдЧрдд рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВред (рдФрд░ 2018 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ async / рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╕рдВрднрд╡ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╡рд╛рдкрд╕ рд▓реЗ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХрд╣ рд░рд╣рд╛ рд╣реИ "рдирд╣реАрдВ, рдЖрдкрдХреЛ рдЕрдм 2020 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!"

рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб -> рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рд╕рдВрдХреНрд░рдордг рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдВрднрд╡ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрдЧрд╛ред рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛ рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг X рдореЗрдВ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг X + 1 рдореЗрдВ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЖрдо рд╕рд╣рдорддрд┐ рдбреНрд░рд╛рдЗрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдПрдХ рдХреАрд╡рд░реНрдб рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ; рдЬрд╛рди-рдмреВрдЭрдХрд░ рдХрд┐рд╕реА рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ рдЬреЛ рд╕реНрд╡рдпрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рдорд╛рдзрд╛рди рдЕрдзрд┐рдХ рдЗрд╖реНрдЯрддрдо рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБ рд╡рд╛рд▓реЗ рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рднреАред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдиреНрдп рд╕рднреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред

рдмрд╕ рдореЗрд░реЗ рджреЛ рд╕реЗрдВрдЯ (рдореИрдВ рдПрдХ рдХреЛрдИ рднреА рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХрд╛рдлреА рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд░реНрдЪрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ)ред рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рд╕рдорд╛рдзрд╛рди @await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдирдП рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ !await рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХреЗрдВ?

рдЙрджрд╛рд╣рд░рдг:

let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .send()!await?
    .error_for_status()?
    .json()!await?;

рдХреБрдЫ рднрд╛рд╖рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж, рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рднрдпрд╛рдирдХ рд╣реЛрдЧрд╛ред

... рд╕рднреА рдирдП sygils рдкреНрд░рд╕реНрддрд╛рд╡

рдЬрдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ / рднрд╛рд░реА рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ await рдХреАрд╡рд░реНрдб рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ, stuff@await (рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп sygil) рдЕрдЬреАрдм / рдмрджрд╕реВрд░рдд (рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ) рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рд╕рд┐рд░реНрдл рддрджрд░реНрде рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рд▓ рдЭрдВрдбрд╛ рд╣реИред

рдореИрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рд╣реИ
... <- ... рдкреНрд░рд╕реНрддрд╛рд╡

@ I60R : рдЧреЛ рдХреЗ рдкрд╛рд╕ рддрджрд░реНрде рд╕рдорд╛рдзрд╛рдиреЛрдВ рд╕реЗ рднрд░рд╛ рдПрдХ рднрдпрд╛рдирдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ, рдЬрдВрдЧ рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╕рд┐рдЧрд┐рд▓ / рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рднрд╛рд░реА рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддрджрд░реНрде рд╣реИред

@ I60R : рдЧреЛ рдореЗрдВ рдПрдХ рднрдпрд╛рдирдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ

рдЖрдЗрдП, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдпрд╣рд╛рдВ рдкрд░ рдХреЛрд╕рдиреЗ рд╕реЗ рдкрд░рд╣реЗрдЬ рдХрд░реЗрдВред "рдПрдХреНрд╕ рдореЗрдВ рднрдпрд╛рдирдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ" рд╕реЗ рдЖрддреНрдордЬреНрдЮрд╛рди рдФрд░ рдЖрдо рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рдмрди рдкрд╛рддреА рд╣реИред

рдПрдХ рдкрд╛рдпрдерди / рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ / рд░рд╕реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рдЫрд╛рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ await + f.await() рджреЛрдиреЛрдВ рднрд╛рд╖рд╛ рдореЗрдВ рд╣реЛрдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

  1. рдкрд╛рдпрдерди рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреЛрдиреЛрдВ рдореЗрдВ await рдЙрдкрд╕рд░реНрдЧ рд╣реИред рдореИрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ await рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ред рдпрджрд┐ рдореБрдЭреЗ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрд╣рд░реА рд▓рд╛рдЗрди рдореЗрдВ рдкрдврд╝рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд╣реИ, рддреЛ рдореИрдВ рдмрд╣реБрдд рдЕрд╕рд╣рдЬ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред Rust рдХреА WASM рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрдИ JS рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкрд░рд┐рдЪрд┐рдд рдФрд░ рдЖрд░рд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд░рд╕реНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдЕрдиреНрдп рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВред

  2. рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ .await , @await , f await рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рди рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рддрджрд░реНрде рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рдпрд╣ .await() рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ future рдкрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ

рдЬрдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдПрдХ рдкреНрд░рд╕реНрдерд╛рди рд╣реИ рдФрд░ рд╡реЗрдЯ рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ (рдпрд╛рдиреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреИрдВрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИ) рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рдордВрдЬрд╕ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ .await() рд╕рдВрднрд╡рддрдГ .await рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЗ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рдХрдо рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ await!(fut) рдХреЛ _consume fut value_ рд╕реЗ рд╣реИред рдЗрд╕реЗ рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХреА рддрд░рд╣ рдмрдирд╛рдирд╛ _bad_ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХреЗ рдЪрд▓рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдореИрдХреНрд░реЛ рдпрд╛ рдореЗрдердб рдХреЙрд▓ рдХреА рддрд░рд╣ рдЪрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдХреАрд╡рд░реНрдб рд╡рд┐рдзрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕реЗ рд▓рдЧрднрдЧ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдбрд┐рдЬрд╛рдЗрди рдХреА рддрд░рд╣ рдмрдирд╛рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, "рд╕реНрдкрд╖реНрдЯ Async, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛ рдЗрдВрддрдЬрд╛рд░" рд╕рдВрднрд╡ рдирд╣реАрдВ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рд╣реИ (рддрд╛рдХрд┐ _please_ рдлрд┐рд░ рд╕реЗ рдореБрдХрд╝рджрдорд╛ рдирд╣реАрдВ рд╣реИ рдпрд╣ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░) рдХреЗ рдмрд╛рдж рд╕реЗ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ async fn() -> T рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА fn() -> Future<T> , рдЗрд╕рдХреЗ рдмрдЬрд╛рдп "рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдВред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ .await() рд╕рд┐рдВрдЯреИрдХреНрд╕ _looks_ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдХреА рддрд░рд╣ (рдЬреИрд╕реЗ рдХреЛрдЯрд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдПрдХ рдЕрд╡рд░реЛрдзрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд▓рдЧрднрдЧ рдирд╣реАрдВ рдХреЗ рдХрд╛рд░рдг рдЬрд╛рджреВ рдХреЗ рдХрд╛рд░рдг "рдЗрдВрдкреНрд▓рд┐рдХреЗрдВрдЯ рдПрд╕рд┐рдВрдХреНрд╕, рдЗрдВрдкреНрд▓рд┐рдХреЗрдВрдЯ рджреНрд╡реИрдд" рдХреА рднрд╛рд╡рдирд╛ рджреЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐-рдХреЙрд▓ .await() рд╕рд┐рдВрдЯреИрдХреНрд╕ред рдХреНрдпрд╛ рдЖрдк UFCS рдХреЗ рд╕рд╛рде await(fut) рдХрд░ рдкрд╛рдПрдВрдЧреЗ? рдХреНрдпрд╛ рдпрд╣ UFCS рдХреЗ рд▓рд┐рдП Future::await(fut) рд╣реЛрдЧрд╛? рдХреЛрдИ рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЬреЛ рднрд╛рд╖рд╛ рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдЖрдпрд╛рдо рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рддрдм рддрдХ рдЙрдард╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рдХрдо рд╕реЗ рдХрдо рд╡рд╛рдХреНрдпрдЧрдд рд░реВрдк рд╕реЗ рдПрдХреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рди рд╣реЛред

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдЕрдЧрд░ рдХрд┐рд╕реА рднреА _indateral_ postfix рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд╛рдн рдЙрд╕реА рд╕рдорд╛рдзрд╛рди рдХреА рдХрдорд┐рдпреЛрдВ рдХреЛ рджреВрд░ рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рдорд╛рдзрд╛рди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред

рдореИрдВ рдереЛрдбрд╝рд╛ рд╣реИрд░рд╛рди рд╣реВрдВ рдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ рдЙрди рд╕реБрдЭрд╛рд╡реЛрдВ рд╕реЗ рднрд░рд╛ рд╣реИ рдЬреЛ рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдВрднрд╡ рд╣реИрдВ - рдФрд░ рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рд╡реЗ рд╢реБрд░реБрдЖрддреА рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рджреЗрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рд╣рдо рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд░реНрдХ рд▓рд╛рдП рдмрд┐рдирд╛ $ , # , @ , ! , ~ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ await , рдЬрд┐рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЦреБрдж рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд┐рдпрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/57640#issuecomment -455361619 рдХреА рдкреЛрд╕реНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдЕрдЪреНрдЫреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреА рд╣реИред

рдЙрдирдХреА рдУрд░ рд╕реЗ:

  • рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдкрд░рд┐рд╕реАрдорди рдареАрдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреВрд░реНрд╡рддрд╛ рдХреНрдпрд╛ рд╣реИ рдФрд░ рд╣рдо рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд┐рдирд╛ рджреВрд╕рд░реЛрдВ рдХреЗ рдХреЛрдб рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рджреЛ рдХреЛрд╖реНрдардХ рд▓рд┐рдЦрдирд╛ рдПрдХ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдХреБрдЫ рдЕрд▓рдЧ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрд╢рди рд╣реЛред
  • рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рдЧрд╛рдореА рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рд╕рдбрд╝рдХ рдмрди рдЧрдИ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрд░рд┐рдЪрд┐рдд рдФрд░ рд╕рд┐рджреНрдз рд╣реИред
  • рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдПрдХ рд╣реА рдХрдерди рдореЗрдВ рдХрдИ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╣реИрдВред
    client.get("url").send() await?.json()? ред рдмреАрдЪ рдореЗрдВ рд╕реЗ рд╡рд╣ рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдЬрдЧрд╣-рдЬрдЧрд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЕрд░реНрде рджреЗрдЧрд╛: (client.get("url").send() await)?.json()?
    рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдЕрднреА рднреА рдХрдард┐рди рд╣реИред
  • рдореБрдЭреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдлрд╝реАрд▓реНрдб рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред await рдПрдХ рдмрд╣реБрдд рд╣реА рдЬрдЯрд┐рд▓ рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИ - рдЬрдВрдЧ рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЧреБрдг рдирд╣реАрдВ рд╣реИ рдФрд░ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдЕрдиреНрдпрдерд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдСрдкрд░реЗрд╢рди рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рджреЗрддрд╛ рд╣реИред
  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡рд┐рдзрд┐ рдареАрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓реЛрдЧ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╡рдХреНрдд рдХреЗ рдмрдпрд╛рдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрдЬ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЕрдзрд┐рдХ рдЫрд┐рдкрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдлрд┐рд░ рд╕реЗ рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдХреБрдЫ рдЕрд▓рдЧ рд╣реЛред

рдЗрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореИрдВ "рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд░рд┐рд╕реАрдорд╛" рдХреЗ рдмрд╛рдж "рдЙрдкрдпреЛрдЧреА рд╡рд░реАрдпрддрд╛" рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ

рдЧреЛ рдХреЗ рдкрд╛рд╕ рддрджрд░реНрде рд╕рдорд╛рдзрд╛рдиреЛрдВ рд╕реЗ рднрд░рд╛ рдПрдХ рднрдпрд╛рдирдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ, рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ рд╣реИ, рд░рд╕реНрдЯ рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╕рд┐рдЧрд┐рд▓ / рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рднрд╛рд░реА рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддрджрд░реНрде рд╣реИред

@dpc , рдпрджрд┐ рдЖрдк <-- рдкреНрд░рд╕реНрддрд╛рд╡ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗрд╡рд▓ рдЧреЛ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдирд┐рд╡рд╛рд░реНрдп рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЪрд╛рдЗрдирд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╣реБрдд рднрд┐рдиреНрди рдФрд░ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдореИрдВ рдпрд╣ рднреА рджреЗрдЦрдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реВрдВ рдХрд┐ await рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рддрджрд░реНрде рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдФрд░ <-- рд╕реЗ рдЕрдзрд┐рдХ рдЕрдирд╛рдбрд╝реА рд╣реИред рдпрд╣ рд╣реИ рдХреЗ рд╕рдорд╛рди рд╣реИ deref reference / reference.deref / рдЖрджрд┐ рдХреЗ рдмрдЬрд╛рдп *reference , рдпрд╛ try result / result.try / рдЖрджрд┐ рдХреЗ рдмрдЬрд╛рдп result? ред рдореБрдЭреЗ рдпрд╛ рддреЛ JS / Python / etc рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ await рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╕реБрд╕рдВрдЧрдд рдФрд░ рдХрдВрдкреЛрдЬрд┐рдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдиреЗ рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдореБрдЭреЗ <-- sIG рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ await рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╡реИрд╕реЗ рднреА рд╕рд╛рджреЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ @ Matthias247 рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЬрд╡рд╛рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ await рдЦрд┐рд▓рд╛рдл рдХреБрдЫ рддрд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, <-- рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЖрд▓реЛрдЪрдирд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрди рддрд░реНрдХреЛрдВ рд╕реЗ рдореБрдХреНрдд рд╣реИ рдЬреЛ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдФрд░ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣реА рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЕрдкреАрд▓ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдЗрдП рдкреВрд░реНрд╡рддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВ:

рдЖрдЬ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЪрд╛рд░реНрдЯ:

рд╕рдВрдЪрд╛рд▓рдХ / рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ | рд╕рдВрдмрджреНрдзрддрд╛
- | -
рдкрде |
рд╡рд┐рдзрд┐ рдХреЙрд▓ |
рдХреНрд╖реЗрддреНрд░ рдХреЗ рднрд╛рд╡ | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
рд╕рдорд╛рд░реЛрд╣ рдХреЙрд▓, рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдордг |
? |
Unary - * ! & &mut |
as | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
* / % | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
+ - | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
<< >> | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
& | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
^ | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
\| | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
== != < > <= >= | рдХреЛрд╖реНрдардХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
&& | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
\|\| | рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ
.. ..= | рдХреЛрд╖реНрдардХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
= += -= *= /= %= &= \|= ^= <<= >>= | рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ
return break рдмрдВрдж |

рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рддрд╛ await ? await рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдбрд╛рд▓рддреА рд╣реИ рддрд╛рдХрд┐ рдпрд╣ ? рд╕реЗ рдЕрдзрд┐рдХ рдХрд╕рдХрд░ рдмрдВрдзреЗред рдПрдХ ? рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ 'рд╕рдм рд╕реЗ рдкрд╣рд▓реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдмрд╛рдВрдзрддрд╛ рд╣реИред

let res = await client
    .get("url")
    .send()?
    .json();

рд╣рд╛рдВ, рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рддрд╛ рдХреЗ рд╕рд╛рде, рдХрд┐ "рдмрд╕ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ"ред рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╡рд╣ рдмреБрд░реА рд╢реИрд▓реА рд╣реИ (рд╢рд╛рдпрдж)? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдЬрдВрдЧрдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ await _somewhere_ ? рдиреАрдЪреЗ рд░рдЦрддреА рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣рд╛рдБ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрди рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред

let res = await? (client
    .get("url")
    .send())
    .json();

рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдХреНрдпрд╛ рд╕рд░рдлрд╛рди рдЗрд╕реЗ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╢реИрд▓реА рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмреЗрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ?


рдЗрд╕рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рдЦреЛрдЬрд╢рдмреНрдж рдХрд╣рд╛рдБ рдЧрд┐рд░реЗрдВрдЧреЗ? рд╕рдВрднрд╡рдд: рдХреАрд╡рд░реНрдб рд╡рд┐рдзрд┐ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдФрд░ рдХреАрд╡рд░реНрдб рдлрд╝реАрд▓реНрдб рдлрд╝реАрд▓реНрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ рдХрд┐ рджреВрд╕рд░реЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрд╛рдВрдзрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рд╡рд┐рдХрд▓реНрдк рдХрдо рд╕реЗ рдХрдо рд╕рдВрднрд╡ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ await рдПрдХ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ "рддрд░реНрдХ" рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ?

рдЗрд╕ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ "рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ" рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИ (рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ рдХреАрд╡рд░реНрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рд╣реИ) рдЖрд╕рд╛рдиреА рд╕реЗ рдЬреАрддрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред

@ CAD97 рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ .json() рднреА рдПрдХ рднрд╡рд┐рд╖реНрдп рд╣реИ (рдХрдо рд╕реЗ рдХрдо reqwests )ред

let res = await await client
    .get("url")
    .send()?
    .json()?;
let res = await? await? (client
    .get("url")
    .send())
    .json();

рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЬрдЯрд┐рд▓ рдЬрдВрдЧ рдХреЗ рднрд╛рд╡реЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддрд╛ рд╣реВрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреЗрд╡рд▓ 1 рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореЗрд░реЗ 20,000+ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЛрдб рдЖрдзрд╛рд░ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рд░ рдПрдХ рдПрдХрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ, рд╕реАрдзреЗ рджреВрд╕рд░реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж), рдФрд░ рдЕрдзрд┐рдХ рдореБрдЭреЗ рдирд╛рдкрд╕рдВрдж рд╣реИ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧред

рдпрд╣ ? рдСрдкрд░реЗрдЯрд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг _all_ рд╣реИред рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдлрд╝реНрд▓реЛ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред _ рдФрд░ await рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣рдореЗрд╢рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред


рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЕрднреА рднреА рдЙрдкрд╕рд░реНрдЧ рдХреНрд╖реЗрддреНрд░ рд╣реИ ред рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдВрддреНрд░рдг рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рддрдВрдЧ рджреГрд╢реНрдп рд╕рдореВрд╣рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ future.await future await рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдФрд░ .await()? , рдореИрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдБ рдХрд┐ рдХреИрд╕реЗ .await? _weird_ рд▓рдЧрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ _noticed_ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рдирд╣реАрдВ рдорд╛рдиреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдп рд╣реИ (рдФрд░ рдЗрд╕ рддрд░рд╣ рдпрд╣ рдирд╣реАрдВ рдкреВрдЫреЗрдВрдЧреЗ рдХрд┐ UFCS рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛) ред


рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдФрд░ рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрдм рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЬреЛ рднреА рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ rustfix await!(...) рд╣реЛрддрд╛ рд╣реИ, рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред рдореИрдВ ( ... ) рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рди рд▓рдкреЗрдЯреЗ рдмрд┐рдирд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛, рд▓реЗрдХрд┐рди рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ "рдХреНрдпрд╛ рд╣рдо рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдиреЗ рдореЗрдВ await рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?" рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреНрд░рдЪрд▓рд┐рдд рдЙрддреНрддрд░ "рд╣рд╛рдБ" рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рддрд░реНрдХ рдмрди рдЬрд╛рддрд╛ рд╣реИред рдЬрдмрдХрд┐ await!(..) рдЬреЛрдбрд╝рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдореЗрдВ try!(..) рдХрд╣рд╛рдиреА рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░реНрдХ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ "рдЪреЗрдирд┐рдВрдЧ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ", рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рд╕реА рдЪрд╛рдЗрдирд┐рдВрдЧ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ _very_ рднрд╛рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЪреЗрдирд┐рдВрдЧ рдореЗрдВ рдЖрд▓рд╕реНрдп рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред

рдЬрдмрдХрд┐ рдЙрдкрд╕рд░реНрдЧ await рдХреАрд╡рд░реНрдб рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдЧрд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдирд╛ рдирд┐рд░реНрдгрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрдВ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ, рдпрд╛рдиреА рдкреНрд░рдпреЛрдЬреНрдп, рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдкрдардиреАрдпрддрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред ред @withoutboats рдиреЗ "рдкрд░рд┐рдЪрд┐рдд рдмрдЬрдЯ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЕрдм рд╣рдо рд╢рд╛рдпрдж рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдФрд░ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рджреЛрдиреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рд╕реАрдорд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред

рдкрд╣рд▓реЗ рд╣рдо fut await рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдЧрдбрд╝рдмрдбрд╝ рдХрд░реЗрдЧрд╛ рдХрд┐ рдордиреБрд╖реНрдп рдХреЛрдб рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдкрдврд╝рддреЗ рд╕рдордп рдпрд╣ рднреНрд░рдо рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░ рд╕реНрд░реЛрдд рд╣реЛрдЧрд╛ред (рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдХреЛрдб рдЬреНрдпрд╛рджрд╛рддрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ)

рдЕрдЧрд▓рд╛ fut.await , fut.await() рдФрд░ fut.await!() ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рд╕реБрд╕рдВрдЧрдд рдФрд░ рдХрдо рднреНрд░рд╛рдордХ рд╕рдВрд╕реНрдХрд░рдг рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдПрдХ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЗрд╡рд▓ рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ "рдХреАрд╡рд░реНрдб рдлрд╝рдВрдХреНрд╢рди" рдпрд╛ "рдХреАрд╡рд░реНрдб рд╡рд┐рдзрд┐" рдЗрдХрд╛рдИ рд╢реБрд░реВ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред

рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рд╕рддрд░реНрдХ рдЖрдзрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг: fut@await рдФрд░ fut@ ред рдореБрдЭреЗ fut@await рд╡реИрд░рд┐рдПрдВрдЯ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдЕрдЧрд░ рд╣рдо sigil рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ рддреЛ await рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдХреНрдпреЛрдВ рдкрд░реЗрд╢рд╛рди рд╣реЛрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди fut@something ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рдмреЗрдорд╛рдиреА рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ fut@ рд╡реИрд░рд┐рдПрдВрдЯ рдкрд╕рдВрдж рд╣реИ, рдпрд╣ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рд╕рдордЭрдирд╛, рд▓рд┐рдЦрдирд╛ рдФрд░ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рджреГрд╢реНрдпрддрд╛ рдореБрджреНрджреЛрдВ рдХреЛ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ "@ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП" рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛рдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдмреЗрд╢рдХ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдХрдореА рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рд╕реАрдорд┐рдд "рд╕рддрд░реНрдХ рдмрдЬрдЯ" рд╕реЗ рднреБрдЧрддрд╛рди рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдорд╣рддреНрд╡ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рддрдиреА рдмрд╛рд░ async рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛ ред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдо ? рд╕рд╛рде рдХреБрдЫ рд╕рдорд╛рдирддрд╛рдПрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдореЗрдВ рдЬрдВрдЧ рдЖрд▓реЛрдЪрдХреЛрдВ рд╕реЗ рдкрд░реНрд▓ рдЪреБрдЯрдХреБрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣рдирд╛ рд╣реЛрдЧрд╛)

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ: рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЕрдЧрд░ рд╣рдо "рд╕рддрд░реНрдХ рдмрдЬрдЯ" рдХреЗ рдмреЛрдЭ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ fut@ рд╕рд╛рде рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрджрд┐ fut.await!() ред

рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ JS / Python / C # рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ Rust рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрдЧрд╣ рдкрд░ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдЪреАрдЬреЛрдВ рдореЗрдВ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрди рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдФрд░ рдХрдо рдкреНрд░рддрд┐рдлрд▓ рд▓рдХреНрд╖реНрдп рд╣реИред рдХреЛрдИ рднреА рдХреЗрд╡рд▓ рдкрд░рд┐рдЪрд┐рдд рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрдм рд╣реБрдб рдХреЗ рддрд╣рдд рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЧреЛ рдкрджрд╛рд░реНрде рд╕реЗ рдкрд░рд┐рдЪрд┐рдд, рдЪреВрдБрдХрд┐ рд░рд╕реНрдЯ рд╕рдорд╛рди рд╣реИ рдФрд░ рджрд░реНрд╢рди рд╕реЗ рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧреЛ рдХреЗ рдЕрдзрд┐рдХ рдирд┐рдХрдЯ рд╣реИред рдФрд░ рд╕рднреА рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣реА рдирдлрд░рдд рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЙрди рджреЛрдиреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рд╣реИред

IMO, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ <-- рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдордЬрдмреВрдд рд╣реИ

рдЙрд╕ рд╕рдм рдХреЗ рд╕рд╛рде, рдЖрдЗрдП рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЬрдВрдЧ рдХреЗ рднрд╛рд╡ рдХрдИ рдЬрдВрдЬреАрд░ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдПрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред

рдореИрдВ C # рджреЗрд╡ рдЯреАрдо рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

рд╕реА # рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдСрдкрд░реЗрдЯрд░ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдлреВ рд╣реИ?

рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рдордиреЗ 'рдкреНрд░рддреАрдХреНрд╖рд╛' рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реЛрдЪрд╛ рдФрд░ рд╣рдордиреЗ рдЬреЛ рд░реВрдк рдЪрд╛рд╣рд╛, рдЙрд╕ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдордиреЗ рдХрдИ рд░реВрдкреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдПрдХ рдореБрдЦреНрдп рдЪреАрдЬрд╝ рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓реА, рд╡рд╣ рдпрд╣ рдереА рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдФрд░ рдЧреНрд░рд╛рд╣рдХ (рдЖрдВрддрд░рд┐рдХ рдФрд░ рдмрд╛рд╣рд░реА) рдЬреЛ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд╢рд╛рдпрдж рд╣реА рдХрднреА рдРрд╕рд╛ рд╣реЛрддрд╛ рдерд╛ рдХрд┐ рд▓реЛрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ async рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рднреА 'рдЪреЗрди' рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред

рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рдпрд╛рди рдХреЗ рдЕрдВрджрд░ 'рдкреНрд░рддреАрдХреНрд╖рд╛' рдХреЗ рд╕рд╛рде 'рдЬрд╛рд░реА рд░рдЦрдирд╛' рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рджреБрд░реНрд▓рдн рдерд╛ред рд╣рдо рдХрднреА-рдХрднреА рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ (рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд expr) .M (), рд▓реЗрдХрд┐рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдо рдФрд░ рдХрдо рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрд╡рдзрд┐ () рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рддрдерд╛

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо 'рд╡реЗрдЯ' рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА 'рдирд┐рд╣рд┐рдд' рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЧрдПред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдерд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЛрдЧ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдФрд░ рдЬрд┐рд╕реЗ рд╡реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдлреНрд░рдВрдЯ-рдПрдВрдб-рд╕реЗрдВрдЯрд░ рдЪрд╛рд╣рддреЗ рдереЗ рддрд╛рдХрд┐ рд╡реЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХреЗрдВред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрд╖реЛрдВ рдмрд╛рдж рднреА, рдпрд╣ рдкреНрд░рд╡реГрддреНрддрд┐ рдмрдиреА рд╣реБрдИ рд╣реИред рдЕрд░реНрдерд╛рдд рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдмрд╛рдж рдкрдЫрддрд╛рд╡рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЕрддреНрдпрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИред рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдЕрдЪреНрдЫреА рд╣реИрдВ рдЬреЛ рдЬрд▓реНрджреА рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рд▓реЛрдЧ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреБрдЫ рдирд┐рдбрд░ рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рд╣реЛрддреЗ рд╣реИрдВред 'рд╡реЗрдЯ' рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ ред рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдХреАрд╡рд░реНрдб рдХреА рднрд╛рд░реА-рд╡рдЬрди рдХреА рдкреНрд░рдХреГрддрд┐ рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд╕рдВрдж рдХреА рдЧрдИ рдорд┐рд╕рд╛рд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рд╕рдорд░реНрдкрд┐рдд (рдХреБрдВрдЬреА) рд╢рдмреНрдж рдХреЗ рдмрдЬрд╛рдп рд╕рддрд░реНрдХ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ рд╣реИред

https://github.com/rust-lang/rust/issues/50547#issuecomment -388939886

рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдЦреЛрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реБрдирдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд▓рд┐рдП рдЖрдк рдХреБрдЫ рднреА рдЪреЗрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрдк рдмрд╕ рдХрдИ await 's рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рднреА рдпрд╣реА рд╣реИред 6 рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП async/await рдХреЛрдб рд▓рд┐рдЦрдирд╛, рдФрд░ рдореБрдЭреЗ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХрднреА рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП рдереАред рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рджреЗрд╢реА рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрднреА рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред Async рдХреЙрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд╛рд╣рд╕рд┐рдХ рдХрд╛рд░реНрдп рд╣реИ рдЗрд╕рд▓рд┐рдП рд╕рд┐рдВрдЧрд▓ рд▓рд╛рдЗрди рдкрд░ рдХрдИ рдкреНрд░рддреАрдХреНрд╖рд╛рдПрдВ рдмрд╣реБрдд рднрд╛рд░реА рд╣реИрдВред

рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рдпрд╛рди рдХреЗ рдЕрдВрджрд░ 'рдкреНрд░рддреАрдХреНрд╖рд╛' рдХреЗ рд╕рд╛рде 'рдЬрд╛рд░реА рд░рдЦрдирд╛' рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрд╣ рджреБрд░реНрд▓рдн рдерд╛ред рд╣рдо рдХрднреА-рдХрднреА рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ (рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд expr) .M (), рд▓реЗрдХрд┐рди рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдо рдФрд░ рдХрдо рд╡рд╛рдВрдЫрдиреАрдп рд╣реИ, рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрд╡рдзрд┐ () рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрд╣ рдПрдХ рдкреЛрд╕реНрдЯреАрд░рд┐рдпрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рд░реА рди рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИ (рдПрдХ рдмрдпрд╛рди рдореЗрдВ try! рдХрдИ рдмрд╛рд░ рдирд╣реАрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдСрдкрд░реЗрдЯрд░ ? рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд░рд╣рддрд╛ рд╣реИред

@ I60R ,

  1. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЬрдВрдЧ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдИ рднрд╛рд╖рд╛ рд╣реИ рдФрд░ рд▓реЛрдЧ рджреВрд╕рд░реА рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдкрд▓рд╛рдпрди рдХрд░ рд░рд╣реЗ рд╣реЛрдВрдЧреЗ рдФрд░ рдЕрдЧрд░ рдЬрдВрдЧ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдЧреА рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ рдХрд┐ рд╡реЗ рд░реБрд╕реНрдд рдХреЛ рдЪреБрдирдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░реЗрдВред
  2. рдореИрдВ рдЪрд┐рдирд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдмрдбрд╝рд╛ рдордЬрд╝рд╛ рдирд╣реАрдВ рд╣реВрдВ - рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ рдФрд░ рдореИрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдХреЛрдбрд┐рдВрдЧ рдХреА рдкрдардиреАрдпрддрд╛ рд╕рд┐рд░реНрдл рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк (рдЬреИрд╕реЗ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ .await!() ) рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЙрдкрд╕рд░реНрдЧ рдкреНрд░рдкрддреНрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЪреЗрдирд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рддрд░реАрдХреЛрдВ рдореЗрдВ рдХреЛрдб рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ:
let resp = await client.get("http://api")?;
let body: MyResponse = await resp.into_json()?;

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:

let body: MyResponse = await client.get_json("http://api")?;

рдпрд╣ рдПрдХ рдкреЛрд╕реНрдЯреАрд░рд┐рдпрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХрд╛рд░рдг рди рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рднреА, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рдж рдЕрдЬреАрдм рд╣реИред рдЙрдкрд░реНрдпреБрдХреНрдд рдХреЗрд╡рд▓ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд╣реАрдВред рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ C # Rust рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рджрд╕реНрдп рдкрд░рд┐рдгрд╛рдо рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдирд╣реАрдВ, рдпрд╣ рдЖрдВрддрд░рд┐рдХ C # рдЯреАрдо рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрдм рдЗрд╕рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ / рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ / рдирд┐рд╣рд┐рдд рд░реВрдк рджреЛрдиреЛрдВ рдереЗред рдФрд░ рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рд╕рд┐рд░реНрдл рдПрдХ рдЖрджрдд рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдлреЙрд░реНрдо рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реВрдВред

@mehcode рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рдкреНрд░реЗрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред reqwest рд╕рдЪреЗрдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪрдХреНрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ (рдмреЙрдбреА рд╕реНрдЯреНрд░реАрдо) рдХреЗ рдмрд╛рдж рдХреЗ рд╣реИрдВрдбрд▓ рдХреЛ рд╕рдорд╡рд░реНрддреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ @andreytkachenko рд╢реЛ рдХреА рддрд░рд╣ рджреЛ рдмрд╛рд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

reqwest рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд API рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

let res = await client
    .get("url")
    .json()
    .send();

рдпрд╛

let res = await client
    .get("url")
    .send()
    .json();

(рдмрд╛рдж рдореЗрдВ and_then рд╕реЗ рдЕрдзрд┐рдХ рд╕рд░рд▓ рдЪреАрдиреА рд░рд╣реА)ред

рдореБрдЭреЗ рдпрд╣ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ reqwest s рдФрд░ hyper s рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ api рдирд┐рд░реНрдгрдп рдЗрди рдЪреАрдЬреЛрдВ рдХреЛ рдЕрд▓рдЧ рд░рдЦ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣рд╛рдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ (рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЪреАрдиреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╕рдорд╛рди рд╕рдВрдЪрд╛рд▓рди рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрдИ рдмрд╛рд░ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@andreytkachenko

рдЙрдкрд╕рд░реНрдЧ рдлреЙрд░реНрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЪреЗрдирд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рддрд░реАрдХреЛрдВ рдореЗрдВ рдХреЛрдб рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ:

рдХреНрдпрд╛ рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫреА рдЪреАрдЬрд╝ рд╣реИ рдпрд╛ рдПрдХ рдмреБрд░реА рдЪреАрдЬрд╝ рд╣реИ? рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдБ N рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк M рдлрд╝реЙрд▓реЛ-рдЕрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ N * M рд╡рд┐рдзрд┐рдпрд╛рдБ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣реИрдВ? рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рд╕рдВрдпреЛрдЬрдиреАрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддрд░рд╣, рднрд▓реЗ рд╣реА рд╡реЗ рдереЛрдбрд╝реЗ рд▓рдВрдмреЗ рд╣реЛрдВред

рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:

let body: MyResponse = await client.get_json("http://api")?;
let body: MyResponse = client.get("http://api").await?.into_json().await?;

@Pzixel

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ C # рдореЗрдВ рдЖрдк рдЙрддрдирд╛ рдЬрдВрдЬреАрд░ / рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рддрдирд╛ рдЖрдк рдЬрдВрдЧ рдореЗрдВ рдХрд░реЗрдВрдЧреЗред рдпрд╛ рдореИрдВ рдЧрд▓рдд рд╣реВрдБ? рдпрд╣ C # devs / users рдХреЗ рдЕрдиреБрднрд╡реЛрдВ рдХреЛ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдпрд╣ Rust рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рд╣реЛред рдХрд╛рд╢ рд╣рдо Ocaml рдпрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде рд╡рд┐рдкрд░реАрдд рдХрд░ рд╕рдХрддреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╕рд╣рдорддрд┐ рдХрд╛ рдореВрд▓ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордореЗрдВ рд╕реЗ рдХреБрдЫ рд▓реЛрдЧ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдХрд╛ рдЖрдирдВрдж рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рддреНрдордХред рдФрд░ рдмрд╕ред рдЬрдВрдЧ рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдФрд░ рдмрд╣рд╕ рдХреЗ рджреЛрдиреЛрдВ рдкрдХреНрд╖ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╡рд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рд╣реЛред

@dpc

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ C # рдореЗрдВ рдЖрдк рдЙрддрдирд╛ рдЬрдВрдЬреАрд░ / рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рддрдирд╛ рдЖрдк рдЬрдВрдЧ рдореЗрдВ рдХрд░реЗрдВрдЧреЗред рдпрд╛ рдореИрдВ рдЧрд▓рдд рд╣реВрдБ? рдпрд╣ C # devs / users рдХреЗ рдЕрдиреБрднрд╡реЛрдВ рдХреЛ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдпрд╣ Rust рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рд╣реЛред рдХрд╛рд╢ рд╣рдо Ocaml рдпрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде рд╡рд┐рдкрд░реАрдд рдХрд░ рд╕рдХрддреЗред

LINQ рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА C # рдореЗрдВ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВред

@dpc ,
рдпрджрд┐ рдЖрдк рдкрдардиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ - рдореИрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд┐рддрдирд╛ рдХреЛрдб рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдЙрддрдирд╛ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ / рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЖрддреНрдо-рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдлреЙрд▓реЛ-рдЕрдк рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рдУрд╡рд░рд╣реЗрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВ - рдЬрдВрдЧ рд╕рдВрдХрд▓рдХ рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЗрдирд▓рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рд╣реИ (рд╡реИрд╕реЗ рднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ #[inline] )ред

@dpc

let body: MyResponse = client.get("http://api").await?.into_json().await?;

рдореЗрд░реА рднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╛рдпрджрд╛ рдПрдкреАрдЖрдИ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ: рдпрд╣ рдЬрдВрдЬреАрд░реЛрдВ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдШреБрд╕рдирд╛ рдФрд░ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЙрд╕реА рддрд░реНрдХ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ? рдСрдкрд░реЗрдЯрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐? рдпрд╣ рдЕрдзрд┐рдХ рдЪреИрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдХреНрдпреЛрдВ рдЪреБрдирд╛? рдХреЛрд╢рд┐рд╢ рдХрд░реЛ! рдлрд┐рд░? рдФрд░ Rust рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде API рдХреЛ рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ? рдЗрд╕рд▓рд┐рдП Rust рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА API рдореЗрдВ рдЪреЗрдирд┐рдВрдЧ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рдЪреБрди рд▓рд┐рдП рд╣реИрдВред рдФрд░ рд╣рд╛рдБ, рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЛ рдХрдард┐рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд▓рд┐рдВрдЯ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╢рд╛рдпрдж рдЪреЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд▓рд┐рдВрдЯ рдЬреЛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ? рдореБрдЭреЗ рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░реЗрд░рдгрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреИрд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЕрд▓рдЧ рд╣реИред

рдХреНрдпрд╛ рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫреА рдЪреАрдЬрд╝ рд╣реИ рдпрд╛ рдПрдХ рдмреБрд░реА рдЪреАрдЬрд╝ рд╣реИ? рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдБ N рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк M рдлрд╝реЙрд▓реЛ-рдЕрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдбреЗрд╡рд▓рдкрд░ рдХреЛ N * M рд╡рд┐рдзрд┐рдпрд╛рдБ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣реИрдВ? рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рд╕рдВрдпреЛрдЬрдиреАрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддрд░рд╣, рднрд▓реЗ рд╣реА рд╡реЗ рдереЛрдбрд╝реЗ рд▓рдВрдмреЗ рд╣реЛрдВред

рдПрди рдФрд░ рдПрдо рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЙрди рд╕рднреА рдХреЛ рднреА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ / рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@andreytkachenko ,

  1. рдореИрдВ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдБ, рдкрд░рд┐рдЪрд┐рдд рдпрд╣рд╛рдБ рдкрд░ рд╣реИред рдЬрдм рдЕрдиреНрдп рднрд╛рд╖рд╛ рд╕реЗ рдкреНрд░рд╡рд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкрд╣рд▓реЗ рд▓реЛрдЧ async-await -рд╕реНрдЯрд╛рдЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдпрджрд┐ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдмреЗрд╣рддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдиреБрднрд╡ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛, рддреЛ рдпрд╣ рдПрдХ рдФрд░ рд▓рд╛рдн рдмрди рдЬрд╛рдПрдЧрд╛ред

  2. рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдбрд┐рдмрдЧрд░реНрд╕ рдХреА рдХрдореА рд╣реИ рдЬреЛ рдХреЛрдб рд╢реИрд▓реА рдХреА рдирд╣реАрдВ рд╣реИред рдкрдардиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдпрд╣рд╛рдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд╣реИред рдпрджрд┐ async рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЕрднреА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╣реИрдВ, рддреЛ рдЪреЗрдирд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИред рдФрд░ рд╡реИрд╕реЗ рднреА, <-- рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЪреЗрди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд░рдЦрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛ рдерд╛

@ рднрд╛рдЧрд╛ рд╕рд╣рдорддред

рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рд╡рд╛рд▓реЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдПрдХ рдХреЛрдб рдЧрдВрдз рд╣реИрдВред рд╣реБрдб рдХреЗ рддрд╣рдд рдЗрди рдЬрдирд░реЗрдЯрд░ рд╕реНрдкреЗрдЧреЗрдЯреА рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрдиреНрд╣реЗрдВ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪрд░рдо рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдпрджрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреБрд╕реНрдЦрд╛ рд╣реИред

рдореИрдВ рдЕрдм рднреА рджреЛрдиреЛрдВ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб await рдФрд░ рдореИрдХреНрд░реЛ await!(...) / .await!() рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВ, async рдФрд░ #[async] рдЬрдирд░реЗрдЯрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде , рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдпрд╣рд╛рдБ ред

рдпрджрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдПрдХ рднреА рдореИрдХреНрд░реЛ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреНрд░рддреНрдпрдп рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП await! рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ await рдХреАрд╡рд░реНрдб рдХреЗрд╡рд▓ async рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдЧрд╛ред

@ рднрд╛рдбрд╝рд╛ ,
рдореЗрд░реЗ рд▓рд┐рдП future рдкрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ async рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЫрд┐рдкрд╛рдПрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдореИрдВ рд╕рднреА рд╕рдВрджрд┐рдЧреНрдз рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдбрд░-рд╕реНрдЯрд╛рдЗрд▓ рдЪреЗрди рдХреЗ рдЕрдВрджрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@ I60R рдбрд┐рдмрдЧрд┐рдВрдЧ рд▓реЙрдиреНрдЧ рдХреЙрд▓ рдЪреЗрдиреНрд╕ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбрд┐рдмрдЧрд░ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдЪреЗрдиреНрд╕ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдЯрд╛рдЗрдк рдЗрдВрдЯреНрд░реЗрдВрд╕ рд░рд╛рдЗрдЯ рд╣реЛ рд░рд╣реА рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЙрди рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХрдИ рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реМрдВрдкрддреЗ рд╣реИрдВ, рд╕рдВрднрд╡рддрдГ рдПрдХ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рд╣реИ, рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрджрд┐ рд╕рднреА рдирд┐рд▓рдВрдмрди рдмрд┐рдВрджреБ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдПрдХ рд▓рдХреНрд╖реНрдп рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд░рдирд╛ рд╣реИред рдФрд░ рдпрд╣ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИред

@ рдиреЛрд╡рд╛рдХреНрд░реЗрдЬреА рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ, рдЕрдм рдЬрдм рдЖрдк рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдкреВрд░реНрд╡ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдХрднреА рднреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛

let result = (await doSomethingAsync()
          .then(|result| {
                     match result {
                          Ok(v) => doSomethingAsyncWithFirstResponse(v)
                          Err(e) => Future.Resolve(Err(e))
                      }
            }).then(|result| {
                  Ok(result.unwrap())
            })).unwrap();

рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрднрд╡ рд╣реИ, рдореБрдЭреЗ рд░рд╕реНрдЯ рдореЗрдВ рдлреНрдпреВрдЪрд░ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ

@richardanaya рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реИ (рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕)ред

рдмреЙрдХреНрд╕ рдХреА рддрд░рд╣:

impl<T> Box<T> {
    #[inline]
    pub fn new(x: T) -> Box<T> {
        box x
    }
    ...
}

рд╣рдо рдПрдХ рдирдпрд╛ рдХреАрд╡рд░реНрдб await рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд╕рд╛рде Await рдкрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

impl<T> Await for T {
    #[inline]
    pub fn await(self) -> T {
        await self
    }
    ...
}

рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдПрдХ рдЦреЛрдЬрд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ await рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

let result = await foo();
first().await()?.second().await()?;

@richardanaya рд╕рд╣рдордд рд╣реИрдВред рдореИрдВ рдХрдИ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рд╡реЗрдмрджреЗрд╡ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП async / рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рджреЗрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдмреАрдЪ рдореЗрдВ рдерд╛, рдФрд░ рдЕрд╕рд▓реА рд╢рдХреНрддрд┐ async / рдореМрдЬреВрджрд╛ рд╕рдВрдпреЛрдЬрди / рд╡рд╛рдпрджрд╛ рдХреЗ рд╕рд╛рде рдЗрдВрддрдЬрд╛рд░ рд╕реЗ рдЖрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рднреА рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

let result = await doSomethingAsync()
                  .and_then(doSomethingAsyncWithFirstResponse);

let value = result.unwrap();

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рдпрджрд╛ рдпрд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╡рд╛рдпрджрд╛ рдпрд╛ рд╡рд╛рдпрджрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рддреЛ .flatten() рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдЖрдЧреЗ рднреА рдЙрд╕ рд╕рд░рд▓рддрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╣рд░ рдПрдХ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдирдЪреЗрдХ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рд░реВрдк рд╣реЛрдЧрд╛ред

@XX рдпрд╣ рдмреЗрдорд╛рдиреА рдФрд░ рдЕрдорд╛рдиреНрдп рд╣реИред await рдХреЗрд╡рд▓ async рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ Future / IntoFuture рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирдП рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рд╡рд┐рд╢реЗрд╖рддрд╛ред

@novacrazy , @richardanaya

рд╣реБрдб рдХреЗ рддрд╣рдд рдЗрди рдЬрдирд░реЗрдЯрд░ рд╕реНрдкреЗрдЧреЗрдЯреА рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЪрд░рдо рд╢реЙрд░реНрдЯрд╣реИрдВрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдпрджрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рди рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреБрд╕реНрдЦрд╛ рд╣реИред

@ рдиреЛрд╡рд╛рдХреНрд░реЗрдЬреА рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБ, рдЕрдм рдЬрдм рдЖрдк рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдкреВрд░реНрд╡ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдХрднреА рднреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ

рд╕рдВрдпреЛрдЬрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ Rusts рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреБрдг рдФрд░ рд╢рдХреНрддрд┐рдпрд╛рдВ рд╣реИрдВред рдЖрдк рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ async рдмреНрд▓реЙрдХ рдЬреИрд╕реА рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВред рдЖрдЗрдП рдЗрд╕ рдереНрд░реЗрдб рд╕реЗ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдЪрд░реНрдЪрд╛ рдЫреЛрдбрд╝реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорджрджрдЧрд╛рд░ рдирд╣реАрдВ рд╣реИред

@ I60R

рдореЗрд░реЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ async рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЫрд┐рдкрд╛рдПрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рдореИрдВ рд╕рднреА рд╕рдВрджрд┐рдЧреНрдз рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдбрд░-рд╕реНрдЯрд╛рдЗрд▓ рдЪреЗрди рдХреЗ рдЕрдВрджрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЖрдк рд╕рд╕реНрдкреЗрдВрдб рдкреЙрдЗрдВрдЯ рдЫрд┐рдкрд╛ рдирд╣реАрдВ рд╕рдХрддреЗред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рд╡рд╣ рдЕрдиреНрдп рд╡рд╛рдпрджрд╛ рдмрдирд╛ рд░рд╣реА рд╣реИред рдХрд┐рд╕реА рд╕рдордп рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ C # рдореЗрдВ рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдПрдХ рдЙрдкрд╕рд░реНрдЧ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрд╕реЗ (рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж) рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ ? рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкреВрд░реНрд╡рддрд╛ рдФрд░ рджреЛ рд╕рдорд╛рди "рдбреЗрдХреЛрд░реЗрдЯрд░" рд╣реЛрдиреЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдЕрдЬреАрдмрддрд╛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкрдХреНрд╖реЛрдВ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

@ Matthias247 рдпрджрд┐ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХрдИ await рдХрдердиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрдИ рдмрд╛рд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд░рдЦрддреЗ рд╣реИрдВред рдХрднреА-рдХрднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдлрд┐рд░, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢рдХреНрддрд┐ рдЪреАрдЬреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд╣реИред рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдПрдХ рд╕рд╣реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рд╕рдм рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдареАрдХ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рд╕реЗ рдЖрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдпреЛрдЧреНрдп, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдФрд░ рдкрдардиреАрдп рдХреЛрдб рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд╕рдордп рдХрд╛ 80% рдореБрдЭреЗ рд╢рдХ рд╣реИ рдХрд┐ рдореИрдВ async / await рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреНрдпрд╛ рд╣реИ, рд╕рд┐рд░реНрдл рд╕рд╛рджреЗ рд╡рд╛рдпрджрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдмрд╕реЗ рд╕реНрдерд┐рд░ рдФрд░ рдкреНрд░рджрд░реНрд╢рдирдХрд╛рд░реА рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЙрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб await рдФрд░ / рдпрд╛ рдорд┐рд╢реНрд░рд┐рдд рдореИрдХреНрд░реЛ await!(...) / .await!() рд╕рдмрд╕реЗ рдкрдардиреАрдп, рдкрд░рд┐рдЪрд┐рдд рдФрд░ рдЖрд╕рд╛рди рдбрд┐рдмрдЧ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред

@andreytkachenko

рдореИрдВрдиреЗ рдЖрдкрдХреА рдкреЛрд╕реНрдЯрд┐рдВрдЧ рджреЗрдЦреА рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдм рдЬрдм рдореИрдВ "рдкрд░рд┐рдЪрд┐рдд" рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ:

  1. рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдРрд╕реА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣рд╛рдБ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕рдореБрджрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реА WASM рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред

  2. рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рдЪрд┐рддрддрд╛ рдХреЛрдб рдХреЛ рдЙрди рджреЗрд╡реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛ рд░рд╣реА рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдХрднреА-рдХрднреА рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдЯ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдкрд╣рд▓реВ async рдХреЛрдб LOOK рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрд╛рдд рд╣реИ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд▓рдВрдмреА рд╣реИ, рдлрд┐рд░ рд╢реНрд░реГрдВрдЦрд▓рд╛рдПрдВ рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рджреЗрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рджреЗрд╢реА рджрд┐рдЦрддреА рд╣реИрдВред

рдПрдХ рдмрд╛рдд рдореИрдВ рдЕрдкрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ async рджрд┐рдиреЛрдВ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдБ, рдЬреЛ рдХрд┐ рдкреВрд░реНрд╡рд╡реНрдпрд╛рдкреА рдореЗрдВ рдПрдХ рджреЗрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдерд╛, рдЬреЛ рд╕рдореВрд╣ рдХреЗ рд╡рд╛рджреЛрдВ / рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдереАред Promise.all (p1 (), P2 ()) рддрд╛рдХрд┐ рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рдо рдХреЛ рд▓рдВрдмрд┐рдд рдХрд░ рд╕рдХреВрдВред рддрдм () рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЕрддреАрдд рдХреЗ рд╡рд╛рджреЗ рдХреА рдПрдХ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ рдереА, рд▓реЗрдХрд┐рди рдЕрдм рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреБрд░рд╛рддрди рдФрд░ рдЬрд░реВрд░реА рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВред

рдореИрдВ рд╢рд╛рдпрдж рдЗрдВрддрдЬрд╛рд░ рдХреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛ред "Async рдХреЛрдб рдФрд░ рд╕рд┐рдВрдХ рдХреЛрдб рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ"

@novacrazy async рдлрд╝рдВрдХреНрд╢рди рдПрдХ Future рдкреНрд░рдХрд╛рд░ рджреЗрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдХреНрдпрд╛ рд╣рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрджреНрдзрддрд┐ рдХреЛ Future рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ? рдЗрд╕ рддрд░рд╣ :

pub fn await(self) -> Self::Output {
    await self
}
...

@XX рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, Rust рдореЗрдВ async рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдПрдХ рдЕрдЪреНрдЫреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИред рддреЛ await рдПрдХ рдХреА рдЬрд░реВрд░рдд рд╣реИ async рддреЛ рд╕рдВрдХрд▓рдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрди рджреЛрдиреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред await async рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

Future рдПрдХ рд╣реИ wait рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдЖрдк рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдмреНрд▓реЙрдХ рд╡рд░реНрддрдорд╛рди рдзрд╛рдЧрд╛ред

@ рднрд╛рдбрд╝рд╛ ,

рд▓реЗрдХрд┐рди рдХреЛрдб рд╢реИрд▓реА рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ? рдореИрдВ рдЙрд╕реА рдХреЛрдб рдореЗрдВ рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдЬрдВрдЬреАрд░ рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдбрд┐рдмрдЧрд░ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рдмрдЧрд░ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреЛрдб рдореЗрдВ рдирд╣реАрдВред

@skade , @ Matthias247 , @XX

рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдЪреЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдПрдХ рдирд┐рд▓рдВрдмрд┐рдд рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ред рдЕрдиреНрдп рд╕рднреА рдЕрдВрджрд░ рдирд┐рд╣рд┐рдд рд╣реЛрдЧрд╛ред рдпрд╣ рдареАрдХ рд╡реИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ mut рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реИ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд░реБрд╕реНрддрдо рдореЗрдВ рднреНрд░рдо рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдмрд┐рдВрджреБ рдерд╛ред рдХреБрдЫ рдПрдкреАрдЖрдИ рд╡рд╛рдпрджрд╛ рд▓реМрдЯрд╛рдПрдВрдЧреЗ рдЬрдмрдХрд┐ рдЕрдиреНрдп рд╡рд╛рдпрджрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдВрдЧреЗ - рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рд╕рд╕реНрдкреЗрдВрд╢рди рдкреЙрдЗрдВрдЯ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрдВрдкреЛрдЬрд┐рдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕реЗ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдЧрд╛

@ I60R let рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдФрд░ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдВрдХреНрд╢рди рдмрд┐рдВрджреБ рд╣реИрдВред

@novacrazy

рдЗрд╕рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ async рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ impl Future + Async рдХреЗ рдмрдЬрд╛рдп impl Future ред

@рд╕реНрдХреЗрдб рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдореЗрдердб рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ . рдмрд┐рд▓рдХреБрд▓ рдЙрд╕реА рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ

@dpc

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ C # рдореЗрдВ рдЖрдк рдЙрддрдирд╛ рдЬрдВрдЬреАрд░ / рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдЬрд┐рддрдирд╛ рдЖрдк рдЬрдВрдЧ рдореЗрдВ рдХрд░реЗрдВрдЧреЗред рдпрд╛ рдореИрдВ рдЧрд▓рдд рд╣реВрдБ? рдпрд╣ C # devs / users рдХреЗ рдЕрдиреБрднрд╡реЛрдВ рдХреЛ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдпрд╣ Rust рдХреЗ рд▓рд┐рдП рднреА рд▓рд╛рдЧреВ рд╣реЛред рдХрд╛рд╢ рд╣рдо Ocaml рдпрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде рд╡рд┐рдкрд░реАрдд рдХрд░ рд╕рдХрддреЗред

рддреБрдо рдЬрд┐рддрдиреЗ рд░реБрд╕реНрддрдо рд╣реЛ рдЬрд╛рдУред рдХрд┐рд╕реА рднреА LINQ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЖрдк рдЗрд╕реЗ рджреЗрдЦреЗрдВрдЧреЗред

рд╡рд┐рд╢рд┐рд╖реНрдЯ async рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

async Task<List<IGroping<int, PageMetadata>>> GetPageMetadata(string url, DbSet<Page> pages)
{
    using(var client = new HttpClient())
    using(var r = await client.GetAsync(new Uri(url)))
    {
        var content = await r.Content.ReadAsStringAsync();
                return await pages
                   .Where(x => x.Content == content)
                   .Select(x => x.Metadata)
                   .GroupBy(x => x.Id)
                   .ToListAsync();
    }
}

рдпрд╛, рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп

let a = await!(service_a);
let b = await!(some_method_on(a, some, other, params));
let c = await!(combine(somehow, a, b));

рдЖрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк рдЗрд╕реЗ рдПрдХ рдЪрд░ рдкрд░ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ рдЬрдм рдЖрдк рдЙрдзрд╛рд░рдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХрд░рддреЗ рд╣реИрдВред


рдореИрдВ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╛рдпрджрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдкрд░рд┐рдгрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ let a = await!(service_a)? ред рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд╣рд╛рдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡рд┐рдХрд▓реНрдк рдмреЗрд╣рддрд░ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдБ рд▓рд╛рдн рджреЗрдЦ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рднреА рд╡рд┐рдкрдХреНрд╖ рдХреЛ рдорд╛рдд рджреЗрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдХрд╛рд░рдг: impl Add for MyFuture { ... } рдФрд░ let a = await a + b; рдХреНрдпрд╛ рд╣реИ?

рдореИрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ ред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

let x = (0..10)
    .map(some_computation)
    .collect() : Result<Vec<_>, _>
    .unwrap()
    .map(other_computation) : Vec<usize>
    .into() : Rc<[_]>;

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрдЯ рдХреАрд╡рд░реНрдб рдХреА рддрд░рд╣ рдмрд╣реБрдд:

let foo = alpha() await?
    .beta await
    .some_other_stuff() await?
    .even_more_stuff() await
    .stuff_and_stuff();

рдмреБрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЙрд╕реА рдбрд╛рдЙрдирд╕рд╛рдЗрдб рдХреЗ рд╕рд╛рде:

foo.iter().map(|x| x.bar()).collect(): Vec<_>.as_ref()
client.get("https://my_api").send() await.unwrap().json() await.unwrap()

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЯрд╛рдЗрдк рдПрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдЖрд░рдПрдлрд╕реА рдХреА рдЧреЛрд▓реА рдирд┐рдЧрд▓ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП fut await рдирд┐рдЧрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

BTW, рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ:

fn main() {
    println
    !("Hello, World!");
}

рдлрд┐рд░ рднреА рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рдЗрд╕рдХреА рд╢реВрдиреНрдп рдШрдЯрдирд╛рдПрдВ рджреЗрдЦреАрдВред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдкрдЪрдиреЗ рджреЗрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ @BenoitZugmeyer рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП expr!macro рдпрд╛ expr@macro рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рд╢рд╛рдпрдж expr.macro!() рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╡реЗ рдПрдХ рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рддрджрд░реНрде рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрднреА рднреА рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдЗрдВрддрдЬрд╛рд░ рдХрд░

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рднрд▓реЗ рд╣реА рд╣рдо await рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рдереЗ, рдлрд┐рд░ рднреА рдпрд╣ рдПрдХ рдЬрд╛рджреБрдИ рдПрдХ рд╣реЛрдЧрд╛ (рдЬреИрд╕реЗ compile_error! )ред рд╣рд╛рд▓рд╛рдБрдХрд┐, @jplatte рдФрд░ рдЕрдиреНрдп рд▓реЛрдЧ рдкрд╣рд▓реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рдКрдВрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЙрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдереЗ, рддреЛ рдореИрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рддрдм рдХреЗрд╡рд▓ await рдХреЛ рдПрдХ рдЬрд╛рджреБрдИ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдВ рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдЦреБрдж рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

lexing

рд▓реЗрдХреНрд╕рд┐рдВрдЧ / рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ рд╣рдо expr!macro , рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ expr! рдирд╛рдордХ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреБрдЫ рдЕрдорд╛рдиреНрдп рдЕрдХреНрд╖рд░реЛрдВ macro рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, expr!macro рдПрдХ рдХреЗ рдПрдХ рдЕрдЧреНрд░рджрд░реНрд╢реА рджреНрд╡рд╛рд░рд╛ рд▓реЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬрдм рд╡рд╣рд╛рдБ рдПрдХ рдХреБрдЫ рдПрдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ expr рд╕реЗ рдПрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ ! , рд╕реАрдзреЗ рджреНрд╡рд╛рд░рд╛ рдкреАрдЫрд╛ identifier ред рдореИрдВ рдПрдХ рднрд╛рд╖рд╛ рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдХреНрд╕рд┐рдВрдЧ рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдорд╛рдиреВрдВрдЧрд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ expr!macro рдХрд╛ рд░реВрдк рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛?

рдореЗрд░реЗ рд╕рд┐рд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рдореИрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЗрди рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рд╣реВрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрди рд╕рднреА рдХреЛ рдХрд╕реНрдЯрдо рдореИрдХреНрд░реЛрдЬрд╝ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕реВрдЪреА рд╕реБрдкрд░ рд╕рд╣рд╛рдпрдХ рд╣реИред

  • stream!await_all : рдзрд╛рд░рд╛рдУрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  • option!or_continue : рдЬрдм option рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рддреЛ рд▓реВрдк рдЬрд╛рд░реА рд░рдЦреЗрдВ
  • monad!bind : =<< рдмрд┐рдирд╛ рдХрд┐рд╕реА рдирд╛рдо рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд┐рдП

stream!await_all

рдпрд╣ рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рд╡рд╛рдпрджрд╛ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕реНрдЯреНрд░реАрдо рднреА рдХрд░рддрд╛ рд╣реИред

event_stream("ws://some.stock.exchange/usd2eur")
    .and_then(|exchange_response| {
        let exchange_rate = exchange_response.json()?;
        stream::once(UpdateTickerAction::new(exchange_rate.value))
    })

рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ ( async -рд╕реНрдЯреЙрдХ-рдПрд╕реНрдХ рдмреНрд▓реЙрдХ рдореЗрдВ):

let exchange_rate = event_stream("ws://some.stock.exchange/usd2eur")
    !await_all
    .json()?;

UpdateTickerAction::new(exchange_rate.value)

option!or_continue

рдпрд╣ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ None , рддреЛ рд▓реВрдк рдЬрд╛рд░реА рд░рдЦреЗрдВред

loop {
    let event = match engine.event() {
        Some(event) => event,
        None => continue,
    }
    let button = match event.button() {
        Some(button) => button,
        None => continue,
    }
    handle_button_pressed(button);
}

рдЗрд╕рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛:

loop {
    handle_button_pressed(
        engine.event()!or_continue
            .button()!or_continue
    );
}

monad!bind

рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдХрд╛рдлреА рджреЗрд╣рд╛рддреА (рдпрд╛рдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗрдВрджреНрд░рд┐рдд) рддрд░реАрдХреЗ рд╕реЗ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд░рд╕реНрдЯ рдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдореЛрдирд╛рдбреНрд╕ рдЬреИрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдореИрдВ рдЙрди рдкрд░ рдирд╣реАрдВ рдмреЗрдЪрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд░рд╕реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдлрд┐рд░ рднреА, рдЕрдЧрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдерд╛, рддреЛ рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд┐рдпрд╛ред

nameDo :: IO ()
nameDo = do putStr "What is your first name? "
            first <- getLine
            putStr "And your last name? "
            last <- getLine
            let full = first ++ " " ++ last
            putStrLn ("Pleased to meet you, " ++ full ++ "!")

рдХреЗ рд▓рд┐рдП eqivalent рд╣реЛрдЧрд╛:

do {
    putStr("What is your first name? ")!bind;
    let first = getLine()!bind;
    putStr("And your last name? ")!bind;
    let last = getLine()!bind;
    let full = first + " " + &last
    putStrLn("Pleased to meet you, " + &full + "!")!bind;
}

рдпрд╛, рдХрдо let s рдХреЗ рд╕рд╛рде, рдЕрдзрд┐рдХ рдЗрдирдмрд┐рд▓реНрдб:

do {
    putStr("What is your first name? ")!bind;
    let first = getLine()!bind;
    putStr("And your last name? ")!bind;
    putStrLn(
        "Pleased to meet you, " + &first + " " + &getLine()!bind + "!"
    )!bind;
}

рдореВрд▓реНрдпрд╛рдВрдХрди

рдореИрдВ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реВрдВред рдореЗрд░реЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХрд╛ рдЧрдгрд┐рддрдЬреНрдЮ рд╣рд┐рд╕реНрд╕рд╛ await рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдорд╕реНрддрд┐рд╖реНрдХ рдХрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ рд╕реЛрдЪрддрд╛ рд╣реИ: рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рд╕реЗ рдХреНрдпреЛрдВ рдкрд░реЗрд╢рд╛рди рд╣реЛрдВ рдЬрд┐рд╕рдХрд╛ рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рди рд╕рдордЭреЗред

рд╣рд╛рд▓рд╛рдВрдХрд┐, ? рдФрд░ await , рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реБрдкрд░ рдЙрдкрдпреЛрдЧреА рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрди рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдвреВрдВрдврддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╢рд╛рдпрдж рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ? рдпрджрд┐ рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЬрдВрдЧ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдордиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╣рд░ рдмрд╛рд░ рдПрдХ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдЖрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╕рдВрднрд╡рддрдГ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрд╛рд╖рд╛ рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рд╕реНрдлреБрдЯрд┐рдд рдХрд░реЗрдЧрд╛ред

рдЖрдк рд▓реЛрдЧ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

@EyeOfPython

рдореИрдВ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдпрд╛ рд╣реВрдВ, рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЬрдВрдЧ рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рд╕рдордп рдХреА рдмрд╛рдд рд╣реИред
рдореИрдВ рд╣рд░ рдмрд╛рд░ ndarray рд╕реНрд▓рд╛рдЗрд╕рд┐рдВрдЧ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ:

let view = array.slice(s![.., ..]);

рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛

let view = array.slice![.., ..];
// or like you suggested
let view = array!slice[.., ..];
// or like in PHP
let view = array->slice![.., ..];

рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ _with рдпрд╛ _else рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕:

opt!unwrap_or(Error::new("Error!"))?; //equal to .unwrap_or_else(||Error::new("Error!"));

@EyeOfPython @andreytkachenko рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд░рд╕реНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ IMHO рдХреЛ рдПрдХ рдкреВрд░реНрдг RFC + FCP + рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЪрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдпрд╣ рдПрдХ RFC рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрд╡реАрдХреГрдд RFC рдХреА рдЪрд░реНрдЪрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдпрд╛ рдЙрдиреНрд╣реЗрдВ async рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рдирд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИред рдпрд╣ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдФрд░ рджреЗрд░реА рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реНрдпрд╛рдкрдХ рдЪрд░реНрдЪрд╛ рдкрд░ рдЕрдВрдХреБрд╢ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ _not_ рдЙрдирдХреЗ рдпрд╣рд╛рдБ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд╣рд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмрд╕ рдХреБрдЫ рд╕реЛрдЪрд╛: рдЬрдмрдХрд┐ рдпрд╣ рдзрд╛рдЧрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ await , рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рдбрд╝рдХ рдХреЗ рдиреАрдЪреЗ yield рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЬрдВрдЬреАрд░ рд╣реЛ рд╕рдХрддреА рд╣реИред Inasmuch рдореИрдВ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдБрдЧрд╛ рдЬрд┐рд╕реЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рджрд┐рдЦрддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреЗ рдореЗрд░реЗ рдХрд╛рд░рдг:

  1. рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдХреЛрд░ рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ рдПрдХ рдУрд╡рд░рдХрд┐рд▓ рд╣реИ
  2. рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рддреБрд░рдВрдд рдХрд╕реНрдЯрдо рдСрдкрд░реЗрдЯрд░реЛрдВ рдпрд╛ рдЕрдиреНрдп рдЕрдЯрдкрдЯреА рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрд░реБрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЦрд░рд╛рдм рдХреЛрдб рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ
  3. рд╡реЗ рдЙрдЪрд┐рдд рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдВрдЧреЗ:

    • stream.await_all рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ

    • option.or_continue рдФрд░ _else рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ, рдЬреЛ рдирдХреНрд╖рддреНрд░ рд╕рдВрдЪрд╛рд▓рдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ

    • monad.bind if-let рдЪреЗрди рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ

    • ndarray slicing const рдЬреЗрдирд░рд┐рдХ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ

  4. рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ? рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдХреЗ рддрд╣рдд рд░рдЦреЗрдВрдЧреЗ

@collinanderson

рдЗрд╕реА рддрд░рд╣ рдЬрдВрдЬреАрд░ рд╕реЗ рдЬрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдкреГрдереНрд╡реА рдкрд░ рдЖрдкрдХреЛ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдкреАрдЫрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рд╢реВрдиреНрдп рдШрдЯрдирд╛рдПрдБ, рдКрдкрд░ println рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ред

@Pixix рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЕрдВрддрддрдГ Generator::resume рдХрд╛ рдореВрд▓реНрдп рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ yield expr рдХрд╛ рдЧреИрд░- () рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ред

@vlaff рдореБрдЭреЗ рдЯрд╛рдЗрдк рдЕрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдЕрдиреБрд░реВрдк await рддрд░реНрдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╡реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯрд╛рдЗрдк рдЕрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдмрд╛рд░-рдмрд╛рд░ рдЖрдЬрд╝рдорд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ _this_ рдПрдХ рдЗрд╕реЗ рдмрдирд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди TA рдПрдХ тАЛтАЛрднрд╛рд╡реА RFC рд╣реИ рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рд╕реНрд╡реАрдХреГрдд рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рд╣реИред

рдХрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рдирд╛, рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рд░рд╛рдВрд╢ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП! ... (...) рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрджрд░реНрд╢ рдорд╛рд░реНрдЧ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:

  1. рдпрд╣ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ
  2. рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ! ... (...) https://github.com/alexcrichton/futures-await рдФрд░ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ
  3. рдЪреВрдВрдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдЯреЗрдмрд▓ рдкрд░ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрднреА рднреА рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ!" рдПрдХ рдЧреИрд░ рдорд╛рдирдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ RFC рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднреА рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ
  4. рдпрд╣ рд╕рдореБрджрд╛рдп рдХреЛ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рд╕рд╛рд░ рд╕реНрдерд┐рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рджрд┐рд╢рд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордп рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрджрд░реНрд╢ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗред рдХреЛрд╢рд┐рд╢! ()
  5. рдЖрдЧрд╛рдореА рдкреИрджрд╛рд╡рд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдкреИрдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ! () рдЬрдм рддрдХ рд╣рдо рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рдЙрдкрдЬ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░ рд╕рдХреЗ
  6. рдЬрдВрдЬреАрд░ рдЙрддрдиреА рдореВрд▓реНрдпрд╡рд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рдЬрд┐рддрдиреА рдХрд┐ рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХрдИ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╣реЛрдиреЗ рд╕реЗ рднреА рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  7. рдЖрдИрдбреАрдИ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
  8. рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рд╢рд╛рдпрдж рдПрдХ рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдлреЗрдВрдХ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛! ... (...) рдореИрдХреНрд░реЛ рдЕрдиреНрдп рдореИрдХреНрд░реЛ usages (рдХрдо рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдмреЛрдЭ) рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж
  9. рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рд╕рднреА рд░рд╛рд╕реНрддреЛрдВ рдореЗрдВ рд╕реЗ рдпрд╣ рд╕рдмрд╕реЗ рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ рдкрде рд╣реИ

рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ! рдореИрдХреНрд░реЛ рдпрд╣рд╛рдВ рдкрд░ рдПрдХ рдЬреИрд╕рд╛ рд╣реИ, рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдкреАрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВ, рдЙрддрдирд╛ рдЕрдзрд┐рдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

let a = foo await;
let b = bar await?;
let c = baz? await;
let d = booz? await?;
let e = kik? + kek? await? + kuk? await?;
// a + b is `impl Add for MyFuture {}` which alises to `a.select(b)`

рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдкрдардиреАрдпрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред ? рдФрд░ рд╕рдВрднрд╡ рднрд╡рд┐рд╖реНрдп рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╛рдХрд░рдг рдХрд╛ рд▓рд╛рдн рдЗрд╕реЗ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЦреНрдп рдХрд╛рд░рдг await рдПрдХ рдЕрд▓рдЧ рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдирд╣реАрдВред рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╛рда рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдЖрдХрд░реНрд╖рдг рдФрд░ рд╕реНрдерд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@Pzixel , @HeroicKatora , @skade

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ рдкрд╛рдпрдерди yield рдФрд░ yield from рднрд╛рд╡: рд╡рд╣рд╛рдБ рдмрд╛рд╣рд░реА рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ yield рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдмрди рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ @valff рдХрд╛ рдорддрд▓рдм рд╣реИ, рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрд╕рд▓рд┐рдП, yield ! рдпрд╛ () рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рднреА рд╣реЛрдЧрд╛ред

рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдмрд┐рдВрджреБ рд╕реЗ, рджреЛрдиреЛрдВ yield рдФрд░ await рдЗрд╕реЗ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ (рдЕрдВрддрддрдГ) рдПрдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Inasmuch рд╡реЗ рдПрдХ рд╣реА рд╕рд┐рдХреНрдХреЗ рдХреЗ рдХреЗрд╡рд▓ 2 рдкрдХреНрд╖ рд╣реИрдВред

рдФрд░ рдПрдХ рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, _square- рдХреЛрд╖реНрдардХ-рд╕рд╛рде-рдХреАрд╡рд░реНрдб_, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП yield рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ):

let body: MyResponse = client.get("http://api").send()[yield]?.into_json()[yield]?

"рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб" рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рд╡реНрд╣реЙрдЯреНрд╕рдПрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рднрд╡рд┐рд╖реНрдп рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ await рднреА рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 'рдирд╣реАрдВред' рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ await рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ await рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╛ рд╡рд┐рдзрд┐ рдХреЗ @XX рд╕реБрдЭрд╛рд╡ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ await self рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рд╛рде рдЪреАрдЬреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рд╢рд╛рдпрдж рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдирд╛рдо await рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ wait рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рд╣реЛрдЧрд╛ред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ рд╢рд╛рдпрдж рдкреНрд░рддреАрдХреНрд╖рд┐рдд-рдкреНрд░рддрд┐-рдкрдВрдХреНрддрд┐ рдмрдирд╛рдКрдВрдЧрд╛ рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЗрддрдиреА рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдПрдВ рдХрдо рдкрдардиреАрдп рд▓рдЧрддреА рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

[рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ] рдореИрдВ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ wait рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд╕реЛрдЪрд╛ рдерд╛ред

@roland рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реНрдпрдВрдЬрдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/57640#issuecomment -456023146

@rolandsteiner рддреЛ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ

let body: MyResponse = client.get("http://api").send() await?.into_json() await?;

рдЬрдм рдореИрдВ рдЗрд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛:

let response = client.get("http://api").send() await?;
let body: MyResponse = response.into_json() await?;

@ рдПрд╕реНрдбреЗ рдУрд╣, рдЖрдкрдХрд╛ рдорддрд▓рдм рдПрдХ рдЕрд▓рдЧ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдерд╛ рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред : Stuck_out_tongue:

@Pixix рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЕрдВрддрддрдГ Generator::resume рдХрд╛ рдореВрд▓реНрдп рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ yield expr рдХрд╛ рдЧреИрд░- () рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, yield ! рдпрд╛ () рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рднреА рд╣реЛрдЧрд╛ред

@valff , @rolandsteiner рдореБрдЭреЗ рдпрд╣ рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ yield рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХрд╛ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ / рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╖реНрдЯрдкреНрд░рдж рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдореВрд▓ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдиреЗ рдЗрд╕ рддрд░реНрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб gen arg рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдХреБрдЫ рдРрд╕рд╛ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдИрдПрдордУ рдХреЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЕрдзрд┐рдХ рд╣реИред рджреЗрдЦрдиреЗ рдХреЗ рдЙрд╕ рдмрд┐рдВрджреБ рд╕реЗ yield рдЕрднреА рднреА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА () рдЗрд╕рд▓рд┐рдП рдХреА рдЪрд░реНрдЪрд╛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП await рдЬреНрдпрд╛рджрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ await рдпрд╛ рддреЛ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ async (рдФрд░ рдореБрдЭреЗ yield рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдкрд╕рд░реНрдЧ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ)ред рдпрд╛ рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ, рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рдпрд╣рд╛рдБ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдмрд┐рдХреЗрд╢рд┐рдВрдЧ рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ: рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд░рд╕реНрдЯ рдХрд╛ рдХреЛрдИ рджреВрд╕рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ? рдпрд╣ рднрд╛рд╖рд╛ рдХреЛ рдЗрддрдирд╛ рдЕрдЬреАрдм рдмрдирд╛ рджреЗрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╛рдпрджрд╛ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдВрдЬреАрд░ рдХрд╛ рдЗрдВрддрдЬрд╛рд░? рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдПрдХ рдРрд╕рд╛ рднрд╡рд┐рд╖реНрдп рдЬреЛ рдПрдХ рдирдпрд╛ рднрд╡рд┐рд╖реНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рдореБрд╣рд╛рд╡рд░рд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рдирд╛рдЧрд░рд┐рдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ:

  1. рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдУ (рдпрд╛рдиреА foo.await() )ред рдпрд╣ рдПрдХ рдЕрдЬреАрдм рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рд╣рдо рдЙрд╕рдХреЗ рд╕рд╛рде рднреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
  2. рдпрджрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдХреАрд╡рд░реНрдб / рд▓реЙрд▓реАрдкреЙрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкреНрд░рд╢реНрди рдкрд░ рд╕рдордЭреМрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкрдиреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рд╕реНрдерд┐рддрд┐ рдореЗрдВ await рд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реВрдВред

рдЙрдкрд╕рд░реНрдЧ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдЖрдк рдпрд╣ рдирд╣реАрдВ рдХрд╣рддреЗ рдХрд┐ "рдореИрдВ рдЖрдкрдХреЗ рдЖрдЧрдорди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реВрдВрдЧрд╛"ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрд╛ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдореИрдВ рдереЛрдбрд╝рд╛ рдкрдХреНрд╖рдкрд╛рддреА рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред

рдореИрдВ рдпрд╣ рднреА рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ await -рдЙрдиреНрдирдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдкрд░ async/await рдХрд╛ рдореВрд▓реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдирдХ рд░реВрдк рд╕реЗ if , match , et cetera рдЬреИрд╕реЗ рдорд╛рдирдХ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рд╡реИрд╕реЗ рднреА рдЕрдкрдиреЗ рдЗрдВрддрдЬрд╛рд░ рдХреЛ рддреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЪрд▓реЛ async/await рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рджреВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рди рдХрд░реЗрдВ, рдпрд╣ рднрд╛рд╖рд╛ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдзрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдпрд╛рдиреА foo.await() ) IMO рднреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИ рдФрд░ рдмрд╣реБрдд рдЬрд╛рджреБрдИ рд╕реЗ рдЖрддрд╛ рд╣реИред proc-macro рдорд╢реАрдирд░реА рдЬрдЧрд╣ рдореЗрдВ рд╣реИ, рдЗрд╕рдХреЗ рдкреАрдЫреЗ рдЙрд╕рдХрд╛ рднреЗрд╕ рдХреНрдпреЛрдВ рдирд╣реАрдВ?

рдлрд╝рдВрдХреНрд╢рди рдбрд┐рдлреЗрдВрд╕ рдореЗрдВ async рд╡рд┐рдкрд░реАрдд await рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

await fn foo(future: impl Future<Output = i32>) -> i32 {
    future
}

рдпрд╣ await fn рдХреЗрд╡рд▓ async рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

async {
    let n = foo(bar());
}

рдФрд░ let n = (await foo(bar())); рдЙрддрд░рддрд╛ рд╣реИред
рддрдм await рдХреАрд╡рд░реНрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, Future await рдкрд╛рд░ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкреЛрдЬрд╝рд┐рд╢рди рдореЗрдВ await рд▓реЙрдЬрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП await -рдорд┐рде рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

async {
    let n = bar().awaited();
}

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ async / await рдЬреЗрдирд░реЗрдЯрд░ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реНрдерд┐рд░) рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

@phaazon рдЬрдирд░реЗрдЯрд░ рдХреЛ async / await рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ Rust рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рд╡рд░реНрддрдорд╛рди рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрднреА рднреА рдПрдХ рдЧреИрд░-рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдЖрд░рдПрдлрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред (рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдпрд╛ рджреЛ рд╕рд╛рд▓ рджреВрд░ рд░рд╣реЗрдВрдЧреЗ, рд╢рд╛рдпрдж async / await рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж RFCed рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡рд╣рд╛рдБ рд░рд╣рд╛ рд╣реИ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдиреБрднрд╡)ред

@XX рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк async рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рддреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдЪрд▓реЛ рдорд╛рдирдХреЛрдВ рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣рддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рд╣рдо рдирд╣реАрдВ?

@ рдереЗрдЬреЛрди рдХреНрдпрд╛ рдЖрдк рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ async рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдХреИрд╕реЗ рддреЛрдбрд╝рддрд╛ рд╣реИ?

рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдПрдВ async рдЙрдкрдпреЛрдЧ рдЙрд╕ рдЪреАрдЬ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреА рд╣реИрдВ рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╣реИ рдФрд░ await рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реА рд╣реИред рдЗрд╕рд▓рд┐рдП await рдмрдЬрд╛рдп async рд╣реЛрдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝реЗ рдЕрдЬреАрдм рд╣реИред

@ рдлрд╝реЗрдЬрд╝рди рдирд╣реАрдВ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрддред рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг:

async fn bar() -> i32 {
    5 // will be "converted" to impl Future<Output = i32>
}

await fn foo(future: impl Future<Output = i32>) -> i32 {
    future // will be "converted" to i32 in async context
}

async {
    let a = await bar(); // correct, a == 5
    let b = foo(bar()); // correct, b == 5
}

let c = foo(bar()); // error, can't call desugaring statement `await foo(bar())`

рдпрджрд┐ рдпрд╣ рдорд╛рдиреНрдп рд╣реИ, рддреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛:

async {
    let n = first().awaited()?.second().awaited()?;
    // let n = (await (await first())?.second())?;
}

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ "рдЬрд╛рджреБрдИ" рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдо рд╡рд┐рдзрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ .await() рдпрд╛ .await!() рдЕрдкрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ Future s рдХреЗ рдкрд╛рд╕ .await() рдпрд╛ .await!() рдкрджреНрдзрддрд┐ рд╣реИ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдореЗрдВ 5 рдорд┐рдирдЯ рдЦрд░реНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рднрд▓реЗ рд╣реА рдЖрдкрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реЛред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рд╣рдо рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдЯреЛрдХрд░рд╛ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдХреНрдпрд╛ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ (рдЕрдкреВрд░реНрдг рдЫрджреНрдордХреЛрдб рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рд╡рд┐рд╡рд░рдгреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдирд╣реАрдВ рд╣реИ):

trait AwaitChainable {
    fn await(self) -> impl Future;
}

impl<T: Future> AwaitChainable for T {
    fn await(self) -> impl Future {
        await self
    }
}

рдЗрд╕ рддрд░рд╣ рд╣рдо рдЪрд╛рд╣реЗрдВ рддреЛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рди рд╣реЛ рдФрд░ рд╣рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИ, рдлрд┐рд░ рднреА рд╣рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реАрдЦрдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@ivandardi рдореИрдВрдиреЗ рдЙрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛

fn await(self) -> impl Future {
    await self
}

рдпрд╣ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ async -context рдореЗрдВ рд╣реА рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@XX рд╣рд╛рдБ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЯреВрдЯреЗ рд╣реБрдП рдЫрджреНрдо рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ: PI рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рд╣реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд▓рдХреНрд╖рдг рдХреИрд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП :( рдмрд╕ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╣ рдЪреАрдЬрд╝ рд▓рд┐рдЦреА рд╣реИ рдЬреЛ рдЗрд╕реЗ async рдореЗрдВ рдХреЗрд╡рд▓ рдХреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рддреА рд╣реИ рд╕рдВрджрд░реНрднреЛрдВред

@XX , @ivandardi рдкреНрд░рддрд┐ рдкрд░рд┐рднрд╛рд╖рд╛, await рдХреЗрд╡рд▓ async рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрд╡реИрдз рд╣реИ:

fn await(self) -> impl Future {
    await self
}

рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

async fn await(self) -> impl Future {
    await self
}

рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ async рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

await future.await()

рдЬреЛ рдкреВрд░реЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдкрд░рд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдХрд╛рдо рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ async рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдирд╛ рд╣реИ, рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред

@ivandardi рдореЗрд░реА рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЗрд╕ рд╡рд┐рдХрд╛рд╕:

fn await(self) -> T { // How to indicate using in async-context only?
    await self
}

`` `рдЬрдВрдЧ
рдкреНрд░рддреАрдХреНрд╖рд┐рдд fn рдкреНрд░рддреАрдХреНрд╖рд╛ (рд╕реНрд╡) -> T {// рдХреНрдпреЛрдВрдХрд┐ async рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдпрд╛ рд╣реБрдЖ рд╣реИ
рд╕реНрд╡рдпрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ
}

```rust
await fn await(self) -> T {
    self // remove excess await
}

@CryZe @XX рддреБрдо рдореБрдЭреЗ рдХреНрдпреЛрдВ

@XX рдЖрдк рдЬреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ await рд╕рдВрджрд░реНрдн рдЬреЛ рдХрд┐ async рд╕рдВрджрд░реНрдн рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЕрд▓рдЧ рд╣реЛ)ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рдмрд╣реБрдд рд╕рдорд░реНрдерди рдорд┐рд▓реЗрдЧрд╛

@EyeOfPython рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ:

async fn await(self) -> impl Future {
    await self
}

рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛:

#[call_only_in_async_context_with_derived_await_prefix]
fn await(self) -> impl Future {
    self
}

рдореИрдВ рдиреАрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЫрджреНрдо рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рдЙрдирдХрд╛ рдХрд╣рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рд░реБрд╕реНрдЯ рдбреНрд░реЙрдк рдФрд░ рдХреЙрдкреА рдХреА рддрд░рд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЧреБрдг рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рднрд╛рд╖рд╛ рд╕рдордЭрддреА рд╣реИ, рдЬреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ () рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдХреА рддрд░рд╣ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡реЛрдЯрд┐рдВрдЧ рдХреЛ RFC рдХреЗ рд▓рд┐рдП рд╡реИрд╕реЗ рднреА рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмрд┐рдВрджреБ рдПрдХ рдЙрджреНрджреЗрд╢реНрдп рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рди рдХрд┐ рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рднрд╛рд╡рдирд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ upvotes / рдбрд╛рдЙрдирд╡реЛрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИ рд╣реИред

рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рдд рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ async рдЗрдВрддрдЬрд╛рд░ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдЗрд╕ рдзрд╛рдЧреЗ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦреЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд RFC рд▓рд┐рдЦреЗрдВред

@CryZe рдпрд╣ рдкреНрд░рдХрд╛рд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕реЗ рдлреНрдпреВрдЪрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╣рдорддрд┐ рд╡реНрдпрдХреНрдд рдХреА рдЧрдИ рдереА рдХрд┐ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрдХ рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ async рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдкрд░ рд▓рдХреНрд╖рд┐рдд рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдЗрдВрдб рдиреЛрдЯреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИред

@ivandari рдЖрдкрдХреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕

@ Matthias247 рд╡реЗ рдЬреЛ рд╕реБрдЭрд╛рд╡ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рдереЗ рд╡рд╣ рдПрдХ рддрд░реАрдХрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред рдЗрд╕ рддрд░рд╣ рд░рд╕реНрдЯ рдХреЛ #, @ рдпрд╛ ... рдЬреИрд╕реЗ рдордирдорд╛рдиреЗ рдирдП рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╣рдордиреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛? рдСрдкрд░реЗрдЯрд░, рдФрд░ рдЕрднреА рднреА рдХрд╛рдлреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рджрд┐рдЦрддреЗ рд╣реИрдВ:

let result = some_operation().await()?.some_method().await()?;

рддреЛ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рдорд╛рди рддрд░реАрдХрд╛ рджреЗрдЦрддрд╛ рд╣реИ (рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рднреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ) рдФрд░ async рдХреЛ рдмрджрд▓рдирд╛ рд╡рд╣рд╛рдВ рд╕реЗ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ рдХреЛрдбред рддреЛ рдлрд┐рд░ рдЖрдкрдХреЗ рдкрд╛рд╕ await some_future()? рд╕рд╛рде рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдмрд╛рдПрдВ рдХреЗ рдмрдЬрд╛рдп рдЙрдЪрд┐рдд рддрд╛рд░реНрдХрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╣реИ рдФрд░ рдЕрдЬреАрдм рдЕрдЬреАрдм рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

(рдЗрддрдирд╛ tl; dr: рдпрд╣ рдПрдХ рдореЗрдердб рдХреЙрд▓ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рд░реНрдл рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рд╣реИ)

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рддреНрд░реБрдЯрд┐ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреА рд╡реНрдпрд╛рдкрдХрддрд╛ рд╣реИред рдпреЗ рд╡реЗ рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдБ рдЬрдВрдЧ рдЙрди рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреА рд╣реИрдВ - рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЯреНрд░реЗрд╕рдмреИрдХ рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ .map_err()? ред

рд╡рд┐рд╢реЗрд╖ рдмрд╛рддреЛрдВ рдореЗрдВ:

let result = await reqwest::get(..).send();
let response = result.map_err(|e| add_context(e))?;
let parser = await response.json();
let parsed = parser.map_err(|e| add_context(e))?;

рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдкрдардиреАрдп рд╣реИ (рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ):

let parsed = reqwest::get(..)
    .send() await
    .map_err(add_context)?
    .json() await
    .map_err(add_context)?;

_even рд╣рд╛рд▓рд╛рдВрдХрд┐_ рдЗрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрд╡рд░реВрдкрдг рдореЗрдВ рдмрд╣реБ-рдЪрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИрдВ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕-рд╡реЗрдЯ рдХреЗ рд╕рд╛рде рдХрдо рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдерд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЕрднреА async рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдБ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдЬреНрдЮрд╛рдирддрд╛ рд╕реЗ рдмреЛрд▓ рд░рд╣рд╛ рд╣реВрдБ, рдХреНрд╖рдорд╛ рдХрд░рдиреЗ рдкрд░ рдЦреЗрдж рд╣реИ - рдпрджрд┐ рдпрд╣ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдЙрдЪрд┐рдд рдПрд░рд░-рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдХрдо-рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдпрд╣ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛ рдЬреЛ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рддреЗ рд╣реИрдВред

рд╣рд╛рдВ, рдореЗрд░рд╛ рдпрд╣реА рдорддрд▓рдм рд╣реИред рдпрд╣ рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

@XX рдпрджрд┐ рд╡рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЬреЛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╕рд┐рд░реНрдл рд╕рддрд╣реА рд╕рдордЭ рд╣реЛред

@ рдХреНрд░рд╛рдп , @XX ,

рдкрд╣рд▓реА рдирдЬрд░ рдореЗрдВ рдпрд╣ рдЪрд┐рдХрдирд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд╕реНрдЯ рджрд░реНрд╢рди рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ sort рдкрджреНрдзрддрд┐ self рдирд╣реАрдВ рд▓реМрдЯрд╛рддреА рд╣реИ рдФрд░ рдЖрд╡рдВрдЯрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рддреЛрдбрд╝рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд╣рд┐рдд рдлреИрд╢рди рдЕрдкреНрд░рднреЗрджреНрдп рдореЗрдВ рдХреБрдЫ рдЧреИрд░-рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рдЪрд╛рдВрд╕ рдирд╣реАрдВ IMOред

рд╣рд╛рдВ, рдореЗрд░рд╛ рдпрд╣реА рдорддрд▓рдм рд╣реИред рдпрд╣ рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рдЪреБрдирдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдПрдХ рд▓рдХреНрд╖реНрдп рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рд░рд╕реНрдЯ рдЕрдиреНрдп рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ break , continue , if , рдЖрджрд┐ рдпрд╛ рддреЛред рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ "рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рд▓реЛрдЧреЛрдВ рдХреА рд░рд╛рдп рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджреЗрдЦреЗрдВред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдореИрдВ рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ await рдХрд╛рдлреА рдЦрд╛рд╕ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдордВрдЧрд▓рд╛рдЪрд░рдг рдирд╣реАрдВ:

  • рдбреАрдмрдЧрд░реНрд╕ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрд░ рдХрджрдо рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреИрдХ рдЦреЛрд▓рдирд╛ рдФрд░ рдкреБрди: рд╕реНрдерд╛рдкрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ C # рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ async рдбрд┐рдмрдЧрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрд╛ред рдФрд░ рдЙрди рдЯреАрдореЛрдВ рдХрд╛ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдбрд┐рдмрдЧрд░реНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ!
  • рд╕реНрдерд╛рдиреАрдп рд╡рд╕реНрддреБрдПрдВ рдЬреЛ рдЗрд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдкрд╛рд░ рдирд╣реАрдВ рдмрдирд╛рддреА рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ OS рд╕реНрдЯреИрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рд╢рдмреНрдж рдЬрд┐рдиреНрд╣реЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрдирд░реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдЕрдВрдд рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реАрдк рдореЗрдореЛрд░реА рдореЗрдВ рдЕрдВрддрд░ рдХрд░ рджреЗрдЧрд╛ (рдЬреЛ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХрд╣рд╛рдБ рд░рд╣реЗрдЧрд╛)ред
  • рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЙрдзрд╛рд░ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрддреНрдкрдиреНрди рд╡рд╛рдпрджрд╛ !Unpin рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдХреБрдЫ рдореМрдЬреВрджрд╛ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдФрд░ рддрдВрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ Unpin async рд╕реЗ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ await s рдЕрджреГрд╢реНрдп рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
  • рдЕрдиреНрдп рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЙрдзрд╛рд░ рдЪреЗрддрд╛рддреЗ рдореБрджреНрджреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЖрдЪреНрдЫрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реИрдВред

@Pixixel @ рд▓рдирд┐рдХреЛрд▓рд╛

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ C # рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ рд╣реИрдВ, рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдХреА рд▓рдВрдмреА-рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдЬреИрд╕рд╛ рдХреБрдЫ рднреА рд╣рдо рдЕрдХреНрд╕рд░ рд░реБрд╕реНрддрдо рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рд╡рд╣ LINQ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рд╕рд┐рд░реНрдл рдПрдХ DSL рд╣реИ, рдФрд░ foo().bar().x().wih_boo(x).camboom().space_flight(); рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рд╕рд╛ рдШреВрдо рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ C # рдХреЛрдб рдЙрджрд╛рд╣рд░рдг 100% рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣ред рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд┐рд░реНрдл рд╡рд╣реА рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓реИрдВрдЧреНрдпреВ рдПрдХреНрд╕ рдиреЗ рдХрд┐рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рдирд╣реАрдВ рд╣реИред

IMO рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдХреЗрддрди рдХреЛрдбрд┐рдВрдЧ рдХреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдВрдЧ рджреЛрдиреЛрдВ рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред

@skade

рдореИрдВ рдЖрдкрдХреА рдХреБрдЫ (рдФрд░ рдЕрдиреНрдп) рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ рдЬреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП - рдЖрдЗрдП рдмрд╕ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХреЗ рдкреНрд░рддрд┐ рдордЬрдмреВрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рд╣реИрдВред

@ Matthias247 рдирд╣реАрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рднреА рдПрдХ рдЦрд╛рд╕ рд╡рдЬрд╣ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдЪрд╛рдЗрдирд┐рдВрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреА рд╣реИред рдФрд░ рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ "рдУрд╣, рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рддрдВрддреНрд░реЛрдВ рдореЗрдВ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?"ред рдЦреИрд░, рдпрд╣ рдПрдХ рдЧрд▓рдд рдЖрдХрд▓рди рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдлреНрд▓реЛ рд╣реИред рд╡реЗ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдХреЙрд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╣реИрдВред Option::unwrap_or рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИред Iterator::filter рдЕрдЧрд░ рдХрдерди рдХреЗ рдмрд╛рдж рдЙрдкрд╕рд░реНрдЧ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рд╣реИред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕реНрд╡рдпрдВ рд╢реНрд░реГрдВрдЦрд▓рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИред рдЙрд╕ рджреГрд╖реНрдЯрд┐ рд╕реЗ, рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬреЛ рд╣реЛрдЧрд╛, рдЙрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдФрд░ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Iterator рдХрд╛рдо рдХреИрд╕реЗ рд╣реЛ рдФрд░ рд╕рд┐рд░реНрдл рдХрдЪреНрдЪреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдХреБрдЫ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдХрдореНрдкреАрдЯрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ Future::await_or ред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрдЯрд┐рдВрдЧ рд╕рд┐рд░реНрдл рджрд┐рдЦрд╛рд╡реЗ рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдЬреАрд╡рди рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред рдЕрдиреНрдпрдерд╛ рд╣рдо рдЕрднреА рднреА try!() рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣реИ рдирд╛?

@dpc

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ C # рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ рд╣реИрдВ, рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдХреА рд▓рдВрдмреА-рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдЬреИрд╕рд╛ рдХреБрдЫ рднреА рд╣рдо рдЕрдХреНрд╕рд░ рд░реБрд╕реНрддрдо рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рд╡рд╣ LINQ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рд╕рд┐рд░реНрдл рдПрдХ DSL рд╣реИ, рдФрд░ foo () (рдмрд╛рд░) (x) (x)ред Wih_boo (x) .camboom ()ред Space_flight () рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ; рдореИрдВрдиреЗ рдПрдХ рдмрд┐рдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЧреБрдЧрд▓реА рдХреА рд╣реИ, рдФрд░ C # рдХреЛрдб рдЙрджрд╛рд╣рд░рдг 100% рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣ред рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рд┐рд░реНрдл рд╡рд╣реА рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓реИрдВрдЧреНрдпреВ рдПрдХреНрд╕ рдиреЗ рдХрд┐рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ (рдЖрдк рдХрд┐рд╕реА рднреА рдврд╛рдВрдЪреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреЛрд▓реА ), рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрдИ рдЬрдВрдЬреАрд░ рдХреЛрдб рджреЗрдЦрддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬреЛ рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рдмрдирд╛рддреА рд╣реИред рдФрд░ рдЗрд╕реЗ Try рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред C # рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ await рдмрд┐рдВрджреБ рдХреЗ рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдкрд╡рд╛рдж рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдкрдЯрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХреЙрд▓рд░ рдХреЗ рд▓рд┐рдП рдЙрдард╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ ? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рднреА await рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдкрдХреЛ "рд╕рдВрдпреБрдХреНрдд" рдСрдкрд░реЗрдЯрд░ await? , рднрд╛рд╖рд╛ рдХреЗ рдирд┐рдпрдореЛрдВ рдЖрджрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдлрд┐рд░ рдЖрдк рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪреАрдЬрд╝реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ (рд╕рд┐рд╡рд╛рдп рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рджреЗрд╢реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕, рд▓реЗрдХрд┐рди рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ?)ред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдзрд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХрдорд╛рддреНрд░ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдЕрдВрддрд░рд┐рдХреНрд╖-рдкреГрдердХ рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ await() рдпрд╛ await!() ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдг рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рд╣реВрдВред рд╕рд╛рдорд╛рдиреНрдп () рд╡рд┐рдзрд┐ред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рдЖрдк .wait () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, (рд╕рдВрднрд╡рддрдГ рд╣рд░реЗ рд░рдВрдЧ рдХрд╛) рдереНрд░реЗрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдкрд╛рд░реНрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рд╕рдордп рдирд┐рд╖реНрдкрд╛рджрди рд░рдирдЯрд╛рдЗрдо рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдереНрд░реЗрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рддреЛ рд╕рднреА рдЗрд░рд╛рджреЛрдВ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЪрд╛рд╣реЗ рдЖрдкрдХреЗ рдкрд╛рд╕ Mutex рдпрд╛ std рдЪреИрдирд▓ рд╣реЛ рдЬреИрд╕реЗ:

let result = my_channel().recv()?.iter().map(...).collect();

рдпрд╛ рдРрд╕рд╛ рднрд╡рд┐рд╖реНрдп:

let result = my_future().await()?.iter().map(...).collect();

рдХреЛрдИ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред рд╡реЗ рджреЛрдиреЛрдВ рдЕрдкрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рд░реАрд╡ () / рд╡реЗрдЯ () рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ рдФрд░ рд╡реЗ рджреЛрдиреЛрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЪреЗрди рдХрд░рддреЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ () рд╕рдВрднрд╡рддрдГ рдПрдХ рдЕрд▓рдЧ рдирд┐рд╖реНрдкрд╛рджрдХ рдкрд░ рдЪрд▓ рд░рд╣реА рд╣реИ рдЬреЛ рдУрдПрд╕ рдХреЗ рднрд╛рд░реА рд╡рдЬрди рдХреЛ рдлреИрд▓рд╛рдиреЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реИ (рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХрд▓ рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЬрдВрдЬреАрд░реЛрдВ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд░рд╣ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рдд: рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд▓рд┐рдкрд┐рдк рд▓рд┐рдВрдЯ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореЗрд░рд╛ рдХрд╣рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рд╕реЗ .recv () рдпрд╛ .await () рдореЗрдВ рдмрд╣реБрдд рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рджреЛрдиреЛрдВ рд╣реА рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред ред рдЗрд╕рд▓рд┐рдП рд╕рднреА рдЗрд░рд╛рджреЛрдВ рдФрд░ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдПрд╕рдЯреАрдбреА рдХреЗ рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд░рдИрд╡реАрд╡реА рдпрд╛ рд▓реЙрдХ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд░рд╕рд░рд╛рд╣рдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреВрд░реЗ рдХреЛрдб рдХреЛ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреА рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд╛рд╖рд╛ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рдЖрд╡рд╢реНрдпрдХ рд╣реИ? рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЬрдВрдЧ рдЦрд╛рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрдХрд▓рдХ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ OS рдереНрд░реЗрдб рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ (рдПрдХ async fn рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдзрд╛рдЧрд╛ рд╕реНрдкреЙрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдлрд┐рд░ рдЙрд╕ рдереНрд░реЗрдб рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛рдПрдЧреА)ред рдЬрдмрдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рд╣реЛрдЧрд╛, рдпрд╣ рд╢рдмреНрджрд╢рдГ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ред рддреЛ рдпрд╣ рддрдереНрдп рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬрдВрдЧ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рджрд▓реАрд▓ рджреВрдВрдЧрд╛ рдХрд┐ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ .await () рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░рд╕реНрдЯрдХ рдХреЛ рд░рд╕реНрдЯреЗрдХ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рдПрдХ рдкреВрд░реНрдг рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ .wait () рд╣реЛрдиреЗ рдХрд╛ рдФрдЪрд┐рддреНрдп рд╕рд┐рджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдкреВрд░реНрдг рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрдВрдЧ рдХреЛ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред

@CryZe .recv() рд╡рд┐рдкрд░реАрдд, рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рд╕реЗ await рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ await рдХреЗ рдЖрдЧреЗ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИ рдФрд░ рдпрд╣реА рд╕рдмрд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ await рдирд┐рд╣рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@ I60R рдпрд╣ рдПрдХ рдЦреЛрдЬрд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╕реЗ рдХрдо рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдЖрдк рдЕрднреА рднреА рдЖрдИрдбреАрдИ рдореЗрдВ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рдереЗред рдпрд╣ рд╕рд┐рд░реНрдл рдХреАрд╡рд░реНрдб рдХреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдореИрдВ рддрд░реНрдХ рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╛рдж рдХрд░рдиреЗ рдореЗрдВ рдХрдо рдЖрд╕рд╛рди рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдареАрдХ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ рдЬрд╣рд╛рдБ рдирд┐рд╖реНрдкрд╛рджрди рд░реБрдХрддрд╛ рд╣реИ)ред

рдкрд╛рдЧрд▓ рд╡рд┐рдЪрд╛рд░: рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ ред рдореИрдВ рдПрдХ рдЕрд▓рдЧ рд╕реВрддреНрд░ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд╕рд░реНрдЧ рдмрдирд╛рдо рдЙрдкрд╕рд░реНрдЧ рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд╣реИред

@CryZe

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдг рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рд╣реВрдВред рд╕рд╛рдорд╛рдиреНрдп () рд╡рд┐рдзрд┐ред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

рдХреГрдкрдпрд╛ https://github.com/rust-lang/rust/issues/57640#issuecomment -4567575 рдлрд┐рд░ рд╕реЗ рдкрдврд╝реЗрдВ

@ Matthias247 рдпреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдмрд┐рдВрджреБ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛ред

рдпрд╣ рд╕рдм рдПрдХ рдлрд╝рдВрдХреНрд╢рди, рд╕рджрд╕реНрдп рдпрд╛ рдЕрдиреНрдпрдерд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдорд╛рдиреНрдп рд╣реИред рдпрд╣ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред

рд╕рдВрдХрд▓рдХ, рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░, рдпрд╣ рдПрдХ рдХреАрд╡рд░реНрдб рдпрд╛ рдореИрдХреНрд░реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рдЬрдирд░реЗрдЯрд░ рдЙрдкрдЬ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ, рдЗрди-рдкреНрд▓реЗрд╕, рдЙрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрд╛рдВрдХрди рдФрд░ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЕрдиреНрдп рд╕рд╛рдорд╛рди рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдпрд╛ рддреЛ рдПрдХ рдЦреЛрдЬрд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЗ, рд▓рдХреНрд╖рдг, рд╕рджрд╕реНрдп рдЗрддреНрдпрд╛рджрд┐, рд╕рднреА рдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд░рдирд╛ рдФрд░ рдЧрд▓рдд рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЦрд╛рд╕рдХрд░ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛред

рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдпрд╛ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рддрд░реАрдХрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рддреА рд╣реИрдВред рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрдЪреНрдЫрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@novacrazy

рдЬрд╛рджреВ рдХреЗ рддрд░реАрдХреЗ, рд▓рдХреНрд╖рдг, рд╕рджрд╕реНрдп рдЗрддреНрдпрд╛рджрд┐, рд╕рднреА рдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд░рдирд╛ рдФрд░ рдЧрд▓рдд рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЦрд╛рд╕рдХрд░ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛред

рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ .await!() рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ

рдПрдХ foo.await!() рдкрдврд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, ESPECIALLY рдЙрдЪрд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЧрд▓рдд рд╕рдордЭреЗ? рдХреНрдпрд╛ рд╣реИ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд (рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд╣рд╕реНрдп рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ):

trait Future {
    fn await!(self) -> Self::Item {
        await self
    }
}

AKA await this_foo рдФрд░ this_foo.await!() рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИрдВред рдЙрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рддрдлрд╣рдореА рдХрд░рдирд╛ рдХреНрдпрд╛ рдЖрд╕рд╛рди рд╣реИ?

рдФрд░ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╡рд┐рд╖рдп рдкрд░: рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛? рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рдпрд╛ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рд▓реЗрдХрд┐рди рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде? рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдкреВрд░реНрд╡, рддреЛ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╡реЗ async рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдареАрдХ рд╣реИред рдФрд░ рдпрджрд┐ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╣реИ, рддреЛ рднреНрд░рдо рдХреЗ рдмрд┐рдирд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдХреЗрд╡рд▓ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ

foo.bar().baz().quux().await!().melo().await!()

рдФрд░ рдЗрд╕реЗ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ

await (await foo.bar().baz().quux()).melo()

@ivandardi

.await!() рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рд╕рдВрднрд╡рддрдГ await!(...) рдЬреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛:

macro_rules! await {
    // prefix
    ($fut:expr) => {...}

    // postfix
    ($self:Self) => { await!($self) }
}

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡рд┐рдзрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдЕрднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХрднреА рднреА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЕрдЧрд░ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ await!(...) рд╕рд╛рде рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рджреЛрдиреЛрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рд╣реЛрдирд╛ рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб await рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рджрд╛рдВрд╡ рд╣реИред

@novacrazy рдореИрдВ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдореЗрд░рд╛ рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рд╣рдореЗрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП await!() рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЬрд╛рддреЗ рд╣реИрдВ рдПрдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдлреЙрд░реНрдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдкрд░ рднреА рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ, рдФрд░ рдЕрдЧрд░ рд╣рдо рднрд╛рд╖рд╛ рдореЗрдВ рдкреВрд░реНрдг рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕рдорд░реНрдерди рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рднрд╛рд╖рд╛ рдореЗрдВ .await!() -рддрджрд░реНрде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрд┐рдВрдбрд╛ рдХреЛ ? рдФрд░ Try рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реБрдЖ: рдЗрд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдХреЗрд╡рд▓ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛, рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдпрд╛ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рддрд░реАрдХрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░рддреА рд╣реИрдВред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ _workable_ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ рддрд░реНрдХ рдпрд╛рдж рд╣реИрдВ, рдФрд░ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдкреНрд░реЗрд░рдХ рдирд╣реАрдВ рдкрд╛рддрд╛:

  • рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рддреА рд╣реИрдВ

    • рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд░рдирд┐рдВрдЧ-рдЕрдк рдирд╣реАрдВ-рдЬрдм рддрдХ- poll рдПрдб рдЪрд▓рдиреЗ-рдлрд┐рд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп await , рдХреНрдпреЛрдВрдХрд┐ рдЬрдВрдЧ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рд╣реИ рднрд╛рд╖рд╛: рд╣рд┐рдиреНрджреА

  • рд▓рд╛рдЗрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓реЛрдЧ await рдХреЛ рджреЗрдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ

    • рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╕реНрдерд╛рди рд╣реИ рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА

    • рдпрд╣ await s рдХреЛ foo(aFuture.await, bFuture.await) рд░реВрдк рдореЗрдВ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдЙрдкрд╕рд░реНрдЧ рдереЗ

    • рдпрджрд┐ рдЖрдк рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЬрдВрдЧ рдореЗрдВ рдПрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ? рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди рдХреЗ _end_ рдХреЛ рд╕реНрдХреИрди рдХрд░ рд░рд╣рд╛ рд╣реИ

рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рднреБрд▓ рдЧрдпрд╛?

рдпрджрд┐ рдмрд╣рд╕ "meh, рд╡реЗ рд╕рднреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╣реА рд╣реИрдВ", рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ "рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдБ, рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ"ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рд╡рд╣рд╛рдВ рд╣реИрдВред

@scottmcm рд╣рд╛рдВ, "

рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрдардиреАрдпрддрд╛, рдкрд░рд┐рдЪрд┐рддрддрд╛, рд╕реНрдерд┐рд░рддрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрддреБрд▓рди рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдореЗрд░рд╛ рдХрдерди рд╕рдЪ рд╣реИ, рдореИрдХреНрд░реЛ await!() рдпрджрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡рд┐рдзрд┐ рдореИрдХреНрд░реЛрдЬрд╝ ( .await!() ) рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рдпрд╛ рдмрд╕ рдПрдХ рдЙрдмрд╛рдК рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб await рдЕрдиреНрдпрдерд╛ред

рдореИрдВ рдмреЛрд░рд┐рдВрдЧ рдХрд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмреЛрд░рд┐рдВрдЧ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрдирдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рд╣рдо рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕реЗ рджреВрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдпрджрд┐ f.await() рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рддреЛ рдореИрдВ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

  1. рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рдпрдо рд╣реИрдВ, рдФрд░ рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдореИрдВ рдордЬрд╝рдмреВрддреА рд╕реЗ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдФрд░ рд╡рд╣рд╛рдБ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ ред рдЬрдВрдЧ рдореЗрдВ, async рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реИ, рд╢реБрд░реБрдЖрдд рдореЗрдВ await рдПрдХ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, f await , рдкреЛрд╕реНрдЯ рдХреАрд╡рд░реНрдб рдлреЙрд░реНрдо рд╣реЛрдЧрд╛ред f.await рдХреНрд╖реЗрддреНрд░ рдкрд╣реБрдВрдЪ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдПрдХ рдЕрдкрд╡рд╛рдж ред f.await!() рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдХрднреА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдХреИрд╕реЗ рдЗрди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рдпрдо рдирд╣реАрдВ рдПрдХ рдмрд╛рд░ рдЕрдкрд╡рд╛рдж рдмрди рдЬрд╛рдПрдЧрд╛ рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

  2. рдЬрдм рдЕрдкрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ ? рд▓реЗрдВ, рдЬрд┐рд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рдирд╣реАрдВред f()?.map() рд▓рдЧрднрдЧ рдЧрдгрдирд╛ f () рдХреА рддрд░рд╣ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдЕрдЪреНрдЫрд╛ рд╣реИ? ? рдпрд╣рд╛рдБ рдЦреБрдж рдХреЛ рд╕рдордЭрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди f await рдореИрдВ рдкреВрдЫрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреНрдпреЛрдВ рд╣реИ ?, f.await рдореИрдВ await рдПрдХ рдлрд╝реАрд▓реНрдб, f.await!() рдореИрдВ рдкреВрдЫрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдХреНрд░реЛ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреНрдпреЛрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ? рд╡реЗ рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдареЛрд╕ / рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

  3. рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реБрдП, рд░реБрд╕реНрдд рдПрдХ рд╕рд┐рд╕реНрдЯрдо рднрд╛рд╖рд╛ рдмрдирдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдВ рдХреЗ рдкреНрд░рдореБрдЦ рдЦрд┐рд▓рд╛рдбрд╝реА, C / C ++ / Go / Java рд╕рднреА рдХреБрдЫ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИрдВред рдореЗрд░рд╛ рдпрд╣ рднреА рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рдЕрдкрдиреЗ рдХрд░рд┐рдпрд░ рдХреА рд╢реБрд░реБрдЖрдд рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ, C / Python / Java рдирд╣реАрдВ рд╣рд╛рд╕реНрдХреЗрд▓, рдЖрджрд┐ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рдЕрдЧрд▓реА рдкреАрдврд╝реА рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд░реВрд╕реНрдЯ рдЕрдкрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛, Rust рдХреЛ рдкрд╣рд▓реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдореЗрдВ рдФрд░ рдлрд┐рд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрддреНрдпрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ рд▓реЗрдХрд┐рди рдПрдХ рдкрд░рд┐рдЪрд┐рдд рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред

  4. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рдпрд╣ рд╕рд┐рд░реНрдл рд╕реНрдкрд╖реНрдЯ рд╣реИ ред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдХреИрд╕реЗ рдЪрд░реНрдЪрд╛ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рджрд┐рд╢рд╛ рд╕реЗ рджреВрд╕рд░реЗ (рдЙрдкрд╕рд░реНрдЧ рдмрдирд╛рдо рдЙрдкрд╕рд░реНрдЧ) рдореЗрдВ рдЪрд▓рддреА рд╣реИ, рдореИрдВрдиреЗ рдПрдХ рдордЬрдмреВрдд рд░рд╛рдп рд╡рд┐рдХрд╕рд┐рдд рдХреА рдХрд┐ await рдХреАрд╡рд░реНрдб рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреАрдЫреЗ рд╣рдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╕рднреА рд░рд╛рдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ рд╣реЛрдЧрд╛:

// syntax below is exactly the same as with prefix `await`
let response = go client.get("https://my_api").send();
let body: MyResponse = go response.into_json();

рдкрд╣рд▓реЗ рдХрджрдо рдкрд░ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рддреНрд░реБрдЯрд┐ рдХреЗ рдмрд┐рдирд╛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрдкрд░рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░реЗрдЧрд╛:

// code below don't compiles because `?` takes precedence over `go`
let response = go client.get("https://my_api").send()?;
let body: MyResponse = go response.into_json()?;

рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рд╣рдо рдЖрд╕реНрдердЧрд┐рдд рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЙрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

// now `go` takes precedence over `?` if present
let response = client.get("https://my_api").go send()?;
let body: MyResponse = response.go into_json()?;

рдмрд╕ рдЗрддрдирд╛ рд╣реАред


рдЕрдм рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:


// A
if db.go is_trusted_identity(recipient.clone(), message.key.clone())? {
    info!("recipient: {}", recipient);
}

// B
match db.go load(message.key)? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .go send()?
    .error_for_status()?;

// D
let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .go send()?
    .error_for_status()?
    .go json()?;

// E
let mut res: Response = client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .go send()?
    .error_for_status()?
    .go json()?;

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.go request(url, Method::GET, None, true)?
        .res.go json::<UserResponse>()?
        .user
        .into();

    Ok(user)
}

// G
async fn log_service(&self) -> T {
   let service = self.myService.foo();
   go self.logger.log("beginning service call");
   let output = go service.exec();
   go self.logger.log("foo executed with result {}.", output));
   output
}

// H
async fn try_log(message: String) -> Result<usize, Error> {
    let logger = go acquire_lock();
    let length = logger.go log_into(message)?;
    go logger.timestamp();
    Ok(length)
}

// I
async fn await_chain() -> Result<usize, Error> {
    go (go partial_computation()).unwrap_or_else(or_recover);
}

/// J
let res = client.get("https://my_api").go send()?.go json()?;

рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХреЗ рд╕рд╛рде рд╕реНрдкреЙрдЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рддрд╣рдд рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ


// A
if db.as is_trusted_identity(recipient.clone(), message.key.clone())? {
    info!("recipient: {}", recipient);
}

// B
match db.as load(message.key)? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .as send()?
    .error_for_status()?;

// D
let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .as send()?
    .error_for_status()?
    .as json()?;

// E
let mut res: Response = client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .as send()?
    .error_for_status()?
    .as json()?;

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.as request(url, Method::GET, None, true)?
        .res.as json::<UserResponse>()?
        .user
        .into();

    Ok(user)
}

// G
async fn log_service(&self) -> T {
   let service = self.myService.foo();
   as self.logger.log("beginning service call");
   let output = as service.exec();
   as self.logger.log("foo executed with result {}.", output));
   output
}

// H
async fn try_log(message: String) -> Result<usize, Error> {
    let logger = as acquire_lock();
    let length = logger.as log_into(message)?;
    as logger.timestamp();
    Ok(length)
}

// I
async fn await_chain() -> Result<usize, Error> {
    as (as partial_computation()).unwrap_or_else(or_recover);
}

/// J
let res = client.get("https://my_api").as send()?.as json()?;


IMO рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣рд░ рдкрд╣рд▓реВ рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ:

Ust рд╕рдВрдЧрддрд┐: рдЬрдВрдЧ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдмрд╣реБрдд рдЬреИрд╡рд┐рдХ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рддреЛрдбрд╝рдиреЗ рдХреА рд╢реИрд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
Integr рдХрдореНрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА: рдЕрдиреНрдп рд░рд╕реНрдЯ рдлреАрдЪрд░реНрд╕ рдЬреИрд╕реЗ рдЪреИрдирд┐рдВрдЧ рдФрд░ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЗрдВрдЯреАрдЧреНрд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ
тЬУ рд╕рд╛рджрдЧреА: рдпрд╛ рддреЛ рдХрдо, рд╡рд░реНрдгрдирд╛рддреНрдордХ, рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдФрд░ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ
тЬУ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп: рд╕реНрдердЧрд┐рдд рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛
тЬУ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг: рддрд╛рддреНрдкрд░реНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХреЙрд▓ рдкрдХреНрд╖ рдкреНрд░реЗрд╖рдг рдХрд╣реАрдВ рдмрд╣рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рд▓реМрдЯрдиреЗ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ
тЬУ рдкрд░рд┐рдЪрд┐рдд: рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд рдкреИрдЯрд░реНрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдХрдо рдЯреНрд░реЗрдбрдСрдлрд╝ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ
тЬУ рдкрдардиреАрдпрддрд╛: рд╕рд╛рджреЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╢рдмреНрджреЛрдВ рдХреЗ рдЕрд░реНрде рдХреЛ рд╡рд┐рдХреГрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
Its рджреГрд╢реНрдпрддрд╛: рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рднреА рдкреНрд░рдЪреНрдЫрдиреНрди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдард┐рди рдмрдирд╛рддреА рд╣реИ
Og рдЕрднрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛: рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреБрдЧрд▓реА рд╣реЛ рд╕рдХрддреА рд╣реИ
тЬУ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрд░рдЦрд╛ рд╣реБрдЖ: рдЧреЛрд▓рдВрдЧ рдЖрдЬрдХрд▓ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ
As рдЖрд╢реНрдЪрд░реНрдп: рдпрд╣ рдЧрд▓рдд рд╕рдордЭрд╛ рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рднреА рд╣реИ
User рд╕рдВрддреБрд╖реНрдЯрд┐: рд╕реАрдЦрдиреЗ рдХреА рдЫреЛрдЯреА рд░рд╛рд╢рд┐ рдХреЗ рдмрд╛рдж рд╣рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реЛрдЧрд╛


рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЬреИрд╕рд╛ рдХрд┐ @ivandardi рдиреЗ рдиреАрдЪреЗ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдмрддрд╛рдпрд╛ рд╣реИ, рдХреБрдЫ рдмрд╛рддреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

1. рд╣рд╛рдБ, рдпрд╣ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдЖрдБрдЦ-рдкрд╛рд░реНрд╕ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдпрд╣рд╛рдБ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдкрдардиреАрдпрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред go рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдпрд╣рд╛рдБ рдХрдо рдмреБрд░рд╛рдИ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд╕рд░реНрдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдЙрдкрд╕рд░реНрдЧ await , рдФрд░ рдЖрд╕реНрдердЧрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ IMO await рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

match db.go load(message.key) await {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

рдЬрд╣рд╛рдВ await рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рджрд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдореМрдЬреВрдж рдХреАрд╡рд░реНрдбреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдмрдВрдз рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХрднреА-рдХрднреА await рдмреНрд▓реЙрдХ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЕрд╡рд░реЛрдзрдХ рднреА рдмрди рд╕рдХрддреЗ рд╣реИрдВред

2. рдЗрд╕реЗ "рдЖрд╕реНрдердЧрд┐рдд рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░" рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЖрд░рдПрдлрд╕реА рдмрдирд╛рдиреЗ, рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ async рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕реЗ async рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рдкреНрд░реЗрд░рдгрд╛ рд╣реЛрдЧреАред

3. "рдЖрд╕реНрдердЧрд┐рдд рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреАрд╡рд░реНрдб рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрдпреЛрдВрдХрд┐:

  • рд▓рдВрдмрд╛ рдХреАрд╡рд░реНрдб рдЪрд░ рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдмреАрдЪ рдЬрдЧрд╣ рдмрдврд╝рд╛рдПрдЧрд╛ рдЬреЛ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдмреБрд░рд╛ рд╣реИ
  • рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╛ рдХреАрд╡рд░реНрдб рдЕрдЬреАрдм рд╡рд┐рдХрд▓реНрдк рд╣реИ
  • рдЬрдм рд╣рдо рд╕рд┐рдВрдХ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП async рдХреЛрдб рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд▓рдВрдмрд╛ рдХреАрд╡рд░реНрдб рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдХреНрд░рд┐рдпрд╛ рд╣реИ

рд╡реИрд╕реЗ рднреА, рдпрд╣ рдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ await рдХреЗ рдмрдЬрд╛рдп go рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж 2022 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВред рдЙрд╕ рд╕рдордп рддрдХ рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдХреАрд╡рд░реНрдб рдпрд╛ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╣рдо рдпрд╣ рднреА рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ await рднреА рдкрдардиреАрдп рдкрд╛рдпрд╛ рд╣реИред

рд╡рд╣рд╛рдБ рдХреЗ рд╕рд╛рде рд╕реНрдкреЙрдЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рддрд╣рдд рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ await рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ go


// A
if db.await is_trusted_identity(recipient.clone(), message.key.clone())? {
    info!("recipient: {}", recipient);
}

// B
match db.await load(message.key)? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .await send()?
    .error_for_status()?;

// D
let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .await send()?
    .error_for_status()?
    .await json()?;

// E
let mut res: Response = client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .await send()?
    .error_for_status()?
    .await json()?;

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.await request(url, Method::GET, None, true)?
        .res.await json::<UserResponse>()?
        .user
        .into();

    Ok(user)
}

// G
async fn log_service(&self) -> T {
   let service = self.myService.foo();
   await self.logger.log("beginning service call");
   let output = await service.exec();
   await self.logger.log("foo executed with result {}.", output));
   output
}

// H
async fn try_log(message: String) -> Result<usize, Error> {
    let logger = await acquire_lock();
    let length = logger.await log_into(message)?;
    await logger.timestamp();
    Ok(length)
}

// I
async fn await_chain() -> Result<usize, Error> {
    await (as partial_computation()).unwrap_or_else(or_recover);
}

/// J
let res = client.get("https://my_api").await send()?.await json()?;


рдпрджрд┐ рдЖрдк рдпрд╣рд╛рдВ рдиреАрдЪреЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ:

  • рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рд╕рдордЭрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдирдИ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рдХреНрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛
  • рдЖрдкрдХреА рд░рд╛рдп рдкрдХреНрд╖рдкрд╛рддрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд╕рд╛рдЗрди рд╡рд╣рд╛рдБ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ
  • рдХрд┐ рдЖрдк рдиреАрдЪреЗ рдПрдХ рд╡реИрдз рдХрд╛рд░рдг рдбрд╛рд▓реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдореМрди рдбрд╛рдЙрдирд╡реЛрдЯ рдмреЗрд╣рдж рд╡рд┐рд╖реИрд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ
  • рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдХрд╛рд░рдг рддрддреНрдХрд╛рд▓ рднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ

@ I60R

рдореИрдВ рдЙрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкрдХрдбрд╝ рд╣реИред

match db.go load(message.key)? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

рдЬреЛ рдХрд┐ рдЖрдВрдЦреЛрдВ рдХреЗ рдкрд╛рд░реЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо db.go рдореЗрд▓ рдЦрд╛рддреЗ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╡рд╣рд╛рдБ рдХреБрдЫ рдФрд░ рд╣реИ рдФрд░ рдЖрдк "рдКрд╣, рдареАрдХ рд╣реИ, рд▓реЛрдб db рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ"ред IMO рдЬреЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдЙрд╕ рд╡рд╕реНрддреБ рдХреЗ рдХрд░реАрдм рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЙрдирдХреЗ рдмреАрдЪ рдХреЛрдИ рд╕реНрдерд╛рди рдФрд░ рдХреАрд╡рд░реНрдб рд░реБрдХрд╛рд╡рдЯ рдирд╣реАрдВ рд╣реИред

рд╕рднреА рдореЗрдВ рд╕реЗ, рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ "рдЖрд╕реНрдердЧрд┐рдд рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕" рдХреНрдпрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рдкрд╣рд▓реЗ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд░рдирд╛ рд╣реИред рдЕрдиреНрдпрдерд╛ рдпрд╣ рдХреЗрд╡рд▓ async рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛, рдФрд░ рд╣рдо "рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ?" рдХреА рдЪрд░реНрдЪрд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдП рд╣реИрдВред рднреАред

рддреАрд╕рд░рд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЦреЛрдЬрд╢рдмреНрдж рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдореЗрдВ 2018 рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП await рдкрдХреНрд╖ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрдмрдХрд┐ go рдХреАрд╡рд░реНрдб рдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЧрд╣рд░реА crates.io рдЦреЛрдЬ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдХреИрд╕реЗ рдЪрд░реНрдЪрд╛ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рджрд┐рд╢рд╛ рд╕реЗ рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рддреА рд╣реИ (рдЙрдкрд╕рд░реНрдЧ рдмрдирд╛рдо рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕) рдореИрдВрдиреЗ рдПрдХ рдордЬрдмреВрдд рд░рд╛рдп рд╡рд┐рдХрд╕рд┐рдд рдХреА рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреАрдЫреЗ рд╣рдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ (рдЕрд░реНрджреНрдз-) рдирд┐рд╣рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд░рд╕реНрдЯ рд╕рдореБрджрд╛рдп рдореЗрдВ рдПрдХ рдХрдард┐рди рдмрд┐рдХреНрд░реА рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдПрд╕рд┐рдВрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрд╕ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ io рдПрдХ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреА рддрд░рд╣ред

@dpc рдХрд╛ рдорддрд▓рдм рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЕрд░реНрдз-рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдордЭреМрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ unsafe ред

let mut res: Response = await { client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .send()?
    .error_for_status()?
    .json()?
};

рдЬрд╣рд╛рдВ await рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╣реЛрдЧрд╛ред рдпрд╣ рдЪрд┐рдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдХреА рдЬрд░реВрд░рдд рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реА рдЪреЗрди рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╡рд╣ рдлреЙрд░реНрдо рд╡рд╛рдВрдЫрдиреАрдп рд╣реЛрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

@dpc async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдмрд┐рдВрджреБ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ

рдХреЛрдИ рднреА рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рдордХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд░реВрдк рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ @ivandardi рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, Future рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЕрднреА рднреА рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИрдВред рд╣рдо рдХрд┐рд╕реА рднреА Future рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЕрддреНрдпрдзрд┐рдХ рдЕрдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рд╕реНрдкрд╖реНрдЯ, рдкрд░рд┐рдЪрд┐рдд, рдкрдардиреАрдп, рдмрдирд╛рдП рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛: рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб await рдпрд╛ рдореИрдХреНрд░реЛ await!() , рд╕рдВрднрд╛рд╡рд┐рдд рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ .await!() рднрд╡рд┐рд╖реНрдп рдореЗрдВред

@novacrazy рднрд▓реЗ рд╣реА рдЖрджрд░реНрд╢ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВ рдЕрднреА рднреА рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╕реНрдЯрдо рдлреНрдпреВрдЪрд░ рдФрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд┐ рд╡реЗ рдирд░рдо рдкрджрд╛рд╡рдирдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдореБрдЭреЗ рд░реБрд╕реНрдд рдХреА рд╕рдВрдкреВрд░реНрдг рджрд┐рд╢рд╛ рдкрд░ рдкреНрд░рд╢реНрдирдЪрд┐рдиреНрд╣ рд▓рдЧрддрд╛ рд╣реИред

рдмреЗрд╢рдХ рдЖрдк рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреБрдЫ рднреА рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдпрд╣ ? рдХреЗ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рд╣реИ: рдирдпрд╛ рдХреЛрдб рдЖрдорддреМрд░ рдкрд░ ? рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ), рд▓реЗрдХрд┐рди рд╡рд┐рдХрд▓реНрдк / рдкрд░рд┐рдгрд╛рдо рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ or_else рдлрдВрдХреА рд╡рд╛рд▓реЗ)

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ map рдФрд░ and_then , рд▓реЗрдХрд┐рди рдлрд╝реНрдпреВрдЪрд░рд┐рдпрд░ рдлрд╝реНрдпреВрдЪрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдЕрднреА рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдФрд░ рд╣реЛрдЧрд╛)ред

рдЖрдк рдЬрд┐рди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрддреЗ рд╣реИрдВ, рд╡реЗ рдЕрднреА рднреА рд╕рдВрдпреЛрдЬрдирдХрд░реНрддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрдпрд╛рдирдХ рд▓рдЧрддреЗ рд╣реИрдВ,

рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдорд╛рдирдХ рдЬрдВрдЧ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рд╕реНрдкрд╖реНрдЯрддрд╛ рд╢рд╛рдпрдж рд╣реА рдкрд╛рддреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдорд╛рдирд╕рд┐рдХ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╣реИред

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рдпрд╣ рдФрд░ рднреА рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ:

some_op().await?
    .another_op().await?
    .final_op().await

рдЖрдк рдЕрдкрдиреЗ рдореВрд▓ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

some_op()
    .and_then(|v| v.another_op())
    .and_then(|v2| v2.final_op())

рдФрд░ рдЬрдирд░реЗрдЯрд░ рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЕрдзрд┐рдХ рдорд╢реАрди рдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ред

рдЖрдк рдпрд╣ рджрд╛рд╡рд╛ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд╢ / рд╡реЗрдЯ рд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдУрд╡рд░рд╣реЗрдб рд╣реЛрдЧрд╛? рдЬрдирд░реЗрдЯрд░ рдФрд░ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рджреЛрдиреЛрдВ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╢реВрдиреНрдп-рд▓рд╛рдЧрдд рдФрд░ рднрд╛рд░реА рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдПрдХ рднрд╛рд░реА рдЕрдиреБрдХреВрд▓рд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рдлреНрдпреВрдЪрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд╕рдорд╛рдиред

рд╣реБрдб рдХреЗ рддрд╣рдд рдЗрди рдЬрдирд░реЗрдЯрд░ рд╕реНрдкреЗрдЧреЗрдЯреА рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдпред

рдлреНрдпреВрдЪрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рднреА рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдПрдХ "рд╕реНрдкреЗрдЧреЗрдЯреА рд╕реНрдЯреЗрдЯ рдорд╢реАрди" рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдереЗред

рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИрдВред

[рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░] рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рдЧрд▓рдд рд╕реВрдЪрдирд╛ рдлреИрд▓рд╛рдирд╛ рдмрдВрдж рдХрд░реЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдореЗрдВ рдлреНрдпреВрдЪрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рдпрджрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЦреБрд╢ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ 2019/2020 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд╣рд╛ рд╣реИ, рдПрдбрд┐рд╢рди рдПрдХ рдордирдорд╛рдиреА рдЪреАрдЬ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрд╕ рдЬрдм рднреА рд╣рдо рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рд╣рд░ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ (рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж) рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ @ рд╕реЗрдВрдЯреНрд░рд┐рд▓ рдиреЗ рдмрддрд╛рдпрд╛, рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд░рд╛рдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдХреНрд╖рдо рддрд░реАрдХрд╛ рд╣реИред

рдЪрд░реНрдЪрд╛ рдХреА рдЧрддрд┐ рдЕрднреА рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИ; рдЗрд╕рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рдзреАрдорд╛ рдХрд░рдиреЗ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЗрд╕реЗ рдПрдХ рджрд┐рди рдХреЗ рднреАрддрд░ рдЕрдирд▓реЙрдХ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕ рд╕рдордп, рдХреГрдкрдпрд╛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЪрдирд╛рддреНрдордХ рд╣реЛрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдПрдХ рджрд┐рди рдмрд╛рдж рдЕрдирд▓реЙрдХ рдХрд░рдирд╛ ... рдХреГрдкрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рди рдХрд░реЗрдВ рдФрд░ рд╡рд┐рд╖рдп рдкрд░ рдЯрд┐рдкреНрдкрдгреА рд░рдЦреЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдпрд╛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ ..)ред

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдПрдХ рд▓рдВрдмрд╛ рдзрд╛рдЧрд╛ рд░рд╣рд╛ рд╣реИ, рдЖрдЗрдП рдЗрд╕рдореЗрдВ рджрдлрди рдХрд┐рдП рдЧрдП рдХреБрдЫ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдВред

@mehcode рдиреЗ рд╣рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рджреЛрдиреЛрдВ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ await рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рдкрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ-рд╡рд┐рд╢реНрд╡ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛: https://github.com/rust-lang/rust/issues/57640#issuecomment -455848486

@Centril рдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдХрд┐ рдЬрд╛рдирдмреВрдЭрдХрд░ рддрдХрдиреАрдХреА рдЛрдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП await!(expr) рд░рд╛рд╢рд┐рдпреЛрдВ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛: https://github.com/rust-lang/rust/issues/57640#issuecomment -45580808484

@valff рдиреЗ рд╣рдореЗрдВ рдпрд╛рдж рджрд┐рд▓рд╛рдпрд╛ рдХрд┐ expr await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ https://github.com/rust-lang/rust/issues/57640#issuecomment-456023146

@quodlibetor рдиреЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдХрд┐ рддреНрд░реБрдЯрд┐ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рднрд╛рд╡ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рд╣реИ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/57640#ecuecomment-456143523

рджрд┐рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рд▓реИрдВрдЧ рдЯреАрдо рдХреЛ рдпрд╣рд╛рдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдо рдЬрд╝рдореАрди рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд╣рд┐рдд рдореЗрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдо рд╕рд╣рдорддрд┐ рдмрди рд╕рдХрддреА рд╣реИ, рд╢рд╛рдпрдж рдпрд╣ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкреНрд░рдореБрдЦ рдореБрджреНрджреЗ рдкрд░ рд▓рдВрдЧ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдХрдерд┐рдд рдкрджреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛:

  • @ рдХреЗрдВрджреНрд░ рдиреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕ рдЯрд┐рдХрдЯ рдореЗрдВ рдХрдИ рд╡рд┐рд╡рд┐рдзрддрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред Centril рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ await!(expr) рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред

  • @cramertj рдиреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ expr await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдПред

  • @joshtriplett рдиреЗ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

  • @scottmcm рдиреЗ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ ред

  • @withoutboats рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ "рдЕрдкрд░рд┐рдЪрд┐рддрддрд╛ рдмрдЬрдЯ" рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛, "рдмрд░рд╛рдмрд░реА" рдХреЛ "рдЕрд╕рд▓реА рд╢реЙрдЯ" рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП expr await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдорд╛рдирддрд╛ рд╣реИ ред

  • @aturon , @eddyb , @nikomatsakis , рдФрд░ @pnkfelix рдиреЗ рдЕрднреА рддрдХ # 57640 рдпрд╛ # 50547 рдХреЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕реНрдерд┐рддрд┐ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХреА рд╣реИред

рддреЛ рдЬрд┐рди рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рд╣рд╛рдВ / рдирд╣реАрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реЛрдЧрд╛:

  • рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
  • рдХреНрдпрд╛ рд╣рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
  • рдХреНрдпрд╛ рд╣рдореЗрдВ рдЕрдм рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдмрд╛рдж рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдпрджрд┐ рд╣рдо рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рджреЛ рдореБрдЦреНрдп рджрд╛рд╡реЗрджрд╛рд░ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдЙрдкрдпреЛрдЧреА рдФрд░ рд╕реНрдкрд╖реНрдЯ, рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИред await!() рдЦрд┐рд▓рд╛рдл рддрд░реНрдХ рдмрд╣реБрдд рдордЬрдмреВрдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЙрдкрдпреЛрдЧреА рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╣рдо рдЬреЛ рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рдореЗрдВ рдХрдо рдХреЛрд╖реНрдардХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЗ рд╕рд╛рде await рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдордЬрдмреВрдд рддрд░реНрдХ рднреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреИрд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдб рдЦрд░рд╛рдм рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реИ, рддреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рд╕реНрдкреЗрд╕ рд╡рд╛рд▓рд╛ рдХреАрд╡рд░реНрдб рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЦрд░рд╛рдм рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рддреЛ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рдорд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рд╕рднреА Rust рдХреЛрдб рдЬрдВрдЧ рдЦрд╛рдП рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реЛрдВрдЧреЗ, рдФрд░ рдЬрдВрдЧ рдЦрд╛рдП рд╣рдореЗрд╢рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдП рдЧрдП рдЬрдВрдЬреАрд░реЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡реЗ рдПрдХ рд╣реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдВред рдпрджрд┐ рд╣рдо рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмрд╣реБрдд рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХрд▓-рдкрдВрдХреНрддрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмреАрдЪ рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдкрдардиреАрдпрддрд╛ рдФрд░ рднреНрд░рдо рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдЕрдВрдд рдореЗрдВ, рдЕрдЧрд░ рд╣рдо рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдпрд╛ рдкреНрд░реАрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рд╕реЗ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореЗрд░реА рд╡рд┐рдЪрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдореИрдВ рдХреИрд╕реЗ рд╕рддрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдФрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реВрдВред await ,
рдпрд╣рд╛рдВ рд╡реЗ рд▓рдХреНрд╖реНрдп рд╣реИрдВ рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИрдВ (рдмрд┐рдирд╛ рдХрд┐рд╕реА рдорд╣рддреНрд╡ рдХреЗ рдЖрджреЗрд╢):

  1. await рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреА рднрд╛рд╖рд╛ рдХреА рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  3. рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП ? рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд░рдЪрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЬрдВрдЧ рдореЗрдВ рдкреНрд░рдЪрд▓рд┐рдд рд╣реИрдВред рдХрд┐рд╕реА рдХреЛ рдЕрд╕реНрдерд╛рдпреА let рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╕рд╛рд░реНрдердХ рдЙрдкрдЦрдВрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  4. рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдЕрдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП grep рд╣реЛрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  5. рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  6. рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдкреВрд░реНрд╡рддрд╛ рд╕рд╣рдЬ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
  7. рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЖрдИрдбреАрдИ рдФрд░ рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпреЛрдВ рдХреА рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд░рдЪрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  8. рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реАрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  9. рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдФрд░ рд╢рд╛рдпрдж рднреВрд▓ рдЧрдП ...) рдореЗрд░реЗ рдХреБрдЫ рд▓рдХреНрд╖реНрдп, рдпрд╣рд╛рдБ рдПрдХ рд╕рд╛рд░рд╛рдВрд╢ рд╣реИ рдФрд░ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреБрдЫ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХрд╛ рдореЗрд░рд╛ рдореВрд▓реНрдпрд╛рдВрдХрди:

  1. рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ await рдкреБрдирд░реНрдирд┐рдзрд╛рд░рдг рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛ рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ await!(expr) рдпрд╛ expr.await!() ред рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ await рдпрд╛ рддреЛ рд╣рд╛рд░реНрдбрдХреЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд╛рдо рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдпрд╛рдиреА use core::await as foo; рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ), рдпрд╛ await рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреНрдпрд╛рдЧ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  2. рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдореИрдХреНрд░реЛрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЧреИрд░-рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреА рднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВред рдпрджреНрдпрдкрд┐ рдпрд╣ рдПрдХ рддрдХрдиреАрдХреА рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рдХреЗ рдРрд╕реЗ рдХреЗрдВрджреНрд░реАрдп рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рдЫрд╛рдк рджреЗрддрд╛ рд╣реИред рддрд░реНрдХ рд╣реИ, .await рдФрд░ .await() рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдмрд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИрдВ; рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

  3. рдЬрдВрдЬреАрд░реЛрдВ рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХрд┐рд╕реА рднреА рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЬрдмрдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдФрд░ ? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВред

  4. рдЬрдм await рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЙрдкрд╕рд░реНрдЧ, рдЙрдкрд╕рд░реНрдЧ, рдореИрдХреНрд░реЛ, рдЗрддреНрдпрд╛рджрд┐ рд╣реИ, рдЬрдм рдПрдХ рд╕рддрд░реНрдХ рдЖрдзрд╛рд░рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ # , @ , ~ , рд╣рд░рд┐рдпрд╛рд▓реА рдХрдард┐рди рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЕрдВрддрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди .await await рдФрд░ await рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрди рджреЛрдиреЛрдВ рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╢рдмреНрджреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред .await ред

  5. рд╕рд┐рдЧрд▓реНрд╕ рдХреЛ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рджреЗрдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЬрдмрдХрд┐ await рдХреЛ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ .await рдпрд╛ рдЕрдиреНрдп рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рд╕реНрдкреЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИрдВ рдпрд╛ рдЬреЛ await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдШрдЯрд┐рдпрд╛ рдкрдардиреАрдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, @scottmcm рд╕рд╣реА рд░реВрдк рд╕реЗ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд╛рдпрджрд╛ рдЖрдо рд╣реИ рдФрд░ рдпрд╣ .await? рд╕реНрд╡рдпрдВ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдХреЙрдЯ рдиреЛрдЯ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ await рдЙрджреНрдпрд╛рди рдкрде рд╡рд╛рдХреНрдпреЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдирд╣реАрдВ рд╣реИред ? рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рд░реБрд╕реНрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреА рддрд▓рд╛рд╢ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

  6. .await рдФрд░ .await() рдХреА рдкреВрд░реНрд╡рдзрд╛рд░рдгрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИрдВ; рд╡реЗ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рдкрд╣реБрдВрдЪ рдФрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рд╕рдВрднрд╡рддрдГ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдкреВрд░реНрд╡рддрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдмреАрдЪ, рдЙрдкрд╕рд░реНрдЧ await рдкрд╛рд╕ ? (рдпрд╛рдиреА await (expr?) ) рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рд╕реБрд╕рдВрдЧрдд, рдкреВрд░реНрд╡рд╛рдиреБрдореЗрдп рдФрд░ рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рд╡рд░реНрддреАрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЕрд╕рдВрдЧрдд рдФрд░ рдЙрдкрдпреЛрдЧреА ( (await expr)? )ред рдПрдХ рд╕рддрд░реНрдХ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реАрдпрддрд╛ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ (рдЬреИрд╕реЗ ? рд╕реЗ рдЗрд╕рдХрд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рд▓реЗрдирд╛)ред

  7. 2012 рдореЗрдВ, @nikomatsakis рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдХрд┐ рд╕рд╛рдЗрдорди рдкреЗрдЯрди рдЬреЛрдиреНрд╕ рдиреЗ рдПрдХ рдмрд╛рд░ (рдкреГрд╖реНрда 56) рдиреЛрдЯ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд╣ "рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐" рд╕реЗ рдИрд░реНрд╖реНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдЖрдИрдбреАрдИ рдЬрд╛рджреВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдВрдХреАрд░реНрдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИред рдЪреВрдБрдХрд┐ рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐ рдХрдИ рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдУрдВ (рдЬреИрд╕реЗ рдЬрд╛рд╡рд╛, рд╕реА #, рд╕реА ++, ..) рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпреЛрдВ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ "рдбреЙрдЯ рдХреЗ рд▓рд┐рдП рдкрд╣реБрдВрдЪ" рд╣реЛ рдЧрдИ рд╣реИред рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЖрджрдд рдХрд┐рддрдиреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рдпрд╣рд╛рдВ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ
    Re#er intellisense

    C # рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрдЯ рдирд╣реАрдВ рд╣реИред рдмрд╣рд░рд╣рд╛рд▓, рдпрд╣ рдЗрддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡реИрдз рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕реНрд╡рдд: рдкреВрд░реНрдг рд╕реВрдЪреА рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХрдИ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЦреБрдж рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, .aw рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдм .await рд╕рддрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИред рдЖрдИрдбреАрдИ рдЕрдиреБрднрд╡ рдХреЗ рд▓рд╛рдн рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдпрджрд┐ рдпрд╣ рдерд╛ред await expr рдФрд░ expr await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЙрд╕ рд▓рд╛рдн рдХреЛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

  8. Sigils рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЧрд░реАрдм рдкрд░рд┐рдЪрд┐рдд рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рдЙрдкрд╕рд░реНрдЧ await рдХреЛ C #, JS, рдЖрджрд┐ рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рд╕реЗ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдкрд░реЗрд╢рди рдореЗрдВ await рдФрд░ ? рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ рд░рд╕реНрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ await expr expr.await рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рдЦрд┐рдВрдЪрд╛рд╡ рдирд╣реАрдВ рд╣реИ - рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рд╕рд░реНрдЬрди рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрдЯреНрдЯрд░рдкрдВрдереА рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдкрд░реЛрдХреНрдд рдбреЙрдЯ-рдкреЙрд╡рд░ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ .await expr. рдЯрд╛рдЗрдк рдХрд░рдХреЗ рдФрд░ await рдХреЛ рдСрдЯреЛ-рдкреВрд░реНрдг рдкреЙрдкрдЕрдк рдореЗрдВ рдкрд╣рд▓реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдХрд░ рд╕реАрдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

  9. рд╕рд┐рдЧрд┐рд▓ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЕрдЪреНрдЫреЗ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдмрдХрд┐ .await рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд╛ рд╣реИ, рдпрд╣ рдбреЙрдЯ-рд╢рдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдЖрддрд╛ рд╣реИ рдЬреЛ рд▓реЗрдЦрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред let рдХрдердиреЛрдВ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рди рд╣реЛрдиреЗ рд╕реЗ рднреА рдмреЗрд╣рддрд░ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИред рдЙрдкрд╕рд░реНрдЧ await , рдпрд╛ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ await!(..) , рджреЛрдиреЛрдВ рдбреЙрдЯ-рд╢рдХреНрддрд┐рдпрд╛рдВ рдФрд░ рд╢рд╛рдЗрдирд┐рдВрдЧ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред .await , .await() , рдФрд░ .await!() , рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдЪрд▓рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдкрд╣рд▓рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ред

рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдИ рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рднреА рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдПрдХ рд╡реНрдпрд╛рдкрд╛рд░ рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реЗ рд▓рд┐рдП, рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓рд╛рднреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд╕рдмрд╕реЗ рдХрдорд┐рдпрд╛рдВ .await ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдЬрдВрдЬреАрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдЦреЛрдЬрд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ await рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдирд┐рдВрджрдиреАрдп рд╣реИ, рдЗрд╕рдореЗрдВ рдбреЙрдЯ-рд╢рдХреНрддрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реАрдЦрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╣реИ, рдЗрд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдкрдардиреАрдп рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреЗ рд╕реНрд╡рд░реВрдкрдг рдФрд░ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП)ред

@ рдХреЗрдВрджреНрд░ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдкрд╣рд▓реЗ, рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛? рджреВрд╕рд░реЗ, .await рдХреЗ рджреЛрд╣рд░реЗрдкрди рдХреЛ рдХреИрд╕реЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рдкрд╣реБрдВрдЪ рдорд╛рдирд╛ рдЬрд╛рдП? рдХреНрдпрд╛ .await рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдареАрдХ рд░рд╣реЗрдЧрд╛, рдпрд╛ рдХреНрдпрд╛ .await() рдХреЛ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рд╡рд╣рд╛рдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдкрд░реЗрд╢рди рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдФрд░ рддреАрд╕рд░рд╛, .await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде, рдХреНрдпрд╛ рдпрд╣ рдХреАрд╡рд░реНрдб рдпрд╛ рдХреЗрд╡рд▓ "рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕" рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛?

рдкрд╣рд▓реЗ, рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣реИ рдирд╛?

рд╣рд╛рдВред рдЕрднреА рддреЛ рдХрдо рд╕реЗ рдХрдоред

рджреВрд╕рд░реЗ, .await рдХреЗ рджреЛрд╣рд░реЗрдкрди рдХреЛ рдХреИрд╕реЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рдкрд╣реБрдВрдЪ рдорд╛рдирд╛ рдЬрд╛рдП?

рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рдЦрд╛рдореА рд╣реИ; рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐ рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдЙрд▓реНрдЯрд╛ рдереЛ рд╣реИред рднреЗрдж рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд▓реНрджреА рд╕реЗ рд╕реАрдЦреЗрдВрдЧреЗ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдпрд╣ рдХреАрд╡рд░реНрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдХреЙрдЯ рдиреЗ рдХрд╣рд╛ рд╣реИ, .await? рд╕рдмрд╕реЗ рдЖрдо рд╣реЛрдЧрд╛ рдЬреЛ рд╕реНрдерд┐рддрд┐ рдХреЛ рдФрд░ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ await рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдХреАрд╡рд░реНрдб рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рдХрд┐ рд╣рдордиреЗ fn ред

рдХреНрдпрд╛ .await рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдареАрдХ рд░рд╣реЗрдЧрд╛, рдпрд╛ .await() рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдЗрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рд╡рд╣рд╛рдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдкрд░реЗрд╢рди рд╣реЛ рд░рд╣рд╛ рд╣реИ?

рдореИрдВ рдкреВрдВрдЫ рдХреЗ рдмрд┐рдирд╛ .await рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ () ; рдЕрдВрдд рдореЗрдВ () рд╣реЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдирдордХ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдФрд░, рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реВрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд┐рдзрд┐ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдЕрдзрд┐рдХ рдЗрдЪреНрдЫреБрдХ рдмрдирд╛рддрд╛ рд╣реВрдВред

рдФрд░ рддреАрд╕рд░рд╛, .await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде, рдХреНрдпрд╛ рдпрд╣ рдХреАрд╡рд░реНрдб рдпрд╛ рдХреЗрд╡рд▓ "рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕" рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛?

await рдПрдХ рдХреАрд╡рд░реНрдб рдмрдирд╛ рд░рд╣реЗрдЧрд╛ред рдореБрдордХрд┐рди рд╣реИ рдХрд┐ рдЖрдк рдЬрдм рд╕рд╛рдордирд╛ рдирд╣реАрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ libsyntax рдмрджрд▓ рджреЗрдВрдЧреЗ await рдХреЗ рдмрд╛рдж . рдФрд░ рдлрд┐рд░ рдПрдПрд╕рдЯреА рдореЗрдВ рдЕрд▓рдЧ рдврдВрдЧ рд╕реЗ рдпрд╛ рддреЛ рд╡рд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдЬрдм HIR рдХреЛ рдХрдо рдХрд░рдиреЗ ... рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдпрд╣ рд╕рдм рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! ЁЯСН

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рд╡рд╣ рджрд┐рд╢рд╛ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рдо рдХрд┐рд╕ рдкрд░ рд╕рдВрдХреАрд░реНрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХрдорд░реЗ рдХреЛ рдкрдврд╝рдирд╛, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд░реНрдердХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдХрд┐рд╕реА рднреА рдЙрдЪрд┐рдд рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдЖрдиреЗ рд╕реЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдВрдбрд░рдбреЙрдЧ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рдиреЗ рдЯреАрдо рдХреЗ рдЪрд╛рд░ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рд╕рдорд░реНрдерди рдФрд░ рдПрдХ рдкрд╛рдВрдЪрд╡реЗрдВ (рдЕрдм рддрдХ рдЪреБрдк рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдЪрд╛рд░) рд╕реЗ рдЦреБрд▓реЗрдкрди рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдЗрд╕рдиреЗ рдпрд╣рд╛рдБ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реНрдпрд╛рдкрдХ рд╕рдореБрджрд╛рдп рдХреЗ рдХрд╛рдлреА рд╕рдорд░реНрдерди рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдорд░реНрдердХреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЧрд╣рд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╛ рддрд░реНрдХ-рд╡рд┐рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЕрдм рддрдХ рдЙрдиреНрдирдд рддрд░реНрдХ рдЗрд╕ рд╕рдорд░реНрдерди рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдВрдЧреЗред

рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ @withoutboats рд╕реЗ рд╕реБрдирдиреЗ рдХреА

рдЙрдлрд╝, рдЕрднреА рджреЗрдЦрд╛ @ рдХреЗрдВрджреНрд░ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЯрд┐рдкреНрдкрдгреА рдХрд░ рдЫрд┐рдкрд╛рдКрдВрдЧрд╛ ред

@ivhydi рдкреЛрд╕реНрдЯ рд╕реЗ рд▓рдХреНрд╖реНрдп (1) рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрднреА рднреА рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдХрднреА рднреА рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЙрд╕реА рддрд░рд╣ loop {} рдХрднреА рднреА рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╢рд╛рдмреНрджрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИред рдФрд░ рдореИрдВ рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЬреИрд╕реЗ https://github.com/rust-lang/rust-enhanced/issues/333 рд╕рдмрд▓реЗрдо рдореЗрдВ рдХрд░рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ)ред

рдореЗрд░реА рдПрдХ рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рддрд░рд╣ рдПрдХ рдЕрд▓рдЧ рдкрд╣реБрдВрдЪ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕рдВрднрд╡рддрдГ рднреНрд░рдо рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрдм 2015 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреЛрдбрдмреЗрд╢рди рдХреЛ рд╕рд╛рдХрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ред (реирежрезрел рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ рдЬрдм рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ, рдХрд┐рд╕реА рдФрд░ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЦреЛрд▓рдирд╛, рдЖрджрд┐) рддреЛ реирежрезрел рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐ рд╣реИ рдЬрдм await рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЕрдЧрд░ рд╡рд╣рд╛рдБ рд╣реИ рддреЛ рдЪреЗрддрд╛рд╡рдиреА), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рд╡рд╣ (рд╕реЗрдВрдЯреНрд░реЗрд▓ рдХреЗ рдЕрджреНрднреБрдд рддрд░реНрдХ рдХреЗ рд╕рд╛рде) рдПрдХ рдХреАрд╡рд░реНрдб рдлрд╝реАрд▓реНрдб (рдпрд╛ рд╡рд┐рдзрд┐) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдУрд╣, рдФрд░ рдПрдХ рдмрд╛рдд рдЬреЛ рд╣рдореЗрдВ рддрдп рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬрдмрдХрд┐ рд╣рдо рдЗрд╕ рдкрд░ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдЬрдВрдЧ рдЦрд╛рдПрдЧреА рдЗрд╕реЗ рд╕реНрд╡рд░реВрдкрдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

let val = await future;
let val = await returns_future();
let res = client.get("https://my_api").await send()?.await json()?;
  1. await - рдЪреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
  2. рдкреНрд░рдердо рд╢реНрд░реЗрдгреА - рдЬрд╛рдБрдЪ
  3. рдЪреИрдирд┐рдВрдЧ - рдЬрд╛рдБрдЪ
  4. рдкрдХрдбрд╝рдирд╛ - рдЬрд╛рдБрдЪ рдХрд░рдирд╛
  5. рдиреЙрди рд╕рд░реНрдЬрди - рдЪреЗрдХ
  6. рдкреВрд░реНрд╡рдЧрд╛рдореА - heckрдЪреЗрдХ
  7. рдбреЙрдЯ рдкреЙрд╡рд░ - heckcheck
  8. рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди - heckcheck
  9. рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ - рдЪреЗрдХ

┬╣Precedence: await рдмрд╛рдж рдХрд╛ рд╕реНрдерд╛рди рдЖрд╕реНрдердЧрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдмрд┐рд▓рдХреБрд▓ рдирд┐рдореНрди рдХреЛрдб рдкрд░ рд╕рдорд╛рди рд╣реИ: client.get("https://my_api").await_send()?.await_json()? ред рд╕рднреА рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ

EрдбреЙрдЯ рдкрд╛рд╡рд░: . , ? рдпрд╛ ; рдХреЗ рдмрд╛рдж рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IDE рдХреЗ рд▓рд┐рдП await рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ

рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди: рдЙрдкрд╕рд░реНрдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рд╣реИред рд╡рд┐рдХреГрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж


рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╕рдВрдЧрдд рд╣реЛрдЧрд╛:

  • рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рдпрд╣ ? рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ рд╣реИ
  • рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд╕реНрд╡рд░реВрдкрдг рд╣реЛрдЧрд╛
  • рдпрд╣ рдорд╛рдирд╡ рднрд╛рд╖рд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ
  • рдпрд╣ рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ * рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХреНрд╖реИрддрд┐рдЬ рдШрдЯрдирд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

* рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреЗ рддрд╣рдд рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ


рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдлрд╝рдВрдХреНрд╢рди async рдФрд░ рдХреНрд╖реИрддрд┐рдЬ рдЕрдХреНрд╖ рдкрд░ await рдХреА рдЕрдЧрд▓реА рдШрдЯрдирд╛ рдХрд╣рд╛рдВ рд╣реЛрдЧреА:

let res = client.get("https://my_api")
    .very_long_method_name(param, param, param).await?
    .short().await?;

рдЖрд╕реНрдердЧрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд╣реЛрдЧрд╛:

let res = client.get("https://my_api")
    .await very_long_method_name(param, param, param)?
    .await short()?;

рд╡рд╣рд╛рдБ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рдЕрдЧрд▓реА рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдмреАрдЪ? рдкрд╕рдВрдж
get().await?.json() ред

рдмреБрдз рдкрд░, рдЬрдирд╡рд░реА 23, 2019, 05:06 I60R < рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЪрд▓реЛ рд╡реИрд▓ = рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ;
let res = client.get ("https: // my_api") .it рднреЗрдЬреЗрдВ () - рдкреНрд░рддреАрдХреНрд╖рд╛ json () ;;

  1. рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рдЪреЗрдХ
  2. рдкреНрд░рдердо рд╢реНрд░реЗрдгреА - рдЬрд╛рдБрдЪ
  3. рдЪреИрдирд┐рдВрдЧ - рдЬрд╛рдБрдЪ
  4. рдкрдХрдбрд╝рдирд╛ - рдЬрд╛рдБрдЪ рдХрд░рдирд╛
  5. рдиреЙрди рд╕рд░реНрдЬрди - рдЪреЗрдХ
  6. рдкреВрд░реНрд╡рдЧрд╛рдореА - heckрдЪреЗрдХ
  7. рдбреЙрдЯ рдкреЙрд╡рд░ - heckcheck
  8. рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди - heckcheck
  9. рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ - рдЪреЗрдХ

┬╣Precedence: рд╕реНрдерд╛рди рдЗрд╕реЗ рдЖрд╕реНрдердЧрд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╣реИ
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдкрд░ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ: client.get ("https: // my_api"
") .await_send ()-- wait_json ()-- рд╕рднреА рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╣реИ
рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рд╕рднреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рд╛рдХреГрддрд┐рдХ

IDрдбреЙрдЯ рдкреЙрд╡рд░: IDE рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
рдХреЗ рдмрд╛рдж рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдмрд╛рдИрдВ рдУрд░ред рдпрд╛? рдЕрдЧрд▓рд╛ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓рдЧрддрд╛ рднреА рдирд╣реАрдВ рд╣реИ
рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ

рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди: рдЙрдкрд╕рд░реНрдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рд╣реИ,
рдФрд░ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдерд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛

рд╕реНрдерд┐рд░

рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реЛрдЧрд╛
рд╕рдВрдЧрдд:

  • рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ рд╣реИ?
  • рдпрд╣ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд╕реНрд╡рд░реВрдкрдг рд╣реЛрдЧрд╛
  • рдпрд╣ рдорд╛рдирд╡ рднрд╛рд╖рд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ
  • рдпрд╣ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХреНрд╖реИрддрд┐рдЬ рдШрдЯрдирд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ
    рдЬрдВрдЬреАрд░*

* рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдХреЗ рддрд╣рдд рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд╕рд╛рде рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рдПрд╕рд┐рдВрдХреНрд╕ рд╣реИ рдФрд░
рдХреНрд╖реИрддрд┐рдЬ рдЕрдХреНрд╖ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЕрдЧрд▓реА рдШрдЯрдирд╛ рдХрд╣рд╛рдВ рд╣реЛрдЧреА:

let res = client.get ("https: // my_api")

.very_long_method_name(param, param, param).await?

.short().await?;

рдЖрд╕реНрдердЧрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд╣реЛрдЧрд╛:

let res = client.get ("https: // my_api")

.await very_long_method_name(param, param, param)?

.await short()?;

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/57640#issuecomment-456693759 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AIA8Ogyjc8LW6teZnXyzOCo31-0GPohTks5vGAoDgaJpZM4aBlba
ред

рд╣рдореЗрдВ рдпрд╣ рднреА рддрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рд╣рдо рдЗрд╕ рдкрд░ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдЬрдВрдЧ рдЦрд╛рдХрд░ рдкреНрд░рд╛рд░реВрдкрдг рдХреИрд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ

рдпрд╣ https://github.com/rust-dev-tools/fmt-rfcs рдХрд╛ рдбреЛрдореЗрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рдСрдл-рдЯреЙрдкрд┐рдХ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐ рдлрд┐рдХреНрд╕-рдиреЗрд╕ рдФрд░ рдорд┐рд╕рд╛рд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

@ I60R

let res = client.get("https://my_api").await send()?.await json()?;

рдпрд╣ рдХреИрд╕реЗ рдореБрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдЦреЗрдЧрд╛? рдЕрдЧрд░ рдореИрдВ рдЗрд╕реЗ рд╕рд╣реА рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЙрдкрд╕рд░реНрдЧ await ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ C # рднрд╛рд╖рд╛ рдЯреАрдо рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рдмрджрдирд╛рдо рдХрд░рдиреЗ рдХреА рдЗрддрдиреА рдЬрд▓реНрджреА рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред Microsoft рдкреНрд░рдпреЛрдЬреНрдп рдЕрдзреНрдпрдпрдиреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдбрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдпрд╣рд╛рдВ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЖрдзрд╛рд░ рдХрд┐ рдЕрдиреНрдп рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рд╡рд╛рдХреНрдп рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП Rust рд╡рд┐рд╢реЗрд╖ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдореИрдВ рдЙрд╕ рдЖрдзрд╛рд░ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ - рдореИрдВрдиреЗ LINQ рд╕реЗ рдКрдкрд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ C # рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ .aw рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬрдм .await рдХреА рд╕рддрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред

~ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЛ рднреА рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛ рдЬрд╛рдПрдЧрд╛ред ~ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдПрдХ рддрд░рдл, рдЖрдк рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдкреЙрдк-рдЕрдк рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ await рдФрд░ Future рддрд░реАрдХреЛрдВ?

[...] рдФрд░ рд╣рдо рдпрд╣рд╛рдВ рдПрдХ рдирд┐рд░реНрдгрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдФрд░ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐ рд░реВрд╕реНрдЯ рдЕрдиреНрдп рд╕рднреА рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдореИрдВ рдЙрд╕ рдЖрдзрд╛рд░ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВ [...]

@lnicola рдореИрдВ рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдФрд░ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ https://github.com/rust-lang/rust/issues/57640#issuecomment -455846086

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрддреНрдкрд╛рджрди рдХреЛрдб рд╕реЗ рдХрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдгред

рдКрдкрд░ рджрд┐рдП рдЧрдП @ рд╕реЗрдВрдЯреНрд░рд┐рд▓ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдордЬрдмреВрдд рд╡рд┐рд╡рд╛рдж рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡рд┐рдХрд▓реНрдк expr await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ expr.await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдлрд╝реАрд▓реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдФрд░ рд╢рд╛рдпрдж рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡рд┐рдзрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрднреА рддрдХ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реИ)ред

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдлрд╝реАрд▓реНрдб "рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐" рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИ - рдЬреЛ рдХрд┐ IDEs рдЗрд╕реЗ рдПрдХ рд╕реНрд╡рддрдГ рдкреВрд░реНрдгрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрдЭрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ grep рдХреЗ рд╕рд╛рде рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧреНрд░рдгреА рдмрд┐рдВрджреБ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╢рдмреНрдж рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЫреВрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, @cramertj рдиреЗ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдпрд╛ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рд╣реИред @withoutboats рдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб

"рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рдЖрдИрдбреАрдИ рдЕрднреА рднреА рдПрдХ рдбреЙрдЯ рдХреЗ рдмрд╛рдж рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ await рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдмрд╕ рдбреЙрдЯ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдорд╛рд░реНрдЯ рдЖрдИрдбреАрдИ (рдЬреИрд╕реЗ рдЖрд░рдПрд▓рдПрд╕ рдХреЗ рд╕рд╛рде) рднреА рднрд╡рд┐рд╖реНрдп рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕реНрдерд╛рди рдХреЗ рдмрд╛рдж await рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдлрд╝реАрд▓реНрдб рдФрд░ рд╡рд┐рдзрд┐ рд╡рд┐рдХрд▓реНрдк рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЖрдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рд╕рддрд╣ рдХреНрд╖реЗрддреНрд░ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣реИред рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдлрд╝реАрд▓реНрдб / рдореЗрдердб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рдХреБрдЫ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рд╡рд┐рдзрд┐ рдЬрдВрдЬреАрд░реЛрдВ рдореЗрдВ рдЬрдЧрд╣ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝реА рд╕реА рдЕрд╕рд╛рд╡рдзрд╛рдиреА рд╕реЗ рдЖрдирд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рд╣рдореЗрдВ рдЕрд╡рд▓реЛрдХрди рдХреЗ рд╕рд╛рде рд╕рдореАрдХреНрд╖рд╛ рдФрд░ рд╕рдВрд▓рдЧреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб ( foo.bar() await ) рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдЦрд╛рд╡рдЯ ( foo.bar() : Result<Vec<_>, _> ) рд╕реЗ рдЕрдзрд┐рдХ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛ред рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЕрдВрддрд░рд┐рдХреНрд╖-рдкреГрдердХ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмрд╛рдж рдЪрд╛рдЗрдирд┐рдВрдЧ рдЬрд╛рд░реА рд╣реИред

@ рд╢рд┐рд╡рдордиреНрджрд┐рд░ , @ рд▓рдирд┐рдХреЛрд▓рд╛ ,

рдореИрдВрдиреЗ рдЕрдкрдиреА рд╣рд╛рд▓ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдореБрдлреНрдд рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрд▓рдмреНрдз рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЕрдВрддрд┐рдо рд╕реНрдкреЙрдЗрд▓рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

future.await? рдмрдирд╛рдо future await? рдмрд╣рд╕ рдХрд░рдиреЗ рдХреЗ рд╣рд┐рдд рдореЗрдВ ...

рдХреБрдЫ рдЬрд┐рд╕ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИ рд╡рд╣ рджреГрд╢реНрдп рд╢реНрд░рдВрдЦрд▓рд╛ рдпрд╛ рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рдкрдХрдбрд╝ рд╣реИред

рдкрд░ рд╡рд┐рдЪрд╛рд░ ( match рдХреЗ рдмрдЬрд╛рдп await рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП)

post(url).multipart(form).send().match?.error_for_status()?.json().match?

рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдореЗрдВ

post(url).multipart(form).send() match?.error_for_status()?.json() match?

рдЬрдм рдореИрдВ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ await рд▓рд┐рдП рдкрд╣рд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ send().await? рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо send() рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдореИрдВ await рд▓рд┐рдП рджреВрд╕рд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ await?.error_for_status() рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдиреИрдк рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЬрд╛рдирд╛, рдирд╣реАрдВ, рдмреИрдХ рдЕрдк рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ send() await рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИред


рд╣рд╛рдБ, рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рддрд░реНрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рддрдХ рдПрдХ рд╕реНрд╡реАрдХреГрдд рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИред рдЬрдмрдХрд┐ рдореИрдВ рдПрдХ рдЕрд░реНрде рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ _general_ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдВрджрд░реНрдн (рдЕрд╕реНрдкрд╖реНрдЯ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкрд░реЗрдВрд╕ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╡рд┐рд╖рдп рд╣реИрдВред рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ await рдХреА рд░рд╛рд╢рд┐ рдЯрд╛рдЗрдк рдПрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдХреА рдорд╛рддреНрд░рд╛ рд╕реЗ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдЙрдЪреНрдЪ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред

рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓реЗрдЦрди рднреА рдПрдХ рдЕрд▓рдЧ рдСрдкрд░реЗрдЯрд░ : рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрд╛рдВрдзрддрд╛ рд╣реИред рдЕрдиреНрдп рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреА рддрд░рд╣, рдЗрд╕реЗ рдкрдврд╝рдиреЗ рд╕реЗ рдпрд╣ (рдиреЗрддреНрд░рд╣реАрди) рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рджреЛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рдПрдХ рд╣реА рдкреЗрдбрд╝ рд╣реИрдВред рдЬрдмрдХрд┐ future await рдкрд╛рд╕ рдХреЛрдИ рдСрдкрд░реЗрдЯрд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ future_await рд▓рд┐рдП рдЧрд▓рддреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдкрд╣рд▓рд╛ рдХреАрд╡рд░реНрдб рд╣реЛ (рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдХрд┐ рдирд╣реАрдВ) рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рдирд╣реАрдВ)ред

рдпрджрд┐ рдЖрдк рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рд╕реЗ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рдЬрд╣рд╛рдВ рдПрдХ рд╣рд╛рдЗрдлрд╝рди ( - ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрддреНрд░рд╣реАрди рд╕рдореВрд╣ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдиреНрдпрдерд╛ рдЕрд▓рдЧ рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ C # рднрд╛рд╖рд╛ рдЯреАрдо рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рдмрджрдирд╛рдо рдХрд░рдиреЗ рдХреА рдЗрддрдиреА рдЬрд▓реНрджреА рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ "рдЗрддрдиреА рдЬрд▓реНрджреА" рдФрд░ "рдмрджрдирд╛рдо" рдпрд╣рд╛рдБ рдЙрдЪрд┐рдд рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рд╡рд╣реА рдмрд╛рдд рд╣реЛ рд░рд╣реА рд╣реИ рдЬреЛ async / рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд RFC рдореЗрдВ рд╣реБрдИ рдереА: рдзреНрдпрд╛рди рд╕реЗ рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдПрдХ рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд┐ рдХреНрдпрд╛ рд╢реЗрд╖ рд░рд╛рд╢рд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╣реИред C # рдЯреАрдо рднреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИ:

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ await рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдерд╛ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд╣рддреЗ рдереЗ
рддреЛ рд╢рд╛рдпрдж рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ 'рд░реЗрдлрд░реА' рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП

let future = task()
рдкрд░рдВрддреБ
let await result = task()

рддреЛ рдЖрдк рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

task().chained_method(|future| { /* do something with future */ })

рдкрд░рдВрддреБ

task().chained_method(|await result| { /* I've got the result */ })
- foo.await             // NOT a real field
- foo.await()           // NOT a real method
- foo.await!()          // NOT a real macro

рд╡реЗ рд╕рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд┐рдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рдХреЗ рдкрд╛рд╕ рд╡рд┐рдкрдХреНрд╖ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд╖реЗрддреНрд░ / рд╡рд┐рдзрд┐ / рдореИрдХреНрд░реЛ рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдПрдХ рдЦреЛрдЬрд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ await , рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЪреАрдЬ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рд╣рдореЗрдВ рдмрд╕ рд╕рдмрд╕реЗ рд╕рд░рд▓, foo.await рдЪрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рджреЛрдиреЛрдВ () рдФрд░ !() рдпрд╣рд╛рдБ рдмреЗрдорд╛рдиреА рд╣реИрдВред

@liigo

- foo await        // IS neither field/method/macro, 
                   // and clearly seen as awaited thing. May be easily chained. 
                   // Allow you to easily spot all async spots.

@mehcode

рдЬрдм рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рднреЗрдЬрдиреЗ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реВрдВ () рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ? рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рднреЗрдЬрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ()ред

рдореБрдЭреЗ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд╣рд╛рдВ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╣реИред рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, IMHO

image

рдбреЙрдЯ-рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд╛рде рдпрд╣ рдПрдХ рдЕрдЬреАрдм рдХреЙрд▓ рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдмрд╣реБрдд рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЪреЗрдирд┐рдВрдЧ рдореБрдЦреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ ( ? рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд▓реЗрдХрд┐рди foo await? рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ), рдФрд░ рдПрдХрд▓ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдпрд╣ рдмрди рдЬрд╛рддрд╛ рд╣реИред

post(url).multipart(form).send().match?

рдмрдирд╛рдо

post(url).multipart(form).send() match?

рдЬрд╣рд╛рдБ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдмрд╣реБрдд рдЕрдзрд┐рдХ рджреБрдмрд▓рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

рддреЛ, рдЕрдЧрд░ рд╣рдо future await рдФрд░ future.await , рддреЛ рдХреНрдпрд╛ рд╣рдо рд╕рд┐рд░реНрдл рдЬрд╛рджреВ "рдбреЙрдЯ" рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ? рддрд╛рдХрд┐ рд▓реЛрдЧ рдпрд╣ рдЪреБрди рд╕рдХреЗрдВ рдХрд┐ рд╡реЗ рдХреМрди рд╕рд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдмрд╣рд╕ рдмрдВрдж рдХрд░реЛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЛ!

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд░рдЦрдирд╛ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рдирд╣реАрдВ рд╣реИ, рд░рд╕реНрдЯ рдХреЗ рдРрд╕реЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрдВрддрд┐рдо рд╕реНрдкреЙрдЯрд░ рд╣реИ ( ; рдпрд╛ , рдпрд╛ рдЬреЛ рднреА рд╣реЛ, рдЕрдВрддрд┐рдо рдЖрдЗрдЯрдо рдХреЗ рдмрд╛рдж, рдЬреИрд╕реЗ (A,B,) ) рдЬреНрдпрд╛рджрд╛рддрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдХреЛрдИ рдареЛрд╕ рдХрд╛рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ рдХрд┐ рд╣рдо рдбреЙрдЯ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдирд╛рдЗрдЯрд▓реА рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд╣реЛрдЧрд╛, рдФрд░ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рджреЗрдВ рдХрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреМрди рд╕рд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╕рдВрджреАрджрд╛ рд╢реИрд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдиреНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдмрдирд╛рддрд╛ рд╣реИред

рдлрд┐рд░ рдЕрд╕реНрддрдмрд▓ рдореЗрдВ рдЙрддрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдХреЛ рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рджреЛрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдореИрдХреНрд░реЛрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ (рдореИрдВ рдЗрд╕реЗ рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рдорд╛рдиреВрдВрдЧрд╛) рдФрд░ await!() рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ await!() (рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рдЕрдЧрд░ рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕) "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореИрдХреНрд░реЛ" рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдВрдд рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ ASAP рдХреЛ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдмрдЬрд╛рдп рдЗрд╕реЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкрд░ рд░реЛрдХрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдлрд┐рдЯ рд╣реИред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдПрдХ рджрд┐рди рдХреЗ рд▓рд┐рдП рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдЗрддрдиреА рдорджрдж рдорд┐рд▓реА рд╣реИ рдФрд░ рдореИрдВ рдЕрдм рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рдХрд┐рд╕реА рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд╕реАрдзреЗ рдЬрд╡рд╛рдм рджреЗ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдмреЗрдЭрд┐рдЭрдХ рдмрддрд╛рдПрдВред

. рд╕рд╛рде рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдореЗрд░рд╛ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ await рдПрдХ рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдлрд╝реАрд▓реНрдб рдХреА рддрд░рд╣ рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдФрд░ рдмреЛрд▓реНрдб рдлрд╝реЙрдиреНрдЯ рдХреЗ рд╕рд╛рде рднреА рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдХреНрд╖реЗрддреНрд░ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрд╕реНрдЯрдо рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬрд╝реЛрд░ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ рдХрд┐ рдпрд╣ рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╢рдмреНрдж рдХреЗ рдмрд╛рдж . рдЙрдкрдпреЛрдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рджреГрдврд╝рддрд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдмреЗрд╣рддрд░ IDE рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП . рд╕рд╛рде рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо Intellij IDEA рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкреВрд░рд╛ рдХрд░рдиреЗ рдЬреИрд╕реА . рд╕рд╛рде рдХрд┐рд╕реА рднреА рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕рд╢рдХреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред

рд╣рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ await рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рджреГрдврд╝рддрд╛ рд╕реЗ await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ . рдмрд┐рдирд╛ рд╡реЗрд░рд┐рдПрдВрдЯ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдореИрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реБрдХрд╛рд╡рдЯ рдХреЗ рд╕рд╛рде рдЕрд╡рд░реБрджреНрдз рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдмреЗрд╣рддрд░ рдЬреЛрд░ рджреЗрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рд░реВрдкрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.request(url, Method::GET, None, true)
        await?.res.json::<UserResponse>()
        await?.user
        .into();
    Ok(user)
}

рдФрд░ рдЬреНрдпрд╛рджрд╛ рдЙрджрд╛рд╣рд░рдг

// A
if db.is_trusted_identity(recipient.clone(), message.key.clone()) 
    await? {
    info!("recipient: {}", recipient);
}

// B
match db.load(message.key)
    await? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .send()
    await?.error_for_status()?;

// D
let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .send()
    await?.error_for_status()?
    .json()
    await?;

// E
let mut res: Response = client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .send()
    await?.error_for_status()?
    .json()
    await?;

рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.request(url, Method::GET, None, true)
        yield?.res.json::<UserResponse>()
        yield?.user
        .into();
    Ok(user)
}

// A
if db.is_trusted_identity(recipient.clone(), message.key.clone()) 
    yield? {
    info!("recipient: {}", recipient);
}

// B
match db.load(message.key)
    yield? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .send()
    yield?.error_for_status()?;

// D
let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .send()
    yield?.error_for_status()?
    .json()
    yield?;

// E
let mut res: Response = client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .send()
    yield?.error_for_status()?
    .json()
    yield?;


рдпрд╣ рднреА рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @ivandardi рдмрд┐рдВрджреБ рдХрд╛ рдЬрд╡рд╛рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдореИрдВ рд╕рднреА рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдЗрдВрддрдЬрд╛рд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд╛рддреЗ рд╣реИрдВред рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдПрдВ рдЧрд▓рдд рдорд╣рд╕реВрд╕ рдХрд░рддреА рд╣реИрдВ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЛ рдЬрдВрдЬреАрд░реЛрдВ рдХреЛ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рддреБрд▓рдирд╛ ( match рд░реВрдк рдореЗрдВ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП):

post(url)?.multipart(form).send()?.match?.error_for_status()?.json().match?

рд╕реЗрд╡рд╛

let value = await post(url)?.multipart(form).send()?.error_for_status()
                 .and_then(|resp| resp.json()) // and then parse JSON

// now handle errors

рдмреАрдЪ рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХреА рдХрдореА рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВ? рдХреНрдпреЛрдВрдХрд┐ рдЪрд╛рдЗрдирд┐рдВрдЧ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдмреЗрд╣рддрд░ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ send() рдЙрд╕ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╕реНрдЯрдо рднрд╡рд┐рд╖реНрдп рджреЗрддрд╛ рд╣реИ, рддреЛ рдХрд╣реЛ, рдЧреИрд░-200 рд╕реНрдерд┐рддрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╣рд╛рд░реНрдб рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрднреА, reqwest рдХрдо рд╕реЗ рдХрдо, рдпрд╣ рдПрдХ рдирдП рднрд╡рд┐рд╖реНрдп рдХреА рдмрдЬрд╛рдп рд╕рд╛рджреЗ Result рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдпрд╣рд╛рдВ рдореБрджреНрджрд╛ рдЖ рд░рд╣рд╛ рд╣реИред

рдЪрд╛рдЗрдирд┐рдВрдЧ рд╡реЗрдЯреНрд╕ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдПрдХ рдордЬрдмреВрдд рдХреЛрдб рдЧрдВрдз рд╣реИ, рдФрд░ .await рдпрд╛ .await() рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░реЗрдВрдЧреЗ рдпрд╣ рдордЬрд╝реЗрджрд╛рд░ рднреА рдирд╣реАрдВ рд╣реИред .await рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рдпрд╛ рдкреАрдПрдЪрдкреА рд╕реЗ рдмрд╛рд╣рд░ рдХреА рддрд░рд╣ рдХреБрдЫ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЪрд░ рд╕рджрд╕реНрдп рдПрдХреНрд╕реЗрд╕ рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

await рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рд╛рдордиреЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ "рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕" рдирд╣реАрдВ "рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░, рд╣рдо рдЗрд╕ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ"ред рдмрд╛рдж рдХрд╛ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ and_then рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХрд╛ async / await рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╡рд╛рдпрджрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рддрд░рд╣ рд╣реИред рд╡реЗ рджреЛрдиреЛрдВ рдЖрд▓рд╕реА рд╣реИрдВ, рдХрдИ рд░рд╛рдЬреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ ( for-in рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, await рд╡рд╛рдпрджрд╛ рдХреЗ рд╕рд╛рде) рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рддрд╛рдХрд┐ рд╡реЗ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рддрд░рд╣ рдПрдХ рд╕рд╛рде рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛ рд╕рдХреЗрдВ рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдпрд╣рд╛рдБ рд╣реИрдВ, рд╣реИ рдирд╛? рд╡реЗ рдЬреБрддрд╛рдИ рдХреЗ рд▓рд┐рдП рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ async рдСрдкрд░реЗрд╢рдВрд╕ / рдлреНрдпреВрдЪрд░реНрд╕ рдХреЛ рдПрдХ рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ред рдпрд╣ рдмрд▓реНрдХрд┐ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рдХреБрдЫ рд╕рдВрдХреЗрдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдВрдмрд╡рдд рд╕реНрдХрд┐рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХрд╣рд╛рдВ рд╣реЛрддрд╛ рд╣реИред рдореЗрд░реА рджреГрд╖реНрдЯрд┐ рдЙрд╕ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдмреАрдЪ рдореЗрдВ рдЕрдЯрдХ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЪреАрдЬреЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЬрд╛рдПрдВрдЧреА рдореИрдВ рдмрд╕ рдХрдЪреНрдЪреЗ рд╡рд╛рдпрджрд╛ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВред

рд╣рд░ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреГрдкрдпрд╛ рдЗрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝реЗрдВред

Async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ ред

рдпрд╣ рдирдИ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬреЛ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ "рдЪрд▓реЛ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рджреЗрдВ" рдХреЗ рдХреЛрдИ рднреА рд╕реБрдЭрд╛рд╡ рдСрдл-рдЯреЙрдкрд┐рдХ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд╛рди рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдмреАрдЪ рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХреА рдХрдореА рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВ? рдХреНрдпреЛрдВрдХрд┐ рдЪрд╛рдЗрдирд┐рдВрдЧ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдмреЗрд╣рддрд░ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╝рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ async рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рд╕реБрдВрджрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг:

req.into_body().concat2().and_then(move |chunk| {
    from_slice::<Update>(chunk.as_ref())
        .into_future()
        .map_err(|_| {
            ...
        })
        .and_then(|update| {
            ...
        })
        .and_then(move |(user, file_id, chat_id, message_id)| {
            do_thing(&file_id)
                .and_then(move |file| {
                    if some_cond {
                        Either::A(do_yet_another-thing.and_then(move |bytes| {
                            ...

                            if another_cond {
                                ...
                                Either::A(
                                    do_other_thing()
                                        .then(move |res| {
                                            ...
                                        }),
                                )
                            } else {
                                Either::B(future::ok(()))
                            }
                        }))
                    } else {
                        Either::B(future::ok(()))
                    }
                })
                .map_err(|e| {
                    ...
                })
        })
        // ...and here we unify both paths
        .map(|_| {
            Response::new(Body::empty())
        })
        .or_else(Ok)
})

рд╕рдВрдпреЛрдЬрдирдХрд░реНрддрд╛ рдпрд╣рд╛рдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ (рдореИрдВрдиреЗ рджреЛ рдмрд╛рд░ рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЕрд╕рдлрд▓ рд░рд╣рд╛)ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдВрдд рдореЗрдВ Either:A(Either:A(Either:A(...))) рдХрд╛ рдЯрди рд╣реИред

OTOH рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

@Pauan рдиреЗ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИред рдРрд╕рд╛ рд╣реА рд╣реЛрдЧрд╛ред рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рди рдХрд░реЗрдВ, async/await рд╕рдорд╛рди рдирд╣реАрдВ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдареАрдХ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣реИрдВред


рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рдмрдиреЗрдВрдЧреЗред

рдЯрд╛рдЗрдк рдПрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рддреЗ рд╣реБрдП, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреИрд╕реЗ await рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрд░рдХреНрд╖рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ .await рдпрд╛ .await() рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рджрд╕реНрдп рдлрд╝реАрд▓реНрдб / рд╡рд┐рдзрд┐ рдкрд╣реБрдВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп "рдЕрд╕реНрдХреНрд░рд┐рдкреНрд╢рди" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, (рдпрд╛рдиреА, "рдореБрдЭреЗ await рдХреНрдпрд╛ рджреЗрдВ

рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП yield await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

let result = connection.fetch("url"):yield?.collect_async():yield?;

рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

let result = connection.fetch("url") : yield?
    .collect_async() : yield Vec<u64>?;

рд▓рд╛рдн: рдЕрднреА рднреА рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ (IMHO), рдХреНрд╖реЗрддреНрд░ / рд╡рд┐рдзрд┐ рдкрд╣реБрдВрдЪ рд╕реЗ рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред
рдиреБрдХрд╕рд╛рди: рдЯрд╛рдЗрдк рдПрд╕реНрдХреНрд░рд┐рдкреНрд╢рди (?) рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рдЯрдХрд░рд╛рд╡, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рдХрдИ рдорд▓реНрдЯреАрдкреНрд▓реЗрдпрд░:

foo():yield:yield

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╣реБрдЖ рдХрд┐ 2 рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рд╣реЛрдЧрд╛:

let result = connection.fetch("url") : yield?
    .collect_async() : yield : Vec<u64>?;

@Pauan рдЙрд╕ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЛ рдУрд╡рд░рдкреНрд▓рд┐рдк рдХрд░рдирд╛ рдЕрдиреБрдЪрд┐рдд рд╣реЛрдЧрд╛ред рд╕рдВрдпреЛрдЬрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рд╣рдореЗрд╢рд╛ рдпрд╣ рдереА рдХрд┐ рдПрдХ рд╕рд╣рдЬ рднрд╡рд┐рд╖реНрдп 'static рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдкрдиреЗ рдЙрди рд╕рдВрдпреЛрдЬрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЪрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛, рддреЛ рдЖрдк рдПрдХ рдРрд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП рдЬреЛ 'static ред рд▓реЗрдХрд┐рди рдПрдХ рдЧреИрд░ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ 'static fn рдЖрдк рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рднрд╡рд┐рд╖реНрдп async рдирд╣реАрдВ рд╣реИ 'static ред рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

`` `рдЬрдВрдЧ
// рд╕реНрд▓рд╛рдЗрд╕: рдФрд░ [рдЯреА]

let x = рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВред and_then (! iред рдЕрдЧрд░ slice.contains (i) {async_fn (slice)});

рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдХреБрдЫ рдиреЛрдЯреНрд╕ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕реЗ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛:

  • рдЙрдкрд╕рд░реНрдЧ await рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рддрдм рд╣реИ рдЬрдм рдЖрдк рдЗрд╕рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдХрд┐рд╕реА async fn рдХреЗ рдЕрдВрджрд░) рдпрд╛ рдмрд╛рд╣рд░ (рдХреБрдЫ рд╕реНрдереВрд▓ рд╢рд░реАрд░ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ)ред
  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЬрдВрдЬреАрд░реЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рдЕрдиреНрдп рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдЖрдк рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрдВрдж рдпрд╛ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рдЖрдкрдХрд╛ awaits рдмрд╣реБрдд рдХрдо рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рдЕрдирджреЗрдЦреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
  • рдореБрдЭреЗ рдЫрджреНрдо рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ .await рдмрд╣реБрдд рдЕрдЬреАрдм рд▓рдЧрддреЗ рд╣реИрдВред рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред
  • рдЕрдЧрд░ рдореИрдВ рдЖрдИрдбреАрдИ рдбрд┐рдЯреЗрдХреНрд╢рди рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рддреЛ рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВред рдХреЛрдИ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдкрд░ рдкрдардиреАрдпрддрд╛ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЯреВрд▓реАрдВрдЧ рдХреЗ рд▓рд┐рдП рдкреИрджрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЖрдИрдбреАрдИ / рд╕рдВрдкрд╛рджрдХреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рднрд╛рд╡рдирд╛ рдХреЛ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ await!() рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ "рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ"ред рдореИрдХреНрд░реЛрдВ рд░рд╕реНрдЯ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдирд╛рдЧрд░рд┐рдХ рд╣реИрдВ ред рд╡реЗ рдХреЗрд╡рд▓ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ рд╣реИрдВред рдХрдИ "рдирд┐рд░реНрдорд┐рдд" рдореИрдХреНрд░реЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдФрд░ рд╡рд╣рд╛рдБ рдирд╣реАрдВ рдорд╛рддреНрд░ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВред format!() рд╕рдВрдХрд▓рдХ рдХреЛ рд╕реНрдЯреИрдЯрд┐рдХрд▓реА рдЯрд╛рдЗрдк-рдЪреЗрдХрд┐рдВрдЧ рдлреЙрд░реНрдореЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рд╢рдХреНрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред include_bytes!() рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрдВрджрд░ рд╡рд┐рд╢реЗрд╖ рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред рдЗрд╕реЗ рдореВрд▓ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдФрд░ рдпрд╣ рдореЗрд░реА рддрд░рд╣ рдХрд╛ рд╣реИ: рдореИрдХреНрд░реЛрдЬрд╝ рдПрдХ рд╕рдорд╛рди рдФрд░ рдЕрдирд┐рд╢реНрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдХрд▓рдХ рдЬрд╛рджреВ рддрд░реАрдХрд╛ рд╣реИред рдЕрджреНрд╡реИрдд рдЗрд╕рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ: рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЗрдирдкреБрдЯ рд╕рд┐рд░реНрдл рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдФрд░ рдЬреИрд╕реЗ рдХрд┐, рдпрд╣ рдПрдХ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрд╣рд╕рд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдлрд┐рдЯ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреАрд╡рд░реНрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдпрджрд┐ рдпрд╣ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдирдВрдЧреЗ рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЫрд┐рдкрд╛рдиреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдХреЛ рдирд╣реАрдВ рд╕рдордЭрддрд╛ рд╣реВрдВред рдпрд╣ рд╕рд┐рд░реНрдл рдЧрд▓рдд рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХреА рддрд░рд╣ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рднреА рдирд╣реАрдВ рд╣реИ (рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХрд╣рддреЗ рд╣реИрдВ, рдЪреАрдиреА рдХреЗ рд╕рд╛рде рдЧреЗрдЯреНрдЯрд░ / рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ), рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдирд╛ тАЛтАЛрдЕрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рднрд╛рд╖рд╛ рдЖрдЬ рдХреНрд╖реЗрддреНрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред

@ H2CO3 await! рдореИрдХреНрд░реЛ рджреЛ рдЧреБрдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣рд░ рд╡рд╛рдВрдЫрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ:

  1. рдЬрдм рдЖрдк рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рддрдм рддрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмреНрд░реЗрд╕рд┐рдЬрд╝ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрддреЗ рд╣реИрдВред рдЬрдВрдЧ рдиреЗ рдЙрд╕реА рдХрд╛рд░рдг if/while/... рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ (рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ)ред рдпрд╣ рдорд╣рддреНрд╡рд╣реАрди рдПрдЯреАрдПрдо рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдорд▓рд╛ рд╣реИ
  2. async рдПрдХ рдЦреЛрдЬрд╢рдмреНрдж рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╡рд┐рд╖рдорддрд╛ред Async рдХреЛ рдХреБрдЫ рдмрдбрд╝рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╕ рдореЗрдердб рдмреЙрдбреА рдореЗрдВ рдПрдХ рдореИрдХреНрд░реЛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред рдЕрдиреНрдпрдерд╛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ #[async] рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмреНрд▓реЙрдХ рдЖрджрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ await рдХреАрд╡рд░реНрдб рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреА рдХреБрдЫ рдЙрдореНрдореАрдж рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдпрд╣ рдЙрдореНрдореАрдж рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЕрдиреБрднрд╡ рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИред рдЗрд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЕрдиреНрдпрдерд╛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ #[async] рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдпрд╣ рдерд╛, рдФрд░ рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИред рд╣рдо рдПрдХ рдФрд░ рдХреАрд╡рд░реНрдб рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрдмрдХрд┐ #[async] рд╡рд┐рд╢реЗрд╖рддрд╛ рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЕрдм рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреИрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореИрдХреНрд░реЛрдЬрд╝ рд╕реНрдерд┐рд░ рд╣реИ, рдпрд╣ рдмрд╛рдХреА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рднреА рд╡рд╛рдХреНрдпрдЧрдд рдФрд░ рд╢рдмреНрджрд╛рд░реНрде рджреЛрдиреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рд╡рд╣ рдЕрднреА рднреА рдЬреНрдЮрд╛рдд рд╣реЛред (рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рд╛) рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ред

@ H2CO3 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ await рд╣реЛрдиреЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╛ рд▓рд╛рдн рдХреНрдпрд╛ рд╣реИ? рдХреНрдпрд╛ рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореИрдХреНрд░реЛрдЬрд╝ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдкреНрд░рд╡рд╛рд╣?

@ I60R рдХрд╛ рд▓рд╛рдн рдмрд╛рдХреА рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдПрдХрд░реВрдкрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдЕрднреА рддрдХ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рд╕рднреА рд╕рд╛рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдпрд╣ рдЕрдкрдиреЗ рд╕рд╛рде рд▓рд╛рдПрдЧрд╛ - рдЬреИрд╕реЗ рдкреВрд░реНрд╡рддрд╛ рдФрд░ рд╕рдореВрд╣рди рдПрдХ рдореИрдХреНрд░реЛ рдЖрд╣реНрд╡рд╛рди рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рджреВрд╕рд░рд╛ рднрд╛рдЧ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреНрдпреЛрдВ рд╣реИ - рдХреНрдпрд╛ рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореИрдХреНрд░реЛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдирдпрд╛ рдХрд░рддрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдмрд┐рд▓реНрдЯ-рдЗрди рдореИрдХреНрд░реЛ рдХреБрдЫ "рдЕрдЬреАрдм" рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ (рдпрдереЛрдЪрд┐рдд / рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ / рдЖрджрд┐) рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред await!() рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рдирдпрд╛ рдШреБрд╕рдкреИрдард┐рдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдореИрдВ рдкрд╣рд▓реЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЗрдВрддрдЬрд╛рд░ , рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧреИрд░ chainable рдЗрдВрддрдЬрд╛рд░ ред

рд╕рдореБрджрд╛рдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣реБрдд рджреГрдврд╝рддрд╛ рд╕реЗ рд▓рдЧрддрд╛ рд╣реИ (рдореИрдВ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди ...)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЦреЛрдЬрдХрд░реНрддрд╛ рдХреА рдЧреНрд░реЗрдиреНрдпреБрд▓рд┐рдЯреА рд╡рд╣ рд╣реИ рдЬреЛ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ (рдпрд╛рдиреА рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИ)ред

[ рдЪреЗрддрд╛рд╡рдиреА : рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реБрдЭрд╛рд╡ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдореМрдХрд╛ рджреЗрдВ]

рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдБ рдХрд┐ рдХреНрдпрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдореБрджрд╛рдп рд╕рдордЭреМрддрд╛ рдХрд░реЗрдВрдЧреЗ рдФрд░ "рдЖрдВрд╢рд┐рдХ-рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╢реНрд░рдВрдЦрд▓рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмрд╛рд░ рдкрдврд╝рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ?

await response = client.get("https://my_api").send()?.json()?;

рдпрд╣ рдбреА-рд╕реНрдЯреНрд░рдХреНрдЪрд░рд┐рдВрдЧ рдХреЛ рдорд╣рддреНрд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдбреА-рд╕реНрдЯреНрд░рдХреНрдЪрд░рд┐рдВрдЧ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВред

// Value de-structuring
let (a, b, c) = ...;

// De-sugars to:
let _abc = ...;
let a = _abc.0;
let b = _abc.1;
let c = _abc.2;
// Expression de-structuring
await response = client.get("https://my_api").send()?.json()?;

// De-sugards to:
// Using: prefix await with explicit precedence
// Since send() and json() return impl Future but ? does not expect a Future, de-structure the expression between those sub-expressions.
let response = await (client.get("https://my_api").send());
let response = await (response?.json());
let response = response?;



md5-eeacf588eb86592ac280cf8c372ef434



```rust
// If needed, given that the compiler knows these expressions creating a, b are independent,
// each of the expressions would be de-structured independently.
await (a, b) = (
    client.get("https://my_api_a").send()?.json()?,
    client.get("https://my_api_b").send()?.json()?,
);
// De-sugars to:
// Not using await syntax like the other examples since await can't currently let us do concurrent polling.
let a: impl Future = client.get("https://my_api_a").send();
let b: impl Future = client.get("https://my_api_b").send();
let (a, b) = (a.poll(), b.poll());
// return if either a or b is NotReady;

let a: impl Future = a?.json();
let b: impl Future = b?.json();
let (a, b) = (a.poll(), b.poll());
// return if either a or b is NotReady;
let (a, b) = (a?, b?);

рдореИрдВ рдХреЛрд░ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдЦреБрд╢ рд░рд╣реВрдВрдЧрд╛, "рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмрд╛рд░ рдкрдврд╝рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ"ред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рднреА рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рд╣реИред

@yazaddaruvala рдКрдкрд░ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдереА рдЗрд╕рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВред

рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдБ рдХрд┐ рдХреНрдпрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдореБрджрд╛рдп рд╕рдордЭреМрддрд╛ рдХрд░реЗрдВрдЧреЗ рдФрд░ "рдЖрдВрд╢рд┐рдХ-рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ? рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рд╢реНрд░рдВрдЦрд▓рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмрд╛рд░ рдкрдврд╝рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ?

  1. рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдореБрджрд╛рдп рдЖрдВрд╢рд┐рдХ-рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреБрдЫ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдВрдЧ рдореВрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг "рд╕реНрдкрд╖реНрдЯ рд╕рдм рдХреБрдЫ" рдХреА рддрд░рд╣ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрд╛рд╕реНрдЯреНрд╕ u8 -> u32 рдПрдХреНрд╕рдкреНрд▓рд┐рд╕рд┐рд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рдВрдХрд▓рдХ рдХреЛ Vec<Future> рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
await response = client.get("https://my_api").send()?.json()?.parse_as::<Vec<String>>()?.map(|x| client.get(x))?;

рдХреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдиреЗрд╕реНрдЯреЗрдб рдХреЙрд▓ рдХреЗ рд▓рд┐рдП await рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдареАрдХ рд╣реИ, рд╣рдо рд╢рд╛рдпрдж рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕рд▓рд┐рдП рдиреЗрд╕реНрдЯреЗрдб mapFunc рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рд▓реЗрдХрд┐рди рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рддреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрдХ рдХреЛрдб рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рд╣реИ, рддреЛ "рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рд╡реИрд▓реНрдпреВ" рдЬреИрд╕реА рдХреЛрдИ рднреА рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ рдЗрд╕реЗ рддреЛрдбрд╝ рджреЗрддреА рд╣реИред

@yazaddaruvala

рдХреНрдпрд╛ рдореИрдВ рдЖрдкрдХреЛ рд╕рд╣реА рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдк рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╕рднреА рдкреНрд░рддреНрдпрд╛рд░реЛрдкрд┐рдд рднрд╡рд┐рд╖реНрдп рдХреЛ рдЫрд┐рдбрд╝рдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрдЧрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде ? рд╕реЗ рдЕрдзрд┐рдХ рдкреВрд░реНрд╡рддрд╛ рд▓реЗрддреЗ рд╣реИрдВред = "7"> рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд░рд┐рдЯрд░реНрди?

рдиреАрдЪреЗ рдпреЗ рддреАрди рдХрдерди рд╕рдорддреБрд▓реНрдп рд╣реИрдВ:

// foo.bar() -> Result<impl Future<_>, _>>
let a = await foo.bar()?;
let a = await (foo.bar()?);
await a = foo.bar()?;

рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдпреЗ рджреЛрдиреЛрдВ рдХрдерди рд╕рдорддреБрд▓реНрдп рд╣реИрдВ:

// foo.bar() -> impl Future<Result<_, _>>
await a = foo.bar()?;
let a = await (foo.bar())?;

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЖрджрд░реНрд╢ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ рдЬреЛ "рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдирд┐рд╣рд┐рдд рд╕рдВрджрд░реНрдн" рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣рд╛рдВ рдкрд░ рдЕрдзрд┐рдХ рдорд╣реАрди рджрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд▓рдШреБ рд╡рди-рд▓рд╛рдЗрдирд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдХрдИ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдХрдИ рдорд╛рдирд╡ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рдорд╛рдирддрд╛ рдХрд╛ рд▓рд╛рдн рд╣реИред рдпрджрд┐ рдЕрдВрдд рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддреНрдпрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВ рдХрднреА-рдХрднреА Await!() рдореИрдХреНрд░реЛ (рдпрд╛ рдЬреЛ рднреА рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛, рдЬрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЭреБрдХрд╛рд╡ рд╣реИ рдЕрдВрдЧреНрд░реЗрдЬреА рд╡рд╛рдХреНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдЧрд╣рд░рд╛рдИ рд╕реЗ-рдкрд░рд┐рдЪрд┐рдд рдкрд░рд┐рдЪрд┐рдд рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреЛрдб рдХреЗ рдорд╛рдирд╕рд┐рдХ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬрдВрдЬреАрд░рджрд╛рд░ рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдп рд░реВрдкреЛрдВ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ-рдкрд░-рдЙрджреНрджреЗрд╢реНрдп-рддрдереНрдпреЛрдВ рдХрд╛ рджреГрд╢реНрдп рд╣реИ, рдЬреЛ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдХреА рдорд╛рдирд╡реАрдп рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде рдмреЛрд▓реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдмреНрд╕рд┐рдбреА рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдлреЙрд░реНрдо рдХрд╛ рд╕рд╛рджрдЧреА рд▓рд╛рдн рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЛрдиреЛрдВ рд╣реЛрдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдХреЛрдб рд╕реНрдкрд╖реНрдЯрддрд╛ рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдирд┐рдХрд▓рддреЗред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╣реИ, рдЬреЛ рдХреЛрдб рдХреЗ рд╡рд░реНрддрдорд╛рди рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдХрдо рд╕реЗ рдХрдоред

@Pzixel

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдореБрджрд╛рдп рдЖрдВрд╢рд┐рдХ-рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреБрдЫ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬрдВрдЧ рдореВрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг "рд╕реНрдкрд╖реНрдЯ рд╕рдм рдХреБрдЫ" рдХреА рддрд░рд╣ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдирд┐рд╣рд┐рдд рдХрд╛ рд╕рдордЭреМрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

  • рдлрд╝рдВрдХреНрд╢рди рд╕реНрдХреЛрдк рдкрд░ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ

    • рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рджрд╛рдпрд░реЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

    • рдХреНрд▓реВрдЬ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╣реИ

    • рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  • рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрдлрдЯрд╛рдЗрдо рдЖрд╡рд╢реНрдпрдХ рд╣реИред

    • рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдерд╛рдиреАрдп рджрд╛рдпрд░реЗ рдХреЗ рднреАрддрд░ рд╡реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

    • рдлрд╝рдВрдХреНрд╢рди рд╕реНрддрд░ рдкрд░ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдм рд╡реЗ рд╕рднреА рд╕рдорд╛рди рдореВрд▓реНрдп рд╣реИрдВред

  • рдореБрдЭреЗ рдкреВрд░рд╛ рднрд░реЛрд╕рд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдФрд░ рдЕрдзрд┐рдХ рдЪреАрдЬреЗ рд╣реИрдВред

рдЪреЗрдирд┐рдВрдЧ рдХреЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ / рдХрдерди рдХреЗ рдЕрдиреБрд╕рд╛рд░ await рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рд╕реНрдкрд╖реНрдЯ рдФрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдЪрд┐рдд рд╕рдордЭреМрддрд╛ рд╣реИред

рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡реАрдИрд╕реА рдХреЗ рд╕рд╛рде рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

await response = client.get("https://my_api").send()?.json()?.parse_as::<Vec<String>>()?.map(|x| client.get(x))?;

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЧрд▓рддреА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдВрддрд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ Vec<impl Future> рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХрд┐рд╕реА рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

// Given that json() returns a Vec<imple Future>,
// do I use .await on the `Vec`? That seems odd.
// Given that the client.get() returns an `impl Future`,
// do I .await inside the .map? That wont work, given Iterator methods are not `async`
client.get("https://my_api").send().await?.json()[UNCLEAR]?.parse_as::<Vec<String>>()?.map(|x| client.get(x)[UNCLEAR])?;

рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ Vec<impl Future> рдПрдХ рдЦрд░рд╛рдм рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдпрд╛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдПрдХ рд╣реА рдорд╛рдирдХ рдкрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдмреАрдЪ, "рдЖрдВрд╢рд┐рдХ-рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ I рдиреЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬреИрд╕реЗ await (a, b) = (client.get("a")?, client.get("b")?); рд╕рд╛рдорд╛рдиреНрдп рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдпрд╛ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ let (a, b) = (client.get("a") await?, client.get("b") await?); рдЕрдиреБрдХреНрд░рдорд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ

2011 рдореЗрдВ рд╡рд╛рдкрд╕, рдЬрдм C # рдореЗрдВ async рдлреАрдЪрд░ рдЕрднреА рднреА рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдерд╛, рдореИрдВрдиреЗ await рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ рдкреВрдЫрд╛ рдФрд░ C # рднрд╛рд╖рд╛ PM рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реАред рдЪреВрдБрдХрд┐ Rust рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд░реНрдЪрд╛ рд╣реИ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣рд╛рдБ рдЙрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХрд╛ 'рдЗрдВрддрдЬрд╛рд░' рдХреНрдпреЛрдВ рд╣реИ? :

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдмрд┐рдВрджреБ рдерд╛, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЕрдм рд╡рд╣рд╛рдВ рдкрд░ рдмрд╕реЗ рд╣реИрдВ :-)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдордиреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░реНрд╕ рдкрд░ рдЬреНрдпрд╛рджрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ (cf. рдПрдЪрдкреА рдХреИрд▓реАрдХреБрд▓реЗрдЯрд░реНрд╕ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдлреЛрд░реНрде) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╕ рдХреБрдЫ рд╣реИ рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХрдо рд╕реНрд╡реАрдХрд╛рд░реНрдп рдпрд╛ рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рддрд░рд╣ рд╕реЗ рдЧрдгрд┐рдд рдХреА рдзрд╛рд░рдгрд╛ рд╣рдореЗрдВ рдмрдЪреНрдЪреЛрдВ рдХреА рддрд░рд╣ рд╕рдордЭрддреА рд╣реИ ...

рд╣рдордиреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд╛рдпрд╛ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдЪрд╛рд▓рдХ (рдЗрд╕рдХреЗ рд╢рд╛рдмреНрджрд┐рдХ рд╕реНрд╡рд╛рдж рдХреЗ рд╕рд╛рде - "рдРрд╕рд╛ рдХрд░реЛ!") рдЕрдм рддрдХ рд╕рдмрд╕реЗ рд╕рд╣рдЬ рдерд╛ред рд╣рдорд╛рд░реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдкрд░реЗрдВрдЯрд┐рд╕ рдСрдкрд░реЗрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд╕рд░реНрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдЙрд╕рдХреЗ рд╕рд╛рде рдлрд┐рдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИред рд╣рд╛рдВ рдпрд╣ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдбреВрдм рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреНрд░рдо рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реИред рдЖрдк рдкрд╣рд▓реЗ рддрд░реНрдХреЛрдВ (рдЬреЛ рджрд╛рдИрдВ рдУрд░ рд╣реИрдВ) рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди (рдЬреЛ рдмрд╛рдИрдВ рдУрд░ рд╣реИ) рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рдВ, рд╕реА # рдореЗрдВ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдЕрдВрддрд░ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ (рдФрд░ рдЦреБрдж рдХреЛ рдЕрдкрдирд╛ рдЪреБрдХрд╛ рд╣реВрдВ) рджреЗрдЦрддрд╛ рд╣реВрдВ, рдПрдХ рдРрд╕реА рд╢реИрд▓реА рд╣реИ рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдореБрдЭреЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ

var bResult = await A().BAsync();
var dResult = await bResult.C().DAsync();
dResult.E()

рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рд╕рднреА рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рд╕рд░рд▓ рднрд╛рд╡ (рдЕрд░реНрдерд╛рдд рд╡реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рднреА рддрд░реНрдХ рд╣реИрдВ; рд╡реЗ рд╢рд╛рдпрдж рдареАрдХ рд╣реИрдВ) рдФрд░ рдореИрдВ рджреЛрдиреЛрдВ рдиреМрдХрд░рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд╛рдиреАрдп рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рд╕реЗ рдмрдЪреВрдВрдЧрд╛ред ред

рд╕рд╣реА рдмрд╛рдд?

рдореИрдбреНрд╕ рдЯреЙрд░реНрдЧреЗрд╕реЗрди, рд╕реА # рднрд╛рд╖рд╛ рдкреАрдПрдо


C # рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореЗрд░рд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореБрдЭреЗ рдХрдИ рдХрдердиреЛрдВ рдХреА рдЙрд╕ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдордХрдХреНрд╖ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдЬреАрдм рдмрдирд╛рддрд╛ рд╣реИред

@yazaddaruvala

рдореИрдВ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдирд┐рд╣рд┐рдд рдХрд╛ рд╕рдордЭреМрддрд╛ рд╣реИ

рдпрд╣ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИред рдореИрдВ рд╡рд┐рд╖рдп btw рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд▓рд┐рдВрдХ рдХрд░ рд╕рдХрддреЗ

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЧрд▓рддреА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╡рд┐рд╢рд╛рд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдВрддрд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рд╡реАрдИрд╕реА рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдгрдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреНрдпреЛрдВ рд╣реБрдИ? рдореБрдЭреЗ рдЦреБрд╢реА рд╣реИ рдХрд┐ Vec<impl future> рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХрд┐ рдореИрдВ рдлрд┐рд░ рдПрдХ рд╕рд╛рде рдЬреБрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВред рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реАрдорд╛рдПрдБ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рддрд░реНрдХ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╡реАрдИрд╕реАрдПрдХ рдЦрд░рд╛рдм рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдпрд╛ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЙрд╕реА рдорд╛рдирдХ рдкрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдореЗрдВ рд╣рд░ рдорд╛рдорд▓реЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рд╣рдо рдХреЗрд╡рд▓ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ "рдореЗрд╣, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХреЛрдИ рднреА рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рд▓рд┐рдЦрддрд╛ рд╣реИ"ред рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХрд┐рдирд╛рд░реЗ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

@ рд▓реЗрд╕реНрдХреЛрдХ рдореИрдВ рд░реБрд╕реНрдд рдХрд╛ C # рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИ: C # рдореЗрдВ рдЖрдк рдХрднреА рднреА (await FooAsync()).Bar() рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдВрдЧ рдореЗрдВ рддреБрдо рдХрд░рддреЗ рд╣реЛред рдФрд░ рдореИрдВ ? рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред C # рдореЗрдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рд╣рд┐рдд рдЕрдкрд╡рд╛рдж рд╣реИ рдЬреЛ async рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рдЪрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдВрдЧ рдореЗрдВ рдЖрдкрдХреЛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ ? рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдмреЗрд╢рдХ, рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ

let foo = await bar();
let bar = await foo?.baz();
let bar = bar?;

рд▓реЗрдХрд┐рди рдпрд╣ рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИ

let foo = await? bar();
let bar = await? foo.baz();

рдпрд╣ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП await рдФрд░ ? doint (await expr)? рдирдП рд╕рдВрдпреЛрдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ, рддреЛ рд╣рдо await?&@# рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рд╕рдВрдпреЛрдЬрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ ... рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рддрдм рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдЧрд╛:

let foo = bar() await?;
let bar = foo.baz() await?;

рдЕрдм await? рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреЛрдХрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдкрд╛рд╕ await?&@# рдФрд░ рдЖрдк рдЗрд╕реЗ рд╕рдВрдХрд▓рдХ рдореЗрдВ рд╣реИрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдмреЗрд╢рдХ, рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдирд┐рд░рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рд╕рднреА рдЬрдВрдЧ / рд╕реА # рдЕрдВрддрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рд╣рдо C # рдЕрдиреБрднрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ Rust / C # рдЕрдВрддрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП await рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рдХ рдерд╛ рдФрд░ рдореИрдВрдиреЗ C # рднрд╛рд╖рд╛ рдХреЗ рджреЗрд╡рд┐рдпреЛрдВ рдХреЛ рднреА рд╡рд┐рд╖рдп рдореЗрдВ рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдерд╛ (рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2011 рд╕реЗ newer рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдирдП рдЬрд╛рдирдХрд╛рд░реА рд╣реИ), рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рдХреАрд╡рд░реНрдб рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдордд рднреВрд▓реЛ рдХрд┐ рдПрдХ рд░рд╛рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рдвреВрдВрдврддреЗ рд╣реИрдВред

рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рдШрдЯрд┐рдд рд╣реБрдЖ рд╣реИ рдХрд┐ рд╣рдо рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдПрдХ рдЙрдкрд╕рд░реНрдЧ async рдХреАрд╡рд░реНрдб
  • рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕реБрд╡рд┐рдзрд╛

рдЬреЛ рдПрдХ рд╕рд╛рде рд╕рдВрдХрд▓рдХ рдЬрд╛рджреВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ .await!() рдореИрдХреНрд░реЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЕрднреА, рдПрдХ рдЙрдкрд╕рд░реНрдЧ .await!() рдореИрдХреНрд░реЛ рдХреЛ рд╕рдВрдХрд▓рдХ рдЬрд╛рджреВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ await рдХреАрд╡рд░реНрдб рдХрд╛ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд┐рд░ рд╣реЛ рдЧрдпрд╛ рдерд╛, рддреЛ рдпрд╣ рдЕрдм рд╕рдЪ рдирд╣реАрдВ рд╣реЛрдЧрд╛: рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ .await!() рдореИрдХреНрд░реЛ рдХреЛ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдЕрдкрдиреЗ рддрд░реНрдХ (рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐) рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд┐рдпрд╛ рд╣реИ await рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдФрд░ рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рдкреЗрдЯрд╛ред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд╛рдн:

  • рдЙрдкрд╕рд░реНрдЧ await рдХреАрд╡рд░реНрдб рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЙрд╕ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рд╣реИред
  • рдЙрдкрд╕рд░реНрдЧ async рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "рд╕реНрдЯреИрдВрдб рдЖрдЙрдЯ" рдХреА async рдкреНрд░рдХреГрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред
  • рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг .await!() , рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдВ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдЬреАрдм рд╣реИред
  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рд▓рд┐рдП (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд) рд╕рдВрдХрд▓рдХ рдЬрд╛рджреВ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА (рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдпрдерд╛ рдЙрдкрд╕рд░реНрдЧ рдХреНрд╖реЗрддреНрд░, рд╡рд┐рдзрд┐ рдпрд╛ рдореИрдХреНрд░реЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА)ред
  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ (рдЬреИрд╕реЗ .or_else!(continue) ) рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╣-рд╕рдВрдпреЛрдЧ рд╕реЗ рд╕рдорд╛рди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдпрдерд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдПрдХ рдЕрдЬреАрдм рдФрд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред
  • рдЙрдкрд╕рд░реНрдЧ await рдХреАрд╡рд░реНрдб рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рддреЗрдЬрд╝реА рд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐) рд╣рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рдирд╛ред рд▓реЗрдХрд┐рди рдордзреНрдпрдо-рд╕реЗ-рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рдж рднреА рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред

@nicoburns , @ H2CO3 ,

рд╣рдореЗрдВ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ await!() рдФрд░ .or_else!(continue) рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рд░реНрдердХ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рд╡реИрд╕реЗ рднреА, рджреЛрдиреЛрдВ рд░реВрдкреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрдВрдЧреА рдФрд░ рдЙрдиреНрд╣реЗрдВ рджреЛрдиреЛрдВ рдХреЛ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдпреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдВрдЧреА, рддреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд┐рдВрддрд╛ рд╣реЛрдЧреА рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рдирд╣реАрдВ рд░рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдпрдорд┐рдд рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдирд┐рдпрдорд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕рд┐рд░реНрдл рд╡рд┐рдЪрд┐рддреНрд░ рдФрд░ рдХреГрддреНрд░рд┐рдо рдЕрдВрддрд░ рд╣реЛрдЧрд╛ (рдЪреВрдВрдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рд╣реИрдВ)ред

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рд▓рд┐рдП рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдЬрд╡рд╛рдм рд╣реИ . рд╕реЗ рдкрд╣рд▓реЗ await : рд╣рдо рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдХреНрд░реЛрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реВрдк рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рд╣реИрдВ, рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП .await!() рдФрд░ .or_else!(continue) рд╕реБрд╡рд┐рдзрд╛рдПрдБ рд╕реБрдВрджрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдЪрд┐рдд рдФрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдореМрдЬреВрдж рд╣реИрдВ: await рдХреАрд╡рд░реНрдб рдФрд░ none -рд╕рдВрдЪрд╛рд▓рди рдСрдкрд░реЗрдЯрд░ред рд╣рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХреЗ рдмрдЬрд╛рдп рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрджрд╕реВрд░рдд рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВред

рд╡рд╣рд╛рдБ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рд╡рд╣рд╛рдБ рдХреБрдЫ рдХреА рддрд░рд╣ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдХреЗ рдмрд╛рдж рд╕реЗ format!() , рд╡рд╣рд╛рдБ рдХреБрдЫ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХреА рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ include_bytes!() , рд╡рд╣рд╛рдБ рдПрдХ рдХрд╕реНрдЯрдо рдбреАрдПрд╕рдПрд▓ рдирд╣реАрдВ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рджреЛрд╣рд░рд╛рд╡ рдХреА рдПрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реИ, рд╡рд╣рд╛рдБ рд╡реИрд░рдЧ-рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреБрдЫ рдЕрд▓рдЧ рджрд┐рдЦрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИред

рд╣рдореЗрдВ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рд░реНрдердХ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред

try!() рдХреЛ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рдХрд╛рд░рдг рдерд╛ред

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╡рд░реНрдгрди рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ await рдПрдХ рдореИрдХреНрд░реЛ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рд╣реЛрдЧрд╛ - рдПрдХ рдирдИ рднрд╛рд╖рд╛ рддрддреНрд╡ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдореМрдЬреВрджрд╛ рд╕реБрд╡рд┐рдзрд╛ рднреА рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИред

format!() рдЬреИрд╕реЗ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ

рдореИрдВ рдЕрд▓рдЧ рд╣реЛрдиреЗ рдХреА рднреАрдЦ рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ: format!() рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕рдВрдХрд▓рди-рд╕рдордп рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдерд╛, рддреЛ рдпрд╣ рдПрдХ рдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡реИрд╕реЗ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред)

рджреЛрдиреЛрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реБрдВрджрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдЪрд┐рдд рдФрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдореМрдЬреВрдж рд╣реИ

рд╣рдореЗрдВ рд╣рд░ рдПрдХ рдлрдВрдХреНрд╢рди рдХреЙрд▓, рдлреНрд▓реЛ рдХрдВрдЯреНрд░реЛрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдпрд╛ рдорд╛рдЗрдирд░ рдлреИрд╕рд┐рд▓рд┐рдЯреА рдХреА рдЕрдкрдиреА рдмрд╣реБрдд рдЦрд╛рд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рдПрдХ рдлреВрд▓рд╛ рд╣реБрдЖ рднрд╛рд╖рд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдФрд░ рдпрд╣ "рд╕реБрдВрджрд░" рдХреЗ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд рд╣реИред

(рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ; рдореИрдВ рдЗрд╕ рдкреНрд░рд╢реНрди рдХреЗ рдЗрд╕ рдкрд╣рд▓реВ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред)

@nicoburns

рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рдШрдЯрд┐рдд рд╣реБрдЖ рд╣реИ рдХрд┐ рд╣рдо рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

  • рдПрдХ рдЙрдкрд╕рд░реНрдЧ await рдХреАрд╡рд░реНрдб
  • рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕реБрд╡рд┐рдзрд╛

рдпрд╣ await рдПрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреАрд╡рд░реНрдб рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреАрд╡рд░реНрдб рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬреЛ рдПрдХ рд╕рд╛рде рд╕рдВрдХрд▓рдХ рдЬрд╛рджреВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ .await!() рдореИрдХреНрд░реЛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдпрд╣ foo await рдпрд╛ foo.await (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдорд╛рдзрд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рд╡рд╛рд░ рд╣реИред рдЕрднреА рднреА "рдЬрд╛рджреВ" рд╣реИ, рдмрд╕ рдЙрддрдирд╛ рд╣реА; рдЖрдкрдиреЗ рдЕрднреА-рдЕрднреА рдПрдХ рд▓реЗрдЦрд╛ рдкреИрдВрддрд░реЗрдмрд╛рдЬрд╝реА рдХреА рд╣реИ ред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд╛рдн:

  • рдЙрдкрд╕рд░реНрдЧ await рдХреАрд╡рд░реНрдб рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЙрд╕ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рд╣реИред

рдЕрдЧрд░ рд╣рдо .await!() рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рджреЗ рд░рд╣реЗ рд╣реИрдВ (рджреЛрдиреЛрдВ await foo рдФрд░ foo.await!() ) рдФрд░ рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреВрдЫреЗрдВрдЧреЗ "рдЬреЛ рдореБрдЭреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП" рдХрдм.."ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХрд▓ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ foo await рдпрд╛ foo.await рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдмрдЬрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ (рдЬреИрд╕реЗ .or_else!(continue) ) рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╣-рд╕рдВрдпреЛрдЧ рд╕реЗ рд╕рдорд╛рди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдпрдерд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдПрдХ рдЕрдЬреАрдм рдФрд░ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдореВрд▓реНрдп рд╣реИ рдФрд░ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ await ing рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдБ .or_else!(continue) рдФрд░ рдХрдИ рдЕрдиреНрдп рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред

  • рдЙрдкрд╕рд░реНрдЧ await рдХреАрд╡рд░реНрдб рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рддреЗрдЬрд╝реА рд╕реЗ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХ рддрдВрддреНрд░ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐) рд╣рдорд╛рд░реЗ рдмрд┐рдирд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рдордзреНрдпрдо-рд╕реЗ-рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рдж рднреА рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред

рдореБрдЭреЗ "рдЦреБрд▓реА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ" рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ; рд░рдЪрдирд╛, рдЖрдИрдбреАрдИ рдЕрдиреБрднрд╡, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХрд╛ рдореВрд▓реНрдп рдЖрдЬ рдЬреНрдЮрд╛рдд рд╣реИред рдореБрдЭреЗ рдЖрдЬ " await foo рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╣рдо foo.await!() рдХрд▓ рдкрд░ рдЖрдо рд╕рд╣рдорддрд┐ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ"ред


@ H2CO3

try!() рдХреЛ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рдХрд╛рд░рдг рдерд╛ред

try!(..) рдХрд╛ рдкрджрд╛рд╡рдирдд рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдпреЛрдЧреНрдп рд╕рдордЭрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рдирд╣реАрдВ рдерд╛ред рдЗрд╕реЗ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ - рдЬреЛ рд╣рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ рдЙрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ - рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, try!(..) рд╕рдВрдХрд▓рдХ рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рд╡реИрд╕реЗ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред)

await "рд╣рд░ рдПрдХ .." рдирд╣реАрдВ рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реБрд╡рд┐рдзрд╛ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИ; рдмрд▓реНрдХрд┐, рдпрд╣ рдПрдХ рдкреНрд░рдореБрдЦ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

@phaylon

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЯреВрд▓реАрдВрдЧ рдХреЗ рд▓рд┐рдП рдкреИрджрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рд╛рд▓ рдХреА рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдЖрдИрдбреАрдИ / рд╕рдВрдкрд╛рджрдХреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ foo.await рдХрд╛ рдорддрд▓рдм рдЯреВрд▓реАрдВрдЧ рдХреЗ рд▓рд┐рдП рдореБрджреНрджреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╕рдорд░реНрдерди рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрдкрд╛рджрдХ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА .ident рдлреЙрд░реНрдо рдХреЛ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ред рд╕рдВрдкрд╛рджрдХ рдХреЛ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдмрд╕ рдХреАрд╡рд░реНрдб рдХреА рд╕реВрдЪреА рдореЗрдВ await рдЬреЛрдбрд╝реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЪреНрдЫреА IDE рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА . рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдкреВрд░рд╛ рд╣реЛрддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдпрд╣ RLS (рдпрд╛ рд╕рдорддреБрд▓реНрдп ...) рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ . рдкрд╣рд▓реЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ await рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ . my_future ред

рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, .await рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рдП рдЧрдП рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╕реЗ рдХрдо рд╣реИ, рдЬреЛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдореЗрдВ .await рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ .$ident рдкрд╛рд░реНрд╕ рдХрд░ ident == keywords::Await.name() рдкрд░ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реИ

рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ foo.await рдХрд╛ рдорддрд▓рдм рдЯреВрд▓реАрдВрдЧ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА рд╕рдВрдкрд╛рджрдХ рдХреЗ рд▓рд┐рдП Rust рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╕рдорд░реНрдерди рдХрд╛ рдХреЛрдИ рднреА рдЙрджрд╛рд╣рд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА .ident рд░реВрдк рдХреЛ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ред рд╕рдВрдкрд╛рджрдХ рдХреЛ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдмрд╕ рдХреАрд╡рд░реНрдб рдХреА рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЪреНрдЫреЗ рдЖрдИрдбреАрдИ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реИред - рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд╣рд▓реЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдПрд▓рдПрд╕ (рдпрд╛ рд╕рдорддреБрд▓реНрдп ...) рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред my_future рдХреЗ рдмрд╛рджред

рдореБрдЭреЗ рдпрд╣ рдХреЗрд╡рд▓ рд╡реНрдпрд╛рдХрд░рдг рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рдзрд╛рдУрдВ рдкрд░ рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рдореБрджреНрджрд╛ рд╕рд┐рд░реНрдл рдЕрдм рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ 5, 10, 20 рд╕рд╛рд▓ рдореЗрдВ рдПрдХ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж рд▓рд╛рдЗрди рдореЗрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдЧреМрд░ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рднреА рдЕрдиреНрдп рдХреАрд╡рд░реНрдб рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдВрдХ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, .рд╡рд╛рдЗрдЯ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рдП рдЧрдП рд╡реНрдпрд╛рдХрд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╕реЗ рдХрдо рд╣реИред рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдореЗрдВ .await рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░ рд░рд╣рд╛ рд╣реИред $ рдкрд╣рдЪрд╛рди рдФрд░ рдлрд┐рд░ рдкрд╣рдЪрд╛рди рдкрд░ рдЧрд▓рдд рди рдХрд░рдирд╛ == рдХреАрд╡рд░реНрдб :: Await .name ()ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдореНрдорд╛рди await!(future) , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реНрдпрд╛рдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИред

@ рдХреЗрдВрджреНрд░ try! рдЕрдВрддрддрдГ рдмреЗрдорд╛рдиреА рд╣реЛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ ? рдСрдкрд░реЗрдЯрд░ рд╕рдЦреНрддреА рд╕реЗ рдЕрдзрд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ "рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдпреЛрдЧреНрдп" рдирд╣реАрдВ рд╣реИред рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ

"рд╣рд░ рдПрдХ .." рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рд╣реИ

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдЕрдиреНрдп (рдЬреИрд╕реЗ or_else ) рд╣реИрдВ, рдФрд░ рдореЗрд░реА рдмрд╛рдд рдЕрднреА рднреА рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рднреА рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдирдП рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдЦрд┐рд▓рд╛рдл рджреВрд╕рд░рд╛ рддрд░реНрдХ рдпрд╣ рд╣реИ рдХрд┐ "рд╡реЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдирд╣реАрдВ рд╣реИрдВ"ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн рд▓рд╛рдЧрдд рдХреЛ рд╕рд╣реА рдард╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд╣рдо рдиреЗрд╕реНрдЯреЗрдб рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдмрдЪ рдЧрдП рд╣реИрдВред рдиреЗрд╕реНрдЯреЗрдб рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред)

рдмреБрдз рдкрд░, 23 рдЬрдирд╡рд░реА, 2019 рдХреЛ 09:59:36 рдЕрдкрд░рд╛рд╣реНрди +0000, рдордЬрд╝реНрджрд╛рдХ рдлрд╝рд┐рд░реЛрдЬрд╝рдЬрд╝рд╛рдж рдиреЗ рд▓рд┐рдЦрд╛:

  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ (рдЬреИрд╕реЗ .or_else!(continue) ) рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╣-рд╕рдВрдпреЛрдЧ рд╕реЗ рд╕рдорд╛рди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдпрдерд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдПрдХ рдЕрдЬреАрдм рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХреЗ рд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдореВрд▓реНрдп рд╣реИ рдФрд░ рдЗрд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ await ing рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдВ .or_else!(continue) рдФрд░ рдХрдИ рдЕрдиреНрдп рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред

.await!() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

.await рдПрдХ рдХреНрд╖реЗрддреНрд░ рдкрд╣реБрдВрдЪ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, .await() рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ
рдХреЙрд▓, рдФрд░ рди рддреЛ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдФрд░ рди рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдмрд╣реЗред .await!() рдПрдХ рдореИрдХреНрд░реЛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд
рдмрд╣реЗред

@joshtriplett рдореИрдВ рдорд╛рдирдХ рдЕрд░реНрде рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдФрдЪрд┐рддреНрдп рдХреЗ рд▓рд┐рдП рдореВрд▓ рддрдереНрдп рд╣реИ рдХрд┐ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рд╡рд╛рдпрджрд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдФрд░ рдкрд┐рди рддрд░реНрдХ рд╣реИ рдХрд┐ рдХреИрд╕реЗ )ред рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ, рд╡реЗрдЯрд┐рдВрдЧ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рд╣реИред рдЖрдк рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛рдБ рдЫреЛрдбрд╝рд╛ рдерд╛, рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рд╣реИред

рдореБрдЭреЗ рдпрд╣ рдХреЗрд╡рд▓ рд╡реНрдпрд╛рдХрд░рдг рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рдзрд╛рдУрдВ рдкрд░ рд▓рдЧрддрд╛ рд╣реИред рдФрд░ рдореБрджреНрджрд╛ рд╕рд┐рд░реНрдл рдЕрдм рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ 5, 10, 20 рд╕рд╛рд▓ рдореЗрдВ рдПрдХ рджреЛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж рд▓рд╛рдЗрди рдореЗрдВ рд╣реИред

рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдореНрдорд╛рди await!(future) , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реНрдпрд╛рдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИред

рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдХрдИ рдЕрдиреНрдп рдХрдорд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдЦрд╛рд░рд┐рдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@ рдХреЗрдВрджреНрд░ try! рдЕрдВрддрддрдГ рдмреЗрдорд╛рдиреА рд╣реЛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ ? рдСрдкрд░реЗрдЯрд░ рд╕рдЦреНрддреА рд╕реЗ рдЕрдзрд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ "рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдпреЛрдЧреНрдп" рдирд╣реАрдВ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╕рдВрдж рди рдХрд░реЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред

рд░реБрд╕реНрдЯ 2018 рдкрд░ try!(expr) рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрджрд╛рд╡рдирдд рдФрд░ рдПрдХ рдХрдард┐рди рддреНрд░реБрдЯрд┐ рд╣реИред рд╣рдордиреЗ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдореВрд╣рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рдЗрд╕реЗ рдЕрдпреЛрдЧреНрдп рд╕рдордЭрд╛ рдЧрдпрд╛ред

.await!() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛ рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

.await рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, .await() рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рди рддреЛ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдФрд░ рди рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░, рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рд╣реИ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ .await рдЖрдорддреМрд░ рдкрд░ рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ? (рдЬреЛ рд╕рдорд╛рд░реЛрд╣ рд╕реНрдерд╛рдиреАрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╣реИ)ред рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдПрдХ рд░реВрдк рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдПрдХ рдореИрдХреНрд░реЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ ред рдХрдИ рдореИрдХреНрд░реЛрдЬрд╝ рдирд╣реАрдВ рдХрд░рддреЗ (рдЙрджрд╛рд╣рд░рдг dbg! , format! , ...)ред рдпрд╣ рд╕рдордЭ рдХрд┐ .await!() рдпрд╛ .await рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧреА ( рдереЛрдбрд╝реЗ рдХрдордЬреЛрд░ рдЕрд░реНрдереЛрдВ рдореЗрдВ ? , рдЬреИрд╕рд╛ рдХрд┐ @HeroicKatora рдХреЗ рдиреЛрдЯ) await рд╢рдмреНрдж рд╕реЗ рдмрд╣рддреА рд╣реИ

@Centril

рдпрд╣ рдПрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреАрд╡рд░реНрдб рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреАрд╡рд░реНрдб рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

EEKред рдпрд╣ рдереЛрдбрд╝рд╛ рджрд░реНрджрдирд╛рдХ рд╣реИред рд╢рд╛рдпрдж рдореИрдХреНрд░реЛ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ .wait!() рдпрд╛ .awaited!() (рдмрд╛рдж рд╡рд╛рд▓рд╛ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ)ред

"рдЬреЛ рдПрдХ рд╕рд╛рде рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдмреИрдЯрд░реА (!) рдореИрдХреНрд░реЛ рдХреЛ рд╕рдВрдХрд▓рдХ рдЬрд╛рджреВ рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред"
рдпрд╣ рдлреВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдпрд╛ рдлреВ.рд╡рд╛рдЗрдЯ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдорд╛рдзрд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рд╡рд╛рд░ рд╣реИред рдЕрднреА рднреА "рдЬрд╛рджреВ" рд╣реИ, рдмрд╕ рдЙрддрдирд╛ рд╣реА; рдЖрдкрдиреЗ рдЕрднреА-рдЕрднреА рдПрдХ рд▓реЗрдЦрд╛ рдкреИрдВрддрд░реЗрдмрд╛рдЬрд╝реА рдХреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ! (..) рдХреЛ рд╕рдВрдХрд▓рдХ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдФрд░ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрд╕рд░реНрдЧ await рдХреАрд╡рд░реНрдб рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдерд╛, рддреЛ .await!() (рд╢рд╛рдпрдж рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рдХреЗ рд╕рд╛рде) рднреА рд╕рдВрдХрд▓рдХ рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдмреЗрд╢рдХ await рдХреАрд╡рд░реНрдб рдЕрднреА рднреА рдХрдВрдкрд╛рдЗрд▓рд░ рдореИрдЬрд┐рдХ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░рд╛рд╢рд┐ рджрд░реНрдЬ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ try!() рдХреЗ рд╕рдВрдмрдВрдз рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред return рдХреАрд╡рд░реНрдбред

рдпрджрд┐ рд╣рдо рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ foo рд╡реЗрдЯ рдпрд╛ foo.await рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдмрдЬрдЯ рдХрд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХрд▓ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рдЬрдЯрд┐рд▓рддрд╛ рдиреНрдпреВрдирддрдо рд╣реИ (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрдЯрд┐рд▓рддрд╛ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд╡реИрд╕реЗ рднреА рдЪрд╛рд╣рддреЗ рд╣реИрдВ ...)ред рджреЛрдиреЛрдВ рд░реВрдк рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╛ рддреЛ рдкрдврд╝рддреЗ рд╕рдордп, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рдЪреБрдирдирд╛ рд╣реИ, рдбреЙрдХреНрд╕ рдмрд╕ рдХреБрдЫ рдРрд╕рд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ:

"рд░реВрд╕реНрдЯ рдореЗрдВ рдлреНрдпреВрдЪрд░ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ: await foo.bar(); рдФрд░ foo.bar().await!() ред рдЬреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рд╢реИрд▓реАрдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ"

рдореБрдЭреЗ "рдЦреБрд▓реА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ" рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ; рд░рдЪрдирд╛, рдЖрдИрдбреАрдИ рдЕрдиреБрднрд╡, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХрд╛ рдореВрд▓реНрдп рдЖрдЬ рдЬреНрдЮрд╛рдд рд╣реИред

рдпрд╣ рд╕рдЪ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдорди рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдзрд┐рдХ рдПрдХреАрдХреГрдд рднрд╛рд╖рд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред

рдЬреНрдпрд╛рджрд╛ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдореИрдВ рдЗрд╕реЗ рднреА рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬрдм рдЕрдЪреНрдЫреА рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИред рддреЛ рдЪреАрдЬреЗрдВ git diff рдФрд░ рдРрд╕реЗ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдмрд╛рд╣рд░ рд╣реЛрддреА рд╣реИрдВред

рд╕рд┐рджреНрдзрд╛рдВрдд рд╣рд╛рдБ рдореЗрдВ, рдФрд░ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдореЗрдВ
рдпрд╣ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдирд┐рд▓рдВрдмрди рдмрд┐рдВрджреБ рдХрд╣рд╛рдБ рд╣реИрдВред

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд╕рд╕реНрдкреЗрдВрдб рдмрд┐рдВрджреБ рдкрд░ RefCell рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░
рдпрджрд┐ RefCell рдерд╛, рддреЛ рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЗрд╕рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдЧрд╛
рдирд┐рд▓рдВрдмрд┐рдд рдмрд┐рдВрджреБ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдмрдбрд╝реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рд╣реЛрдЧрд╛
рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЕрдирдЧрд┐рдирдд рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ, рдЬрд╣рд╛рдВ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди
рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рд╣реИред

рдмреБрдз рдкрд░, 23 рдЬрдирд╡рд░реА, 2019 рдХреЛ рджреЛрдкрд╣рд░ 2:21 рдмрдЬреЗ HeroicKatora рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@joshtriplett https://github.com/joshtriplett рдореИрдВ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛
рдорд╛рдирдХ рдЕрд░реНрдереЛрдВ рдореЗрдВ рдкреНрд░рд╡рд╛рд╣ред рдпрд╣ рдФрдЪрд┐рддреНрдп рд╕рд┐рджреНрдз рдХрд░рдиреЗ рдХрд╛ рдореВрд▓ рддрдереНрдп рд╣реИ
рдЙрдзрд╛рд░ рдЪреЗрдХрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдпрджрд╛ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ
рд╕реНрдерд╛рдиреАрдп рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрди, рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/57640#issuecomment-456989262 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABGmeqcr2g4olxQhH9Fb9r6g3XRaFUu2ks5vGOBkgaJpZM4aBlba
ред

рдмреБрдз рдкрд░, рдЬрдирд╡рд░реА реирей, реирежрез реп рдХреЛ режреи:реирем:реиреж рдмрдЬреЗ -реж Mazрежреж, рдордЬрд╝реНрджрд╛рдХ рдлрд╝рд╛рд░реЛрдЬрд╝рдЬрд╝рд╛рдж рдиреЗ рд▓рд┐рдЦрд╛:

.await!() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛ рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

.await рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, .await() рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рди рддреЛ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдФрд░ рди рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЕрдВрддрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реАрдЦреЗрдВрдЧреЗ

рдЙрдиреНрд╣реЗрдВ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЕрдВрддрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реАрдЦреЗрдВрдЧреЗ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗред (рдЬреЛ рдХрд╛рд░реНрдп рд╕реНрдерд╛рдиреАрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╣реИ)ред

рдЕрдХреНрд╕рд░ рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ, рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдХрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдПрдХ рд░реВрдк рд╣реИрдВред

рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд┐ return рдпрд╛ ? (рдпрд╛ break ) рднреА рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рджреЛ рд╕реНрддрд░реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ (рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдХреЗ рдкрд╛рд╕ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ), рдпрд╛ рдХреЙрд▓рд┐рдВрдЧ рдореЗрдВ рдПрдХ рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рд╕рдорд╛рд░реЛрд╣ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдПрдХ рдореИрдХреНрд░реЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╣ рдРрд╕рд╛ рдХрд░реЗрдЧрд╛ред рдХрдИ рдореИрдХреНрд░реЛрдЬрд╝ рдирд╣реАрдВ рдХрд░рддреЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП dbg !, рдкреНрд░рд╛рд░реВрдк !, ...)ред рд╕рдордЭ рд╣реИ рдХрд┐ .wait! () рдпрд╛ .await рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ (рдереЛрдбрд╝реЗ рдХрдордЬреЛрд░ рдЕрд░реНрдереЛрдВ рдореЗрдВ рдпрджреНрдпрдкрд┐, @HeroicKatora рдХреЗ рдиреЛрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рд╢рдмреНрдж рд╣реА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдкреНрд░рднрд╛рд╡реА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ return , break , continue ), рдСрдкрд░реЗрдЯрд░ ( ? ), рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ (рдПрдХ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдХреЗ) рдЕрдиреНрдп рд░реВрдкреЛрдВ рдХреА)ред рдЕрдкрд╡рд╛рдж рдЬреЛрдбрд╝рдХрд░ рдкрд╛рдиреА рдХреЛ рдХреНрдпреЛрдВ рдореИрд▓рд╛ рдХрд░реЗрдВ?

@ejmahler рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП RefCell рдХреИрд╕реЗ рдкрдХрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдЙрд╕реА RefCell рдХрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рднреА рдПрдХ рдкреНрд░рдореБрдЦ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреБрд░рдВрдд рдкреВрд░реНрдг рд╕рдВрднрд╛рд╡рд┐рдд рдХреЙрд▓ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рд▓реЛрднреА рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, рд╕реНрдЯреИрдХ рдердХрд╛рд╡рдЯ рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рдХреЛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕реНрдЯреИрдХ рд╕реНрдкреЗрд╕ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдХреА рддреБрд▓рдирд╛ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓ рд╣реЛрдЧреА! рдЕрдЧрд░ рд╣рдо рдЗрдирдмрд┐рд▓реНрдб рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЕрдзрд┐рдХ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рддреЗрдЬреА рд╕реЗ рдХрдард┐рди рд╕рдорд╕реНрдпрд╛ рдХреА рдкрдХрдбрд╝ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдкреВрдВрдЫ рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдЬрд╡рд╛рдм рд╣реИ, рдЗрдореНрд╣реЛ, рдХрд┐ RefCell рдФрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдЬреЛрдЦрд┐рдо рдЕрдкрд░рд┐рдЪрд┐рддрддрд╛ рд╣реИред рдЬрдм рдКрдкрд░ рджрд┐рдП рдЧрдП рдЕрдиреНрдп рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реЗ рджреВрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╣рд╛рдВ рдкреИрджрд╛рд╡рд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЙрдкрдЬ рдмрд┐рдВрджреБрдУрдВ рдкрд░ RefCell рдЖрджрд┐ рдкрд░ рдкрдХрдбрд╝ рдирд╣реАрдВ рдХрд░рдирд╛ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдмреБрдз рдкрд░, 23 рдЬрдирд╡рд░реА, 2019 рдХреЛ 10:30:10 рдмрдЬреЗ +0000, рдЗрд▓рд┐рдпрдЯ рдорд╣рд▓рд░ рдиреЗ рд▓рд┐рдЦрд╛:

рд╕рд┐рджреНрдзрд╛рдВрдд рд╣рд╛рдБ рдореЗрдВ, рдФрд░ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдореЗрдВ
рдпрд╣ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдирд┐рд▓рдВрдмрди рдмрд┐рдВрджреБ рдХрд╣рд╛рдБ рд╣реИрдВред

: +1:

@HeroicKatora

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рддрдиреЗ рдХреЛрдб рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИ, рдХрд┐рддрдиреЗ
рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЖрдк рдХреЗ рд▓рд┐рдП рдЦрд╛рддреЗ рд╣реИрдВред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдХрд┐ рд╡реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВ, рд╡реЗ рднреА рдПрдХ RefCell рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рд╣реИ
рдмрд╛рд╣рд░ред рд▓реЗрдХрд┐рди рдЗрдВрддрдЬрд╛рд░ рдХреЗ рд╕рд╛рде, рдПрдХ рднреА рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ
рд╡реЗрдЯ рдХреЗ рджреМрд░рд╛рди рдХреНрдпрд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЗрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг - рд╡рд╕реНрддреБрддрдГ рдХрд┐рд╕реА рднреА рд▓рд╛рдЗрди рдХрд╛
рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░рд╛ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдореБрдЭреЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдФрд╕рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИ
рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдЗрд╕ рд╡рд┐рд╕реНрдлреЛрдЯ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрдо рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ
рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдХрдо рдмрд╛рд░ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред

рд╕рд╕реНрдкреЗрдВрдб рдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА, рдЦреЗрд▓ рдореЗрдВ
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдХреЛрд░рдЯрд╛рдЗрдиреНрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ
рдкреНрд░рддрд┐ рдлреНрд░реЗрдо рдПрдХ рдмрд╛рд░, рдФрд░ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдкрд░ рдЧреЗрдо рд╕реНрдЯреЗрдЯ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдо рдПрдХ рдЕрдирджреЗрдЦреА рдХрд░рддреЗ рд╣реИрдВ
рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдореЗрдВ рд╕рд╕реНрдкреЗрдВрдб рдкреЙрдЗрдВрдЯ, рд╣рдо рдПрдХ рдЯреВрдЯреЗ рд╣реБрдП рдЦреЗрд▓ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
рдХрдИ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдпред

рдЗрди рд╕рднреА рд╕реЗ рдпрд╣ рдХрд╣рдХрд░ рдирд┐рдкрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ '' рд╣реЛрд╢рд┐рдпрд╛рд░ рдмрдиреЛ рдФрд░ рдХрдо рдмрдирд╛рдУ
рдЧрд▓рддрд┐рдпрд╛рдБ тАЭ, рд▓реЗрдХрд┐рди рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдмреБрдз рдкрд░, 23 рдЬрдирд╡рд░реА, 2019 рдХреЛ 2:44 рдмрдЬреЗ рдЬреЛрд╢ рдЯреНрд░рд┐рдкрд▓ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдмреБрдз рдкрд░, 23 рдЬрдирд╡рд░реА, 2019 рдХреЛ 10:30:10 рдмрдЬреЗ +0000, рдЗрд▓рд┐рдпрдЯ рдорд╣рд▓рд░ рдиреЗ рд▓рд┐рдЦрд╛:

рд╕рд┐рджреНрдзрд╛рдВрдд рд╣рд╛рдБ рдореЗрдВ, рдФрд░ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдореЗрдВ
рдпрд╣ рдЬрд╛рдирдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдирд┐рд▓рдВрдмрди рдмрд┐рдВрджреБ рдХрд╣рд╛рдБ рд╣реИрдВред

: +1:

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/rust-lang/rust/issues/57640#issuecomment-456995913 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABGmep05nhZizdE5xil4FsnpONJCxqn-ks5vGOXhgaJpZM4aBlba
ред

рд╕рд╕реНрдкреЗрдВрдб рдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рдПрдХ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА, рдЧреЗрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ, рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдРрд╕реЗ рдХреЛрд░рд╛рдЙрдЯрд╛рдЗрдиреНрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рдирдХрд╛ рдЗрд░рд╛рджрд╛ рдлреНрд░реЗрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╣реИ, рдФрд░ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдЬреНрдпреВрдореЗ рдкрд░ рдЧреЗрдо рд╕реНрдЯреЗрдЯ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдореЗрдВ рдПрдХ рдирд┐рд▓рдВрдмрд┐рдд рдмрд┐рдВрджреБ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЦреЗрд▓ рдХреЛ рдХрдИ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рд▓рд┐рдП рдЯреВрдЯреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдПрдХ SlotMap рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдВрдЬреА рдбреНрд░реЙрдк рдЖрдк рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ред рднрд╛рд╖рд╛ рд╕реНрд╡рдпрдВ рдЗрд╕ рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рдорджрдж рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдореИрдВ рдХреНрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рддрдирд╛ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ (рдЬрдм рддрдХ рдпрд╣ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ, рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдЧреА) рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реБрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдХрдо рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рднрд╛рд╖рд╛ рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдФрд░ рдЕрдзрд┐рдХ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдХреИрд╕реЗ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдФрдЬрд╛рд░реЛрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рдЦреЗрд▓ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛, рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рдЖрд╡рд░рдг рд▓рд┐рдЦреЗрдВ рдЬреЛ рд░рд┐рдЯрд░реНрди рдкрд░ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЦреЗрд▓ рд░рд╛рдЬреНрдп рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░рд╛рд╢рд┐ рдкрд░ рдЯрд┐рдХ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ async рдЖрдкрдХреЛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд░рд╛рдЬреНрдп рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЕрдиреНрдп рдЙрд╕ рдХрдВрдкрд╛рд░реНрдЯрдореЗрдВрдЯрд▓ рдХреЛрдб рдореЗрдВ рдмреИрди рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред

RefCell рдореЗрдВ рд░рд╛рдЬреНрдп рд╡рд┐рд╕реНрдлреЛрдЯ рдЖрдк рд╕реЗ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдБрдЪ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдХреЛрдб рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрд╕ рд╣рдорд▓рд╛рд╡рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдереЗ рдФрд░ рдЗрд╕реЗ рдЪреБрдкрдЪрд╛рдк рдЬреЛрдбрд╝ рд░рд╣реЗ рдереЗред рдЗрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░рд▓реЗрдЦрди, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ, рд╕рд╣реА рд░реИрдкрд┐рдВрдЧред

RefCell рдХреЛ рд╣реЛрд▓реНрдб рдХрд░рдирд╛ Mutex рдЪрдХрдорд╛ рджреЗрдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ рдЬрдм io рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ред рдЖрдк рдПрдХ рдЧрддрд┐рд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЖрддрдВрдХ рд╕реЗ рднреА рдмрджрддрд░ рдФрд░ рдХрдард┐рди рд╣реИред рдФрд░ рдлрд┐рд░ рднреА рд╣рдо рд╕реНрдкрд╖реНрдЯ block рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред :)ред

Async рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ RefCell рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЙрдирдХреА рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ ( !Send ) рдХреЛ рдмрд╣реБрдд рд╕реАрдорд┐рдд рдХрд░ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред рдФрд░ RefCell рдХреЛ рдЖрдо рддреМрд░ рдкрд░ рдмрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рд╕рдордп рдХреЗ рд▓рд┐рдП рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ RefCell рдЧрд▓рддреА рд╕реЗ рдПрдХ рдЙрдкрдЬ-рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рдмрдбрд╝реА рдмрд╛рдд рд╣реИред

рдпрджрд┐ рд╣рдо рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛрд░рдЯрд╛рдЗрди рдореЗрдВ рдПрдХ рдирд┐рд▓рдВрдмрд┐рдд рдмрд┐рдВрджреБ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЦреЗрд▓ рдХреЛ рдХрдИ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЗ рд▓рд┐рдП рдЯреВрдЯреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

Coroutines рдФрд░ Async рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрд▓рдЧ рдЪреАрдЬ рд╣реИрдВред рд╣рдо yield рдирд┐рд╣рд┐рдд рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреАрд╡рд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП: рдХреГрдкрдпрд╛ рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ await рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдореИрдХреНрд░реЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХрд╣реЗрдВ, while , рдЬреЛ _could_ have рдмрд╕ рдПрдХ while! рдореИрдХреНрд░реЛ ( рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл macro_rules! ; рдХреЛрдИ рд╡рд┐рд╢реЗрд╖-рдЖрд╡рд░рдг рдирд╣реАрдВ)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдмрдпрд╛рдирдмрд╛рдЬреА рдирд╣реАрдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдЪреАрдЬ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВ, рдЙрд╕реА рддрд░рд╣ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдореИрдВ рд░рди-рдЯреВ-рдлрд░реНрд╕реНрдЯ-рд╡реЗрдЯ (рд╕реА # рдХреА рддрд░рд╣) рдЪрд╛рд╣рддрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЖрд░рдПрдлрд╕реА рдиреЗ рдореБрдЭреЗ рдЕрдиреНрдпрдерд╛ рдордирд╛ рд▓рд┐рдпрд╛ред

рдпрд╣рд╛рдВ рдХреАрд╡рд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП: рдХреГрдкрдпрд╛ рдпрд╣ рд╡рд░реНрдгрди рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдореИрдХреНрд░реЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдХрд╣рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐, рдЬреЛ рдереЛрдбрд╝реА рджреЗрд░ рд╣реЛ рд╕рдХрддреА рдереА! рдореИрдХреНрд░реЛ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдореИрдХреНрд░реЛ_рдпреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП!! рдХреЛрдИ рд╡рд┐рд╢реЗрд╖-рдЖрд╡рд░рдг рдирд╣реАрдВ)ред

рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдЗрд╕ рддрд░реНрдХ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдФрд░ рдореИрдВ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реИ (https://github.com/rust-lang/rust/issues/57640#issuecomment-456990831), рдореИрдВ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╣реЛрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рднреА рд╣реВрдБ (рд╢рд╛рдпрдж .awaited!() рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдирд╛рдо рдХреА рдЧрдбрд╝рдмрдбрд╝реА рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП

  • foo.bar().await рдФрд░ foo.bar().await() рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдХреАрд╡рд░реНрдб рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡реЗ рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдпрд╛ рдореЗрдердб рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд╢реЛрдзрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЗрд╕ рддрд░рд╣ рдЫрд┐рдкрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • foo.bar() await рд╕рд┐рд░реНрдл рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдХреЗ рд╕рд╛рде рдЬреИрд╕реЗ foo.bar() await.qux() ред рдореИрдВрдиреЗ рдЙрд╕ рддрд░рд╣ рдХреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреАрд╡рд░реНрдб рдХреЛ рдХрднреА рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ (рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рднреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рдРрд╕реЗ рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ)ред рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рднреНрд░рдорд┐рдд рд░реВрдк рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ qux() foo.bar() ред
  • foo.bar()@await рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рд░рд╛рдо рдЪрд┐рд╣реНрди рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдХрд╛рдлреА рддрджрд░реНрде рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд) рдХреЗ рд╕рд╛рде рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЗ рд╣реИрдВред рдореБрдЭреЗ рдмрд╕ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╕рд┐рдЧрд▓реНрд╕ рдЬреЛрдбрд╝рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрддреБрд▓рди рдХрд╕реНрдЯрдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рдУрд░ рдЯрд┐рдк рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдУрд░ рдореИрдХреНрд░реЛ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдкрд╣рд▓реЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдирдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЯреНрд╡рд┐рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдлрд┐рд░ рдЪреБрдк рд░рд╣рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

await рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ async рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╣реА рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ await рдХрд╣реАрдВ рдФрд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдХрд┐рд╕реА рдЪрд░ рдХрд╛ рдирд╛рдо рдмрд╛рд╣рд░реА рджрд╛рдпрд░реЗ рдореЗрдВ await рд╣реИ, рддреЛ рдЗрд╕реЗ async рдмреНрд▓реЙрдХ рдХреЗ рднреАрддрд░ рд╕реЗ рддрдм рддрдХ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рдХрдЪреНрдЪреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ред рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, await! рдореИрдХреНрд░реЛред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реЗ рдореБрдЦреНрдп рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдХреАрд╡рд░реНрдб рдХреЛ рдЕрдкрдирд╛рдирд╛: рд╣рдореЗрдВ рдЬреЗрдирд░реЗрдЯрд░ рдФрд░ рдПрд╕рд┐рдВрдХреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд┐рд╢реНрд░рдг рдФрд░ рдорд┐рд▓рд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ:

// imaginary generator syntax stolen from JavaScript
fn* my_generator() -> T {
    yield some_value;

    // explicit return statements are only included to 
    // make it clear the generator/async functions are finished.
    return another_value;
}

// `await` keyword would not be allowed here, but the `yield` keyword is
#[async]
fn* my_async_generator() -> Result<T, E> {
    let item = some_op().await!()?; // uses the `.await!()` macro
    // which would really just use `yield` internally, but with the pinning API
    // same as the current nightly macro.

    yield future::ok(item.clone());

    return Ok(item);
}

// `yield` would not be allowed here, but the `await` keyword is.
async fn regular_async() -> Result<T, E> {
   let some_op = async || { /*...*/ };

   let item = await? some_op();

   return Ok(item);
}

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рдж рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ рдЬреЛ рдлрдВрдХреА рд╕рд╛рдорд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдирдП рдФрд░ рдордзреНрдпрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ рд╡рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред 2 рдФрд░ 3, рдпрджрд┐ рдмрд┐рдирд╛ рдХрд┐рд╕реА yield рдХрдердиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИрдВред

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ await? async рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ ? рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╣рд╛рди рдЖрд╢реБрд▓рд┐рдкрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдбрд╝рд╛рдИ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЪреАрдЬрд╝ рдмрди рдЬрд╛рддреЗ рд╣реИрдВ (рдЬреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╡реЗ рдХрд░реЗрдВрдЧреЗ), рджреЛрдиреЛрдВ await!(...) рдФрд░ .await!() рдПрдХ рд╕рд╛рде рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рддреАрди рдмрд░рд╛рдмрд░ рддрд░реАрдХреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред ред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рднреА рд╕рдВрдЬреНрдЮрд╛рдирд╛рддреНрдордХ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдЖрджрд░реНрд╢ рд░реВрдк рдореЗрдВ, async fn рдФрд░ #[async] fn* рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЛрдб рдХреЛ рдПрдХ async рд░рд╛рдЬреНрдп рдорд╢реАрди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрди рдореБрджреНрджреЛрдВ рдиреЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдПрдХ рд╕рдЪреНрдЪреА рдкрд╕рдВрджреАрджрд╛ рд╢реИрд▓реА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪреНрдЫ, рд▓рдЪреАрд▓рд╛, рдкрдардиреАрдп рдФрд░ рдЖрд╕рд╛рди рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдпреЛрдЬрдирд╛ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ рд╣реИред

await рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ async рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╣реА рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рд░рд╕реНрдЯ рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИ, рддреЛ рд╣рд╛рдЗрдЬреАрдирд┐рдХ рдореИрдХреНрд░реЛрдЬрд╝ рджрд┐рдП рдЧрдП рд╣реИрдВред рдЕрдЧрд░ рдореИрдВ foo!(x.await) рдпрд╛ foo!(await { x }) рдЬрдм рдпрд╣ expr рдЪрд╛рд╣рддрд╛ рд╣реВрдБ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рдВрджрд┐рдЧреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ await рдХреАрд╡рд░реНрдб рдЪрд╛рд╣рд┐рдП - await рдлрд╝реАрд▓реНрдб рдпрд╛ await рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рд╢рд╛рдмреНрджрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╢рд╛рдмреНрджрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╕рдордХрд╛рд▓рд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВред

рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рддреАрди рдмрд░рд╛рдмрд░ рддрд░реАрдХреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ

рдХреГрдкрдпрд╛ рдирд╣реАрдВред (рдХрдо рд╕реЗ рдХрдо core ред рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рд▓реЛрдЧ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╡реЗ рдЪрд╛рд╣реЗрдВ рддреЛ)

рдЕрднреА, рдПрдХ рдЙрдкрд╕рд░реНрдЧ .рд╡рд╛рдЗрдЯ! () рдореИрдХреНрд░реЛ рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдореИрдЬрд┐рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдЦреЛрдЬрд╢рдмреНрдж рдХреЗ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд┐рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдпрд╣ рдЕрдм рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрдЧрд╛: рдкреЛрд╕реНрдЯ-рдкреЛрд╕реНрдЯ .wait! () рдореИрдХреНрд░реЛ рдХреЛ рддрд┐рд░рдЫреЗ рддрд░реАрдХреЗ рд╕реЗ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рддрд░реНрдХ (рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐) рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд┐рдпрд╛ рдФрд░ рд▓рд┐рдкрдЯреЗред рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдм рдХреБрдЫред

рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рднреА рдЙрддрдирд╛ рд╣реА рд╕рдЪ рд╣реИ - рд▓реЗрдХрд┐рди рдЖрд╕рд╛рди рд╣реИ! - рджреВрд╕рд░реА рджрд┐рд╢рд╛ рдореЗрдВ: рдпрджрд┐ рд╣рдо .await рдХреАрд╡рд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд▓реЛрдЧ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЛ рдХрд╛рдлреА рдирд╛рдкрд╕рдВрдж рдХрд░рдиреЗ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА awaited!() рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдХрдИ рдЕрдиреБрдордд рд╡реЗрд░рд┐рдПрдВрдЯ (рдЬреИрд╕реЗ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕) рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХрд╛рд░рдг рдкреВрдЫреВрдВрдЧрд╛ред рдореИрдВ рдПрдХ рдмрдбрд╝реА рдХрдВрдкрдиреА рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХреЛрдб рд╢реИрд▓реА рдкрд░ рдЭрдЧрдбрд╝реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд╣реА рдлрд╝реЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдЬрдЧрд░ рдХрд╛ рдЬрд╝реЗрди рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВ рдХрдИ рдЕрдиреБрдордд рд╡реЗрд░рд┐рдПрдВрдЯ (рдЬреИрд╕реЗ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕) рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХрд╛рд░рдг рдкреВрдЫреВрдВрдЧрд╛ред рдореИрдВ рдПрдХ рдмрдбрд╝реА рдХрдВрдкрдиреА рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХреЛрдб рд╢реИрд▓реА рдкрд░ рдЭрдЧрдбрд╝реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВред рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд╣реА рдлрд╝реЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдЬрдЧрд░ рдХрд╛ рдЬрд╝реЗрди рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдЖрд╢рдп рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд░реЛрдХрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореИрдХреНрд░реЛрдВ рдХреЛ await!() рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рд╕рд┐рдорд░рд▓ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рд╣реЛрдВрдЧреАред рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реИрд╕реЗ рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реЗрд░рд┐рдПрдВрдЯ рд╣реЛрдВрдЧреЗред

рдареАрдХ рд╣реИ, рдирд╣реАрдВ await!(...) рдХрдо рд╕реЗ рдХрдо рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА; рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ macro_rules! wait { ($e:expr) => { e.await }; } рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ wait!(expr) рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрд╕реНрд╡рднрд╛рд╡рд┐рдХ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдФрд░ рд╕рдВрднрд╡рддрдГ рдлреИрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдореЗрдВ рднрд┐рдиреНрдирддрд╛ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХрдо рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @yasammez рдХрд╛ рдмрд┐рдВрджреБ рдЙрдкрдпреБрдХреНрдд рд╣реИред

@ рдХреЗрдВрджреНрд░ рдпрджрд┐ рдХреЛрдИ рдмреБрд░рд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред _await!() рдпрд╛ awai!() рдХреНрдпрд╛?

рдпрд╛, рдЬрдм рдпреВрдирд┐рдХреЛрдб рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИ, рддреЛ ├аwait!() рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИред

...

@earthengine рдХрд╛ рд▓рдХреНрд╖реНрдп рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рдорд╛рдирджрдВрдб рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ (рдЗрд╕реА рддрд░рд╣ рд╣рдо рд╕реНрдЯрд╛рдЗрд▓ рд▓рд┐рдиреНрдЯреНрд╕ рдФрд░ rustfmt ), рд╡рд┐рднрд┐рдиреНрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рд╣рдо рдпрд╣рд╛рдВ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯ рд░рд╣реЗ рд╣реИрдВ, _await!() рди рджреЗрдЦрдиреЗ рдХреА рдкреВрд░реНрдг рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВред

рдЖрдЗрдП рд╕рдВрдХреНрд╖реЗрдк рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рддрд░реНрдХреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ:

  • __ expr await (рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб) __: рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ await рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдЖрд░рдХреНрд╖рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЗрдВрддрдЬрд╛рд░ рдПрдХ рдЬрд╛рджреБрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдФрд░ рдПрдХ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдЦрдбрд╝реЗ рд╣реЛрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдпрд╛ рдПрдХ рд╡рд┐рдзрд┐ рдпрд╛ рдореИрдХреНрд░реЛ рдХреЙрд▓ рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдирд┐рдпрдореЛрдВ рдФрд░ ? рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рд╡рд┐рдзрд┐- рдирд┐рд░реНрдзрд╛рд░рдг рдХреА рдЬрдЧрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрджрддрд░ рд╣реИ, рдПрдХ RFC рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдкрд░, IDE рдХреЛ await рд▓рд┐рдП рдПрдХ рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрд╛рджреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЛрдЧреЛрдВ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рдЬрдЧрд╣ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ @withoutboats рдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдХреЛрдб рдХреЛ рдРрд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ await рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПред рдпрд╣ рдПрдХ рдРрд╕реЗ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╢рд╛рдпрдж рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рдереЗ рдпрджрд┐ рд╣рдо рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдЕрдкрдирд╛рддреЗред

  • __ expr.await (рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдлрд╝реАрд▓реНрдб) __: рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдлрд╝реАрд▓реНрдб рд╕рд┐рдВрдЯреИрдХреНрд╕ "рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐" рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИ - рдпрд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЪреЗрдирд┐рдВрдЧ рдореЗрдВ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдЖрдИрдбреАрдИ рдХреЛ await рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк

  • __ expr.await() (рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡рд┐рдзрд┐) __: рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡рд┐рдзрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рдорд╛рди рд╣реИред рдЙрд▓реНрдЯрд╛, () рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╛рдардХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, "рдпрд╣ рдХреБрдЫ рдХрд░рддрд╛ рд╣реИред" рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рджреЗрдЦреЗрдВ, рддреЛ рдпрд╣ рд▓рдЧрднрдЧ рдЙрд╕реА рддрд░рд╣ рдЖрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрд╡рд░реБрджреНрдз рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛрдЧрд╛ред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдкрд░, рдпрд╣ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ await рдХрд╛ рдЬрд╛рджреВ рд╡реНрдпрд╡рд╣рд╛рд░ рднреНрд░рд╛рдордХ рд╕рд╛рдмрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ await рдПрдХ рд╣реА рд╕реАрдорд┐рдд рдЕрд░реНрдереЛрдВ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдХрд┐ call/cc рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ Future::await(expr) рдХреЛ UFCS рдХреЗ рд╕рд╛рде рд▓рдЧрд╛рддрд╛рд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

  • __ expr.await!() (рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ) __: рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕реА рддрд░рд╣ "рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐" рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИ ! рдмреИрдВрдЧ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ "рдпрд╣ рдХреБрдЫ рдЬрд╛рджреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред" рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдкрд░, рдпрд╣ рдФрд░ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рдЬрдм рдореИрдХреНрд░реЛрдЬрд╝ рдЬрд╛рджреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЖрдо рддреМрд░ рдкрд░ await рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЬрд╛рджреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдкрд░, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ await рдХрд╛ рдЗрд▓рд╛рдЬ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

  • __ expr@ , expr# , expr~ , рдФрд░ рдЕрдиреНрдп рдПрдХрд▓-рдЪрд░рд┐рддреНрд░ рдкреНрд░рддреАрдХреЛрдВ__: рдПрдХрд▓ рд╡рд░реНрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо ? рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред ? , рд╣рдо рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдо await рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдлреИрд▓рд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рд╕рд╣рдорддрд┐ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдиреАрдЪреЗ рдХреА рддрд░рдл, рдЬрдм рддрдХ рдФрд░ рдЬрдм рддрдХ рд╣рдорд╛рд░реЗ рдХреЛрдб await рд╕рд╛рде рдлрдВрд╕реЗ рд░рд╣рдиреЗ рдХрд╛ рджрд░реНрдж рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдмрди рдЬрд╛рддрд╛, рддрдм рддрдХ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рдЯреНрд░реЗрдб-рдСрдл рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдЖрдо рд╕рд╣рдорддрд┐ рджреЗрдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдореИрдВ рдЗрди рд╕рд╛рд░рд╛рдВрд╢ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП @traviscross рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЛрд╕реНрдЯ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛! рд╡реЗ рд▓рдЧрд╛рддрд╛рд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ crosslinked рд╣реИрдВред рдпрд╣ рдХрд╛рдмрд┐рд▓реЗ рддрд╛рд░реАрдл рд╣реИред :рджрд┐рд▓:

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдПрдл # рдХреА рддрд░рд╣ "рдкрд╛рдЗрдк рдСрдкрд░реЗрдЯрд░" рдХреЛ рдЬреЛрдбрд╝рдирд╛, рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдкрд╕рд░реНрдЧ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ (рд╕реНрдкрд╖реНрдЯ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

// use `|>` for instance, Rust can choose other sigils if there are conflicts with current syntax
await expr
expr |> await

// and we can use this operator on normal function calls too
f(g(h(x))) 
x |> h |> g |> f
// this is more convenient than "postfix macro"
x.h!().g!().f!()

@traviscross рдЙрддреНрдХреГрд╖реНрдЯ рд╕рд╛рд░рд╛рдВрд╢ред рд╡рд╣рд╛рдБ рднреА рдХреБрдЫ рдЪрд░реНрдЪрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ sigil рдФрд░ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рдВрдпреЛрдЬрди, рдЬреИрд╕реЗ fut@await , рддреЛ рдореИрдВ рд╕рд┐рд░реНрдл рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рдЬреЛрдбрд╝ рджреВрдБрдЧрд╛ред

рдореИрдВрдиреЗ рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЛ рдпрд╣рд╛рдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ @earthengine рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ @ рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдиреНрдп sigils рд╕рдВрднрд╡ рд╣реИрдВ, рдЬреИрд╕реЗ ~ ред @BenoitZugmeyer @await рдкрдХреНрд╖рдзрд░ рд╣реИ , рдФрд░ рдкреВрдЫрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ postfix macros ala expr!await рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛрдЧрд╛ред @dpc рдХрд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ @await рдмрд╣реБрдд рдЕрдзрд┐рдХ рддрджрд░реНрде рд╣реИ рдФрд░ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рдЙрд╕рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдПрдХреАрдХреГрдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЬрдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рднрд╛рд░реА рд╣реИ; @ cenwangumass рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рддрджрд░реНрде рд╣реИред @newpavlov рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ await рд╣рд┐рд╕реНрд╕рд╛ рдмреЗрдорд╛рдиреА рд▓рдЧрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдиреНрдп рд╕рдорд╛рди рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред @nicoburns рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрдИ рдореБрджреНрджреЗ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдмрд╣реБрдд рддрджрд░реНрде рд╣реИред

@traviscross рдорд╣рд╛рди рд╕рд╛рд░рд╛рдВрд╢!

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдХреНрд░рдо рдореЗрдВ рдореЗрд░рд╛ 0.02 $:

  • 3 рдПрдХ рдбрд┐рдлреЗрдХреНрдЯрд┐рд╡рд▓реА рдиреЛ-рдЧреЛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рдПрдХ рдореЗрдердб рдХреЙрд▓ рднреА рдирд╣реАрдВ рд╣реИред
  • 2 рдПрдХ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рднреНрд░рд╛рдордХ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдПред рдкреВрд░реА рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕реВрдЪреА рдореЗрдВ await рд╣реЛрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрджрдЧрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдЯрди рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдЗрд╕реЗ fn рдпрд╛ extern рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд╛рдкрди рдХреБрдЫ рднреА рдирд╣реАрдВ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЛрдВ / рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдореБрдЭреЗ рдПрдХ рдХреАрд╡рд░реНрдб рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • 4 рдореИрдХреНрд░реЛ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдпрд╣рд╛рдВ рдлрд┐рдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдмреИрдарддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ async рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде рд╡рд┐рд╖рдорддрд╛
  • 5 рд╕рд┐рдЧрд┐рд▓ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрдард┐рди рдФрд░ рдХрдард┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдирд┐рдХрд╛рдп рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рдФрд░ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреНрд░рдо рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
  • 1 рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ IMHO, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рддрд░реНрдХ рд╣реИ рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд╛рдЬрд┐рд░ рд╣реИ рдФрд░ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЖрд░рдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рд╣реИред рдЕрдВрддрд░рд┐рдХреНрд╖ рдЬреБрджрд╛рдИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ, рджреЛрд╖ рдирд╣реАрдВред рдЬрдм рдХреЛрдИ рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди rustfmt рдпрд╣ рдФрд░ рднреА рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдИ рд╣реИ рдЬреЛ рдЗрд╕ рдкрд▓ рдХреЗ рдЖрдиреЗ рдХрд╛ рдмреЗрд╕рдмреНрд░реА рд╕реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣рд╛рдВ рдореЗрд░реЗ $ 0.02 рднреА рд╣реИрдВред

рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдореИрдВ @Pzixel рдХреЗ рд╕рд╛рде рд╕рд╣рдордд try!() / рдХреЗ рд╕рд╛рдеред ? рдЬреЛрдбрд╝реАред рдореИрдВрдиреЗ рдЕрднреА рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ try!() ? рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣рд╕ рдХрд░рддреЗ рджреЗрдЦрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рджреЗрдЦрдиреЗ рдкрд░ рдХреБрдЫ рдПрдЬреЗрдВрд╕реА рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕рдорд░реНрдердХ рд╣реИ , рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдХреАрдордд рдкрд░ред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдХ await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдорд╣рд╛рди рд╣реИ рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ async рдХреЛрдб рдХреЛ рдЪрд░рдгреЛрдВ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдЕрдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЬреИрд╕реЗред

let val1 = my_async() await;
...
let val2 = another_async(val1) await;
...
let val3 = yet_another_async(val2) await;

рджреВрд╕рд░реА рдУрд░, рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреБрдЫ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдареЗрда рд░рд╕реНрдЯ-рд╡рд╛рдИ рдкрджреНрдзрддрд┐ рдХреА рд╢реИрд▓реА рдХреА рд╢реИрд▓реА

let my_final_value = commit(get_some_data()
                        .and_then(|s| get_another_data(s))
                        .or_else(|s| report_error(s))~);

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ await рдХреАрдмреЛрд░реНрдб рдХреА рдХреНрд░рд┐рдпрд╛ рдмреЗрдорд╛рдиреА рд╣реИред рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

let my_final_value = commit(get_some_data()
                        .and_then(|s| get_another_data(s))
                        .or_else(|s| report_error(s)) await);

рдПрдХ рдФрд░ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рд╕рд┐рдВрдЧрд▓-рд╕рд┐рдВрдмрд▓ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╕рдВрдж рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╣реИ , рдЬрдмрдХрд┐ (рдореЗрд░реЗ рд▓рд┐рдП, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ) await -

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ await рдмрдпрд╛рдиреЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ рдПрдХрд▓-рдкреНрд░рддреАрдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдмреЗрд╣рддрд░ рджрд┐рдЦрддрд╛ рд╣реИред

рдпреЗ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рд╡реИрд╕реЗ рднреАред

рдЪреВрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдмрд╛рдЗрдХ-рд╢реЗрдбрд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рдХреА рдорд╛рдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдФрд░ рд╕рд░реНрдЬрди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдЕрдм рддрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ AFAICT: -> ред

рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ -> рдХреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд╛рдкрд╕реА рдХреА рдШреЛрд╖рдгрд╛ рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЬреЛ - async рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди - рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рд╣реИред

async fn send() -> Result<Response, HttpError> {...}
async fn into_json() -> Result<Json, EncodingError> {...}

let body: MyResponse = client.get("http://api").send()->?.into_json()->?;

рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ, рдЖрдкрдХреЛ send()-> рдЬреЛ рднреА Result<Response, HttpError> , рдЬреИрд╕рд╛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдЪрд░реНрдЪрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпреЗ рдореЗрд░реА $ 0.02 рд╣реИрдВред рдореЗрд░реА рд░рд╛рдп рдХреЛ рдХреЛрдИ рд╡рдЬрд╝рди рджреЗрдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ - рдореИрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡реНрдпрдХреНрддрд┐ рд╣реВрдВред рдореИрдВ рд╢рд╛рдпрдж рдЬреНрдпрд╛рджрд╛ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╢реЛрд░ рдирд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рддрд░реНрдХ рд╣реВрдВред


рдореБрдЭреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд░реНрдЬрди рдкрд╕рдВрдж рд╣реИред рдЙрдкрд╕рд░реНрдЧ sigils рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╛рдХреА рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдХреЛрдИ рдЦрд╛рд╕ рддрд░рдЬреАрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡рд┐рд╢реЗрд╖ рд╕рд░реНрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреЛрдИ рднреА рдордЬрдмреВрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рдЪрд┐рддрддрд╛ рдХреЗ рд╕рд╛рде рдлреАрдХрд╛ рд╣реЛрдЧрд╛ред рдПрдХ рд╕рд░реНрдЬрди рдЕрдиреНрдп рдЙрдкрд╕рд░реНрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рд╢реЛрд░ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -> рд╕рд╛рде . (рдЬрдм рдкреАрдЫрд╛ рдХрд░рддреЗ рд╣реБрдП) рдХреА рдЬрдЧрд╣ рд▓реЗрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЕрднреА рднреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдЕрд╕рдВрджрд┐рдЧреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреБрдЫ рдРрд╕реЗ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ ? рдХреЗ рд╕рдорд╛рди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдореИрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдЕрдиреНрдп рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред await рди рддреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдпрд╛ рд╡рд┐рдзрд┐ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдЧрдд рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИред рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдИ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рдпрд╛ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрд╕рдВрдЧрдд рднреА рд▓рдЧрддрд╛ рд╣реИред

рдпрджрд┐ рдореИрдВ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдерд╛, рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рддреЛ рдореИрдВ рдорд╛рдиреВрдВрдЧрд╛ рдХрд┐ .await рдпрд╛ .await() рд╡рд┐рд╢реЗрд╖ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдирд╣реАрдВ рдереАрдВ рдФрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рдлрд╝реАрд▓реНрдб рдпрд╛ рд╡рд┐рдзрд┐рдпрд╛рдБ рдереАрдВ - рдЬреИрд╕рд╛ рдХрд┐ рдорд╛рдорд▓рд╛ рд╣реИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рд╣рд░ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдФрд░ рд╡рд┐рдзрд┐ред рдПрдХ рдмрд╛рд░ рдХреБрдЫ рдФрд░ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрджрд┐ .await!() рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП (рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЙрдкрд╕рд░реНрдЧ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕реАрдЦрд╛ рд╣реИ) - рд╡реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрджрд┐ рдЙрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдХ рд╕рддрд░реНрдХ рджреЗрдЦрд╛, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЬреИрд╕реЗ ? ), рд▓реЗрдХрд┐рди рд╡реЗ рдЗрд╕реЗ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ .await() рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдХрд░реЗрдВрдЧреЗред рдпрд╛ рдХреНрд╖реЗрддреНрд░ .await рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрдиред

рдореБрдЭреЗ рдПрдХ рдЙрдкрд╕рд░реНрдЧ await { .. } ред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдБ рд╣реИрдВ (рдЬрд┐рди рдкрд░ рдкрд╣рд▓реЗ рд╣реА рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рдЪреБрдХреА рд╣реИ)ред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╛рдпрджреЗрдордВрдж рд╣реЛрдЧрд╛ рдЬреЛ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐-рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдЧрдирд▓ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд░рд╛рд╣реЗрдЧрд╛ред

рдореИрдВ рдЕрдиреНрдп рдЙрдкрд╕рд░реНрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╡реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЕрдиреБрд░реВрдк рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЗ рд╕рдорд╛рди, рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдлрд╝рдВрдХреНрд╢рди рдЕрд╕рдВрдЧрдд рд╣реИ, рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдХреЛрдИ рдЕрдиреНрдп рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИрдВред рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдИ рднреА рдореИрдХреНрд░реЛрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ ( try!(..) рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ - рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд░реНрдЬрди)ред


рдореЗрд░реА рд▓рдЧрднрдЧ рд╕рднреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдФрд░ рд╕реБрд╕рдВрдЧрдд (рдореЗрд░реЗ рд▓рд┐рдП) рдорд╣рд╕реВрд╕ рд╣реЛрддреА рд╣реИрдВред рдЬреЛ рднреА рд╕рдорд╛рдзрд╛рди рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЙрд╕реЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдордп рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╣рд╛рдереЛрдВ рдкрд░ рдЕрдиреБрднрд╡ рдПрдХ рдмреЗрд╣рддрд░ рдиреНрдпрд╛рдпрд╛рдзреАрд╢ рд╣реЛрдЧрд╛ рдЬреЛ рд╡рд┐рдХрд▓реНрдк рдЕрдЯрдХрд▓рдмрд╛рдЬреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред

рдпрд╣ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрдХ рдореВрдХ рдмрд╣реБрдордд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЬреЛ рд▓реЛрдЧ рдЗрди рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ (рд╕реНрд╡рдпрдВ рд╕рд╣рд┐рдд) рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╕рднреА рд░реБрд╕реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИрдВ (рдпрд╣ рдорд╛рдореВрд▓реА рдпрд╛ рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрдХреНрд░рд╛рдордХ)ред

tl; dr рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдЧрд┐рд▓реНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ (рдкреВрд░реНрд╡рддрд╛ рдХреЗ рдХрд╛рд░рдг) рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд, рд╕реБрд╕рдВрдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдореИрдВ рдПрдХ рдЙрдкрд╕рд░реНрдЧ await { .. } рдФрд░ рдПрдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ @ (рдЬреЛ рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ ? рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдЬреЛрдбрд╝реВрдВрдЧрд╛ред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд░реБрд╕реНрдд рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд╕рдВрдЧрдд рд╣реИред

@SamuelMoriarty

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрдн рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрдмреЛрд░реНрдб рдХреА рдХреНрд░рд┐рдпрд╛ рдмреЗрдорд╛рдиреА рд╣реИред рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рд▓реБрдХ рд▓реБрдХ рдореЗрдВ ~ рд╕реНрдкреЙрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдкреВрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рдФрд░ рдореИрдВ рдЕрдкрдирд╛ рджреВрд╕рд░рд╛ рдкрдврд╝рд╛ рд╣реБрдЖ рдЕрдзрд┐рдХ рд╕рдлрд▓ рд░рд╣рд╛ред рдорд╣рд╛рди рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рддрд░реНрдХрддрд╛ рдмрджрддрд░ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд░рд╛рдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╛рд░ рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХреА рдЧрдИ рдереАред

рд╕рд┐рдЧрд▓реНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдПрдХ рдФрд░ рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдЬреЗ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

let res: MyResponse = client.get("https://my_api").send()?@?.json()?@?;`

?@? "рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИ рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдпрд╛ рднрд╡рд┐рд╖реНрдп рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде, рдпрджрд┐ рдХреЛрдИ рд╣реЛ, рддреЛ рдПрдХ рдХреЙрд▓рд░ рдХреЛ рдкреНрд░рдЪрд╛рд░рд┐рдд"

рдореБрдЭреЗ рдФрд░ рдЪрд╛рд╣рд┐рдП

let res: MyResponse = client.get("https://my_api").send()? await?.json()? await?;`

@rolandsteiner

рдЪреВрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдмрд╛рдЗрдХ-рд╢реЗрдбрд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рдХреА рдорд╛рдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдФрд░ sigil рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрд┐рд╕рдХрд╛ рдЕрдм рддрдХ AFAICT: -> рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪреАрдЬреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдмрджрддрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдмрджрддрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдзреАрдореА рд╕рдВрдХрд▓рди рд╕рдордп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ -> рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЕрд░реНрде рд╣реИ, рдЗрд╕рдореЗрдВ async/await рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЙрдкрд╕рд░реНрдЧ await { .. } рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдПрдХ рдЙрдкрд╕рд░реНрдЧ ! sigilред
рдПрдХ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди рддреЗрдЬреА рд╕реЗ рд╡рд╛рдпрджрд╛ рдХреЗ рдЖрд▓рд╕реНрдп рдкрд░ рдЬреЛрд░ рджреЗрдЧрд╛ред рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди рдХреЗ рд╕рд╛рде рдХрдорд╛рдВрдб рджрд┐рдП рдЬрд╛рдиреЗ рддрдХ рд╡реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рддрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

let res: MyResponse = client.get("https://my_api").send()?!?.json()?!?;

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдореЗрд░реА рд░рд╛рдп рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдмрд╣реБрдд рдХрдо async рдЕрдиреБрднрд╡ рдорд┐рд▓рд╛ рд╣реИ рдФрд░ Rust рдХреЗ async рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, .send()?!?.json()?!?; рдФрд░ рдЙрд╕ рдЬреИрд╕реЗ рдЕрдиреНрдп рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдореВрд▓ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рддрд░реНрдХ-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рдЧрд▓рдд рд▓рдЧ рд░рд╣рд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрдВрдЬреАрд░реЛрдВ рд╕реЗ рдЬрдХрдбрд╝ рдЬрд▓реНрджреА рд╕реЗ рдЕрдкрдардиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рднреА рдпрд╣ ?!? рдпрд╛ ?~? рдпрд╛ ?->? ред рдпрд╣ рдПрдХ рдФрд░ рдЪреАрдЬ рд╣реЛрдЧреА рдЬреЛ рд╢реБрд░реБрдЖрддреА рдХреЛ рдареЛрдХрд░ рдорд╛рд░рддреА рд╣реИ, рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреА рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╣реИ рдпрд╛ рдХрдИред рдЬрд╛рдирдХрд╛рд░реА рдмрд╣реБрдд рдХрд╕рдХрд░ рднрд░реА рд╣реБрдИ рд╣реИред

рджреВрд╕рд░рд╛, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдВрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рд╛рд░ рдЕрдВрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдЕрдВрдХ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ, рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдПрдХ рдордВрдЪ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рди рдХрд┐ рдПрдХ "рдорд╛рдореВрд▓реА рдкрд░рд┐рд╡рд░реНрддрди" рджреВрд╕рд░реЗ рдЪрд░рдг рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ (рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рдХреЗрд╡рд▓ рдорд╛рдореВрд▓реА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ")ред рдореИрдВ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рднреА рдареАрдХ рд░рд╣реВрдВрдЧрд╛ (рдЬреЛ рд▓рдЧрднрдЧ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рд▓рдЧрддрд╛ рд╣реИред рдореЗрд░рд╛ рдЖрджрд░реНрд╢ рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡рдд: .await!() рдкрджреНрдзрддрд┐-рдЬреИрд╕рд╛ рдореИрдХреНрд░реЛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдореИрдХреНрд░реЛ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рднрд╛рд╡реА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рдзрд┐-рдЬреИрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрдЧреАред

рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЖрдзрд╛рд░рднреВрдд, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ await my_future ред рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

expr....await рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдФрд░ рдЬрдВрдЧрд▓рд╛рдБрдЧ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рддрдХ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ async рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреИрдЯрд░реНрди рд╣реИ..рдЗрд╕ рд╡рд┐рдзрд┐ рдпрд╛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдореЗрд░реЗ рдкрд╛рд╕ await!(foo) рд▓рд┐рдП рдореЗрд░рд╛ рдЭреБрдХрд╛рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ рдмрддрд╛рдпрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ 2021 рддрдХ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ, рдореИрдВ await { foo } рд╕рд╛рде рдЬрд╛рдКрдВрдЧрд╛ рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВред рдЙрдкрд╕рд░реНрдЧ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ, рдореЗрд░реА рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд░рд╛рдп рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рдХреБрдЫ рд╣реЛрдЧрд╛? рддреЛ, рд╣рдо рдкрд╣рд▓реЗ рд▓реИрдВрдбрд┐рдВрдЧ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

await { future }?

рдФрд░ рдмрд╛рдж рдореЗрдВ рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ

let result = implicit await { client.get("https://my_api").send()?.json()?; }

рдпрд╛

let result = auto await { client.get("https://my_api").send()?.json()?; }

рдирд┐рд╣рд┐рдд рдореЛрдб рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп, {} рдмреАрдЪ рд╕рдм рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рдиреЗ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛, рдкреАрдЫрд╛ рдХрд░рдиреЗ рдФрд░ рдпрдерд╛рд╕рдВрднрд╡ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдВрддреБрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред

рдореИрдВрдиреЗ рдЙрди рдЬрдЧрд╣реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП rg --type csharp '[^ ]await' рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдЙрдкрд╕рд░реНрдЧ рдЙрдк-рдордзреНрдп рдерд╛ред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдпреЗ рд╕рднреА рд╕рд╣реА рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╣реИрдВ рдЬреЛ рдХреЛрдб рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрдП рд╣реИрдВред (рдХреБрдЫ рдбреЛрдореЗрди рдореЙрдбрд▓ рдЪреАрдЬреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдереЛрдбрд╝рд╛ рд╕рд╛рдл рд╣реЛрддрд╛ рд╣реИред)

(await response.Content.ReadAsStringAsync()).Should().Be(text);

рдлреНрд▓реБрдПрдВрдЯрд╕рд░реНрд╕реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рдПрдордПрд╕рдЯреАрд╕реНрдЯ assert_eq! Assert.Equal рддреБрд▓рдирд╛ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдирд╛ред

var previous = (await branch.ListHistoryAsync(timestampUtc, null, cancellationToken, 1)).HistoryEntries.SingleOrDefault();

"рджреЗрдЦреЛ рдХреА рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА" рдЬреЛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИред

id = id ?? (await this.storageCoordinator.GetDefaultWidgetAsync(cancellationToken)).Identity;

рдПрдХ рдФрд░ "рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА"ред (рдПрдХ рддрд░рдл: "рдпрд╛рд░ рдореИрдВ рдЦреБрд╢ рд╣реВрдВ рдХрд┐ рдЬрдВрдЧ рдХреЛ CancellationToken s рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реЛрдЧреАред)

var pending = (await transaction.Connection.QueryAsync<EventView>(command)).ToList();

рд╡рд╣реА .collect() рдПрдХ рдЬрд┐рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рд░рд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред

foreach (var key in changes.Keys.Intersect((await neededChangesTask).Keys))

рдореИрдВ рд╢рд╛рдпрдж рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдХреЛ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдЗрд╕рдХреЗ рдмрд╛рдж рдЬрдВрдЧрдлреЗрдЯ рдХреА рдирдИ рд╕реБрд░реНрдЦрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде (рдФрд░ ? , рдЕрдЧрд░ рдореМрдЬреВрдж рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реЛрдЪрдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред

else if (!await container.ExistsAsync())

рджреБрд░реНрд▓рдн рдореЗрдВ рд╕реЗ рдПрдХ рдЬрд╣рд╛рдВ рдЙрдкрд╕рд░реНрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдерд╛ред

var response = (HttpWebResponse)await request.GetResponseAsync();

рдХреБрдЫ рдЬрд╛рддрд┐рдпрд╛рдБ рдереАрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдмреЗрд╢рдХ рдЬрд╛рддрд┐рдпрд╛рдБ рджреВрд╕рд░реА рдЬрдЧрд╣ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЬрдВрдЧ рдЙрдкрд╕рд░реНрдЧ рд╣реИ рд▓реЗрдХрд┐рди C # рдЙрдкрд╕рд░реНрдЧ рд╣реИред

using (var response = await this.httpClient.SendAsync(requestMsg))

рдпрд╣ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдмрдирд╛рдо рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЕрдВрддрд░ рд╣реИ: рдХреНрдпреЛрдВрдХрд┐ C # рдореЗрдВ Drop , рдЪреАрдЬреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЕрдВрдд рддрдХ _needing_ рдЪрд░ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЬрдВрдЬреАрд░ рдирд╣реАрдВ рд╣реИред

рд╡рд┐рднрд┐рдиреНрди рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ @scottmcm рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЬрдВрдЧ рд▓рдЧреА рд╣реИ:

// keyword
response.content.read_as_string()) await?.should().be(text);
// field
response.content.read_as_string()).await?.should().be(text);
// function
response.content.read_as_string()).await()?.should().be(text);
// macro
response.content.read_as_string()).await!()?.should().be(text);
// sigil
response.content.read_as_string())@?.should().be(text);
// sigil + keyword
response.content.read_as_string())@await?.should().be(text);
// keyword
let previous = branch.list_history(timestamp_utc, None, 1) await?.history_entries.single_or_default();
// field
let previous = branch.list_history(timestamp_utc, None, 1).await?.history_entries.single_or_default();
// function
let previous = branch.list_history(timestamp_utc, None, 1).await()?.history_entries.single_or_default();
// macro
let previous = branch.list_history(timestamp_utc, None, 1).await!()?.history_entries.single_or_default();
// sigil
let previous = branch.list_history(timestamp_utc, None, 1)@?.history_entries.single_or_default();
// sigil + keyword
let previous = branch.list_history(timestamp_utc, None, 1)@await?.history_entries.single_or_default();
// keyword
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;
// field
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async().await?.identity).await?;
// function
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async().await()?.identity).await()?;
// macro
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async().await!()?.identity).await!()?;
// sigil
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async()@?.identity)@?;
// sigil + keyword
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async()@await?.identity)@await?;

(рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП @ рдирд┐рдореЛ 157 рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж)

// keyword
let pending = transaction.connection.query(command) await.into_iter().collect::<Vec<EventView>>();
// field
let pending = transaction.connection.query(command).await.into_iter().collect::<Vec<EventView>>();
// function
let pending = transaction.connection.query(command).await().into_iter().collect::<Vec<EventView>>();
// macro
let pending = transaction.connection.query(command).await!().into_iter().collect::<Vec<EventView>>();
// sigil
let pending = transaction.connection.query(command)@.into_iter().collect::<Vec<EventView>>();
// sigil + keyword
let pending = transaction.connection.query(command)@await.into_iter().collect::<Vec<EventView>>();

рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, @ sigil рдЯреЗрдмрд▓ рд╕реЗ рджреВрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ ? рд╕рд╛рдордиреЗ рдЕрджреГрд╢реНрдп рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдХрд┐рд╕реА рдХреЛ рднреА рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдпрд╣ рдПрдХ рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реЛрдЧреА рдЕрдЧрд░ рд╣рдордиреЗ рдПрдХ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬреЛ рдзрд╛рд░рд╛рдУрдВ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рд░реЛрдзрдХ рдмрди рдЧрдпрд╛ред

// keyword
id = id.or_else(|| self.storage_coordinator.get_default_widget_async() await?.identity);

рдЖрдк рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ await рдЗрд╕ рддрд░рд╣ рдПрдХ рдмрдВрдж рдХреЗ рдЕрдВрджрд░, рд╡рд╣рд╛рдБ рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА Option рд╣реИ рдХрд┐ рдПрдХ async рдмрдВрдж рдХрд░рдиреЗ рдФрд░ рд░рд┐рдЯрд░реНрди рдПрдХ рд▓реЗрддрд╛ рд╣реИ Future рдЦреБрдж (рдХрдо рд╕реЗ рдЬрд┐рд╕ рдХреНрд╖рдг рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рд╕рдордп рдореЗрдВ async рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд░рд╛рд╕реНрддрд╛ рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛) ред

// keyword
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

(рдпрд╛ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рдмрдЬрд╛рдп if let рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХрд╛ рдЕрдзрд┐рдХ рдкреНрд░рддреНрдпрдХреНрд╖ рдЕрдиреБрд╡рд╛рдж)

@ рдирд┐рдореЛ 157 рдЪрдВрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

id = ok(id).transpose().or_else(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

рд▓реЗрдХрд┐рди if let рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, @ sigil рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рдордиреЗ рдЕрджреГрд╢реНрдп рд╣реИ?

рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
1

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ "рдЕрджрд░реНрд╢рди" рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди ? рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдФрд░ рдЪрд╛рд▓рд╛рдХ рд░рдВрдЧ-рдпреЛрдЬрдирд╛ рдЗрд╕реЗ рдФрд░ рднреА рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрдирд╛ рд╕рдХрддреА рд╣реИ (рдЬреИрд╕реЗ ? рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд░рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред

@newpavlov рдЖрдк рдмрд╛рд╣реНрдп рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд░рдВрдЧ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП gitlab / github рд╕рдореАрдХреНрд╖рд╛ рдЯреИрдм рдореЗрдВред

рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдЕрдиреНрдп рдХреА рдЕрдиреНрдп рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ, рдореИрдВ C ++ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдирдпрд╛ Rust рд╢рд┐рдХреНрд╖рд╛рд░реНрдереА рд╣реВрдВред рдмрд╕ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧрд╛

id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

рдпрд╛

id = id.or_else_async(async || { 
    self.storage_coordinator.get_default_widget_async() await?.identity 
}) await?;

рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ? await рд▓рд╛рдЗрди рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдХреА рдУрд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рд╣рдорд╛рд░рд╛ рдзреНрдпрд╛рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЦреЛрдЬ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ)ред
рдХреБрдЫ рдЗрд╕ рддрд░рд╣

id =  await? id.or_else_async(async || {
    let widget = await? self.storage_coordinator.get_default_widget_async();
    widget.identity
});

рдпрд╛

id = auto await {
    id.or_else_async(async || { self.storage_coordinator.get_default_widget_async()?.identity })
}?;

рдкрд╣рд▓реЗ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдореБрдЭреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдБред рдХреЛрдб, рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо, рдкрд╛рда рдХреЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдЗрддреНрдпрд╛рджрд┐ рдХреЛ рд╕реНрдХреИрди рдХрд░рддреЗ рд╕рдордп рдкрд╣рд▓реЗ рдХреБрдЫ рд╢рдмреНрдж рдХрд┐рд╕реА рдХреЛ рднреА рджрд┐рдЦрддреЗ рд╣реИрдВред рдпрд╣ рддреБрд░рдВрдд рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЛ рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рддрд╛ рд╣реИред

? рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ рдХрд┐ await? foo рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдФрд░ рд╕реАрдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрднреА рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛ рд╕рд╛рд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рдж рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЗрд╣рддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ @nicoburns рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрд╡ рдФрд░
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдЪреАрдЬреЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:

  • рдПрдХ рдЙрдкрд╕рд░реНрдЧ await рдХреАрд╡рд░реНрдб (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ? рд╕реЗ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдмрдВрдзрди рдХреЗ рд╕рд╛рде рд╕реНрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ)
  • std::Future рдкрд░ рдПрдХ рдирдИ рд╡рд┐рдзрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП fn awaited(self) -> Self::Output { await self } ред рдЗрд╕рдХрд╛ рдирд╛рдо block_on рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ blocking , рдпрд╛ рдХреБрдЫ рдФрд░ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рджреЛрдиреЛрдВ "рд╕рд░рд▓" рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдПрдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдХреАрд╡рд░реНрдб рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рджреМрд░рд╛рди, рдЕрд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рджреВрд╕рд░рд╛ рдмреБрд▓реЗрдЯ рдкреЙрдЗрдВрдЯ рднреА рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдо .awaited!() рд▓рд┐рдЦреЗрдВрдЧреЗред

рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛:

let done = await delayed;

let value = await delayed_result?;

let value2 = await some.thing()?;

let value3 = some.other().thing().awaited()?;

let value4 = promise
        .awaited()
        .map_err(|e| e.into())?
        .obtain_other_future()
        .awaited();

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдореБрдЦреНрдп рдмрд┐рдВрджреБ await рд╣реИ, рдЬреЛ рдХрд┐ рддрдВрддреНрд░ рдХреЗ рдореВрд▓ рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, match , рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рдХрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рд╣реИрдВ рдХреАрд╡рд░реНрдб рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕рд┐рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдкрд╣рд▓реЗ рд╕рд░рд▓ await , рдлрд┐рд░ рдмрд╣реБрдд рд╕реЗ рдХреЛрд╖реНрдардХ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП .awaited() рдФрд░ рдЪреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рдЕрдзрд┐рдХ рдЬрд╛рджреБрдИ рд╕рдВрд╕реНрдХрд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ await рдХреАрд╡рд░реНрдб рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ std рдкрд░ рдПрдХ рдЬрд╛рджреВ .awaited() рдкрджреНрдзрддрд┐ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рднрд╡рд┐рд╖реНрдп, рдЬрд┐рд╕реЗ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдкрдирд╛ рд╡рд╛рдпрджрд╛ рд▓рд┐рдЦрдХрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рдкреНрд░рддрд┐рд░реВрдк рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред

std::Future рдкрд░ рдПрдХ рдирдИ рд╡рд┐рдзрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП fn awaited(self) -> Self::Output { await self }

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ (рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬрд╛рджреВ рдХрд┐рдП рдмрд┐рдирд╛), рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ async fn awaited(self) -> Self::Output { await self } , рдЬреЛ рдЕрднреА рднреА await ed рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдФрд░ рдЕрдЧрд░ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬрд╛рджреВ рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдХреАрд╡рд░реНрдб, IMO рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╣рд╛рдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Future::wait (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ 0.3 рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИ?), рдЬреЛ рдереНрд░реЗрдб рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рднрд╡рд┐рд╖реНрдп рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ _ await рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдмрд┐рдВрджреБ ___ рдХреЛ рдереНрд░реЗрдб_ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рд╣реИ рдФрд░ рд╣рдо рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡рд┐рдХрд▓реНрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рди рдХрд┐ рдХреЛрдИ рд╡рд┐рдзрд┐ред

рдФрд░ рдЕрдЧрд░ рдЖрдк рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рджреБрдИ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ .await() рдХрд╣реЗрдВ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдереНрд░реЗрдб рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЪрд░реНрдЪрд╛ рдХрд░ рдЪреБрдХрд╛ рд╣реИ, рджреЛрдиреЛрдВ рдПрдХ рдХреАрд╡рд░реНрдб рд╡рд┐рдзрд┐ рдФрд░ рдПрдХ рдЬрд╛рджреБрдИ extern "rust-await-magic" "рд╡рд╛рд╕реНрддрд╡рд┐рдХ тАЬfn

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: scottmcm рдирд┐рдВрдЬрд╛ рдореБрдЭреЗ рдФрд░ GitHub рдиреЗ рдореБрдЭреЗ рд╕реВрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдореЛрдмрд╛рдЗрд▓?), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрднреА рднреА рдЗрд╕реЗ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

@scottmcm рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдЖрд╡реГрддреНрддрд┐ рдЧрдгрдирд╛ рдХрд╛ рднреА рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░ рдкрд╛рдПрдВрдЧреЗ рдЬрд╣рд╛рдБ await рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рдерд╛? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдмрдирд╛рдо рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдЖрд╡реГрддреНрддрд┐ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрдИ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

  1. рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рддрдХ await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд░рд╣рд╛ рд╣реИ
client.get("https://my_api").send() await?.json() await?

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрдИ рдкрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЕрдиреНрдп рдорд╛рдорд▓реЗ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рдХрд╛рд▓реЗрдВ рдпрджрд┐ рдпрд╣ рдмрд╛рд░-рдмрд╛рд░ рдХреЛрдбрдмреЗрд╕ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ?

  1. рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреА, рдЕрдЧрд░ рдХреБрдЫ рд▓реЛрдЧ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

рд╡реЗ рдЬреЛ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ await рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдЬ рдмрд┐рдВрджреБ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ ред

  1. рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдХреЛ рдЕрдиреНрдп рдореБрдЦреНрдпрдзрд╛рд░рд╛ рдХреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдореМрдЬреВрдж рдХреБрдЫ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрджрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рд░реЗрдЦрд╛ рдХреЗ рдмрд╣реБрдд рдЕрдВрдд рдХреА рдУрд░ рдзрдХреЗрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рд╣рдорд╛рд░рд╛ рдзреНрдпрд╛рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЦреЛрдЬ рдЗрдВрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ)ред

рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЗрдВрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХрд┐ рд▓реЛрдЧ рдПрдл-рдЖрдХрд╛рд░ рдХреЗ рдкреИрдЯрд░реНрди , @ dowchris97

рдпрд╣ рдПрдХ рджрд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреГрд╖реНрда рдкрд░ рдпрд╣ рдЕрдиреНрдп рдПрдХ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рдореЗрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ ? рд▓рд┐рдП рдХреИрд╕реЗ рджреЗрдЦреЗрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ await :

рдЪрд┐рддреНрддреАрджрд╛рд░ рдкреИрдЯрд░реНрди рдореЗрдВ рдкрд╛рда рдХреЗ рдмрдбрд╝реЗ рднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдФрд░ рд╕реНрдХреИрди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬрд╝ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд▓рд┐рдВрдХ, рдЕрдВрдХ, рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрдж рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╢рдмреНрджреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ (рдЬреИрд╕реЗ рдкрддрд╛ рдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░)ред

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ Result рдмрдЬрд╛рдп impl Future :

let id = id.try_or_else(|| Ok(self.storage_coordinator.try_get_default_widget()?.identity))?;

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдл-рдЖрдХрд╛рд░ рдХреЗ рдкрдврд╝рдиреЗ рдХреЗ рдкреИрдЯрд░реНрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ ? s рдЦреЛрдЬрдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рди рд╣реА рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ

let id = id.try_or_else(|| {
    let widget = self.storage_coordinator.try_get_default_widget()?;
    Ok(widget.identity)
})?;

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рд╡рд┐рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рддрд░реНрдХ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреА рд╕реНрдерд┐рддрд┐ "рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ ? рдЫрд┐рдкрд╛рдиреЗ рдХреА рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯ рд╣реИ рддрд╛рдХрд┐ рдХрднреА рднреА рд╡рд╛рдкрд╕реА рдмрд┐рдВрджреБ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХреЗ", рдЬреЛ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЙрддреНрддрд░ рдореЗрдВ рд╕реЗ рдПрдХ рдерд╛ ? рдмрд╛рд░реЗ рдореЗрдВ рдореВрд▓ рдЪрд┐рдВрддрд╛рдПрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред

рддреЛ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдбрд╛рд▓рдирд╛ рдЬрд╣рд╛рдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА ? рд▓рд┐рдП рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

@scottmcm

рдпрд╣ рдПрдХ рджрд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреГрд╖реНрда рдкрд░ рдпрд╣ рдЕрдиреНрдп рдПрдХ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рдореЗрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ ? рд▓рд┐рдП рдХреИрд╕реЗ рджреЗрдЦреЗрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ await :

рдЪрд┐рддреНрддреАрджрд╛рд░ рдкреИрдЯрд░реНрди рдореЗрдВ рдкрд╛рда рдХреЗ рдмрдбрд╝реЗ рднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдФрд░ рд╕реНрдХреИрди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬрд╝ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рд▓рд┐рдВрдХ, рдЕрдВрдХ, рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрдж рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╢рдмреНрджреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ (рдЬреИрд╕реЗ рдкрддрд╛ рдпрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░)ред

рдпрд╣ рднреА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреЛрдИ рд╕рдмреВрдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЪрд┐рддреНрддреАрджрд╛рд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдб рдХреЛ рдмреЗрд╣рддрд░ / рддреЗрдЬ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЦрд╛рд╕рддреМрд░ рдкрд░ рдЬрдм рдЗрдВрд╕рд╛рди рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдПрдл рд╢реЗрдк рдкреИрдЯрд░реНрди рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЬрд┐рдХреНрд░ рдХрд░реВрдВрдЧрд╛ред

рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВ, рдЬрдм рдЖрдк рд╕реНтАНрдкреЙрдЯреЗрдб рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдорд╛рди рд▓реАрдЬрд┐рдП рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рдХрднреА рдРрд╕рд╛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИред

id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

рдореЗрд░реЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрдм рдореИрдВрдиреЗ async , рддреЛ рдореИрдВ рдкрд╣рд▓реЗ await? , рдлрд┐рд░ self.storage_coordinator.get_default_widget_async() рдЬрд╛рдКрдВ, рдлрд┐рд░ .identity , рдлрд┐рд░ рдореБрдЭреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдкреВрд░реА рд▓рд╛рдЗрди рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдкрдврд╝рдиреЗ рдХрд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд▓рд┐рдЦрд┐рдд рднрд╛рд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЗрдВрдЯрд░рд▓реЗрд╡реНрдб рдлреЙрд░рд╡рд░реНрдб рдФрд░ рдмреИрдХрд╡рд░реНрдб рдЬрдВрдк рдирд╣реАрдВ рд╣реИрдВ ред рдЬрдм рдЖрдк рдХреВрджрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрд╕ рдкрдВрдХреНрддрд┐ рдХреЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рддрд╛ рд╣реИ рдЬреЛ рдпрд╣ рд░реЗрдЦрд╛ рдХрд░ рд░рд╣реА рд╣реИред

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд▓рд╛рдЗрди рдХреНрдпрд╛ рдХрд░ рд░рд╣реА рд╣реИ, рдЖрдк рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ?

id = await? id.or_else_async(async || {
    let widget = await? self.storage_coordinator.get_default_widget_async();
    widget.identity
});

рдЬреИрд╕реЗ рд╣реА рдореИрдВ await? рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рддреБрд░рдВрдд рдПрдХ рд╣реЗрдб-рдЕрдк рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИред рдореИрдВрдиреЗ рддрдм let widget = await? рдкрдврд╝рд╛, рдлрд┐рд░ рд╕реЗ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрдард┐рдирд╛рдИ рдХреЗ, рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ async рд╣реИ, рдХреБрдЫ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдПрдл рдЖрдХрд╛рд░ рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВред Https://thenextweb.com/dd/2015/04/10/how-to-design-websites-that-mirror-how-our-eyes-work/ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдл рдЖрдХрд╛рд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреИрдЯрд░реНрди рд╣реИред рддреЛ, рдХреНрдпрд╛ рд╣рдо рдПрдХ рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдорд╛рдирд╡ рдкреНрд░рдХреГрддрд┐ рдХреЛ рдлрд┐рдЯ рдХрд░рддреА рд╣реИ рдпрд╛ рдХрд┐рд╕реА рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ рд╣рдорд╛рд░реА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╡рд┐рд╢реЗрд╖ рд╢рд┐рдХреНрд╖рд╛ рдФрд░ рдХрд╛рд░реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ? рдореИрдВ рдкрд╣рд▓реЗ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЕрдВрддрд░ рддрдм рдФрд░ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рд╣реЛрдЧрд╛ рдЬрдм рдПрд╕рд┐рдВрдХреНрд╕ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реЗрдЦрд╛рдПрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЗрдВрдЯрд░рд▓реЗрдп рдХреА рдЬрд╛рддреА рд╣реИрдВ

await? id.or_else_async(async || {
    let widget1 = await? self.storage_coordinator.get_default_widget_async();
    let result1 = do_some_wierd_computation_on(widget1.identity);
    let widget2 = await? self.network_coordinator.get_default_widget_async();
    let result2 = do_some_strange_computation_on(widget2.identity);
});

рдХреНрдпрд╛ рдореИрдВ await? рд░реЗрдЦрд╛рдУрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ?

рдЖрдЗрдбреА = id.try_or_else (|| Ok (self.storage_coordinator.try_get_default_widget ()ред рдкрд╣рдЪрд╛рди)) ?;

рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рддреБрд▓рдирд╛ рдЕрдЪреНрдЫреА рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, ? рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХреЛ рдЗрддрдирд╛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рджреВрд╕рд░рд╛, ? рдХреА рд╕рдлрд▓рддрд╛ рдЗрд╕ рддрдереНрдп рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╢рдмреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдХреВрджрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред ? .try_get_default_widget()? рдкрдврд╝рддреЗ рд╕рдордп рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛ рднрд╛рд╡рдирд╛ рд╣реИ, "рдареАрдХ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдХреБрдЫ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ"ред рдмрд╕ред рдореБрдЭреЗ рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдХреВрджрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдореЗрд░рд╛ рд╕рдордЧреНрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреБрдЫ рд╕реАрдорд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдХреЛрдб рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓рд┐рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдЧрд╛рддрд╛рд░ рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд rustfmt рд╢реИрд▓реА рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ ( while -> async , match -> await ) рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

while fn foo() {
    identity = identity
        .or_else_async(while || {
            self.storage_coordinator
                .get_default_widget_async().match?
                .identity
        }).match?;
}

рдореИрдВ рдЖрдкрдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рд▓реЗрдХрд┐рди рдореИрдВ match рддреЛрдВ рддреБрд░рдВрдд рд╣рд╛рдЬрд┐рд░ рд╣реВрдВред

(рд╣реЗ @ CAD97 , рдореИрдВрдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛!)

@ dowchris97

рдпрджрд┐ рдЖрдк рдпрд╣ рддрд░реНрдХ рджреЗрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ ? рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рдореЗрд░реЗ рддрд░реНрдХ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ рдХрд┐ await рдХреЛ рдХреЛрдб рдХреЗ рдЕрдкрдиреЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП? (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкрдХреНрд╖ рд▓рд┐рдпрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИ)ред

рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рд╣реЗрдбрд░ рдХреЗ _beginning_ рдкрд░ async рдкрдврд╝рд╛ред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдЗрддрдирд╛ рдмрдбрд╝рд╛ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рд╕реНрдХреНрд░реАрди рдкрд░ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ await рдЕрдВрдХ рдЦреЛрдЬрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдиреНрдп, рдмрдбрд╝реА рдкрдардиреАрдпрддрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк async , рддреЛ рдЖрдкрдХреЛ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕рднреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИ рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╡рд░реНрддрдорд╛рди рдЯреНрд░реЗрди рдХреЛ рдкрд╛рд░реНрдХ рдХрд░рдХреЗ Output рдкрд░рд┐рдгрд╛рдо рдореЗрдВ Future рдЖрд╕реНрдердЧрд┐рдд рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдЬрдЯрд┐рд▓ рд░рд╛рдЬреНрдп рдорд╢реАрди рдкрд░рд┐рд╡рд░реНрддрдиред рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИред рдУрдПрд╕ рдереНрд░реЗрдбреНрд╕ рдФрд░ рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╕реЗ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреНрдп рдХреЛрдб рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдкрд░ рдЪрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЖрдк рдЖрд╕реНрдердЧрд┐рдд рдЧрдгрдирд╛ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП Sync рдЖрдкрдХреА рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред (рдпрджрд┐ рдХреБрдЫ рднреА рд╣реЛ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреБрдорд╛рди рдХреЗ рдмрдЬрд╛рдп async fn Send + Sync рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдзрд╛рдЧрд╛-рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рдПрдЧреАред)

рдмрд╣реБрдд рдЕрдзрд┐рдХ рдлрд╝рдВрдХреНрд╢рди-рдЙрдиреНрдореБрдЦ рд╢реИрд▓реА рдореЗрдВ, рдЖрдкрдХреЗ рд╡рд┐рдЬреЗрдЯ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдРрд╕реЗ рджрд┐рдЦреЗрдВрдЧреЗ (рд╣рд╛рдБ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдореЛрдирд╛рдб рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢реБрджреНрдзрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЖрджрд┐ рдореБрдЭреЗ рдорд╛рдл рдХрд░ рджреЗрдВ):

    let widget1 = await(get_default_widget_async(storage_coordinator(self)));
    let result1 = do_some_wierd_computation_on(identity(widget1));
    let widget2 = await(get_default_widget_async(network_coordinator(self)));
    let result2 = do_some_strange_computation_on(identity(widget2));

рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реЗ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднреАрдбрд╝ рдиреЗ "рдкрд╛рдЗрдкрд▓рд╛рдЗрди" рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛, |> :

    let widget1 = self |> storage_coordinator |> get_default_widget_async |> await;
    let result1 = widget1 |> identity |> do_some_wierd_computation_on;
    let widget2 = self |> network_coordinator |> get_default_widget_async |> await;
    let result2 = widget2 |> identity |> do_some_strange_computation_on;

рдФрд░ рдЬрдВрдЧ рдореЗрдВ, рдХрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ . , рдЬреЛ рд╡рд┐рдзрд┐ рдЖрд╡реЗрджрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдЬреНрдб рдФрд░ рдЯрд╛рдЗрдк-рдбрд╛рдпрд░реЗрдХреНрдЯреЗрдб рд▓реБрдХрдЕрдк рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ:

    let widget1 = self.storage_coordinator.get_default_widget_async().await();
    let result1 = widget1.identity.do_some_wierd_computation_on();
    let widget2 = self.network_coordinator.get_default_widget_async().await;
    let result2 = widget2.identity.do_some_strange_computation_on();

рдЬрдм рдЖрдк . рдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ |> рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдХреНрд╕рд░ рдЬрдВрдЧ рдореЗрдВ рджреЗрдЦреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдПрдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдмрдирд╛рдиреЗ рд▓рдЧрддреА рд╣реИрдВ, рдФрд░ рдЬрдм рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рд╕реЗрдВрдЯреНрд░рд┐рд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ) 'рдкрдардиреАрдпрддрд╛ рдХреЛ рдпрд╛рдж рди рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбреЗрдЯрд╛ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╣реИред

await рдЖрдкрдХреЛ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИ "рдЕрд░реЗ рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ"ред async рдХрд░рддрд╛ рд╣реИред await рдмрд╕ рдЖрдк рдХреИрд╕реЗ рдкрд╛рд░реНрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрд╕реНрдердЧрд┐рдд рдЧрдгрдирд╛ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд░рд╕реНрдЯ рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдпрд╛ рдЬрд╛рдПред

(рдЕрд░реЗ @ рд╕рд╣реГрджрдп рдЖрдк рднреВрд▓ рдЧрдП рдХрд┐ async fn (рдпрд╛ while fn ), рдЬреЛ рдореЗрд░реА рдмрд╛рдд рдХреЛ рдХреБрдЫ рд╣рдж рддрдХ somewhat рдШрдЯрд╛ рджреЗрддрд╛ рд╣реИ)

рд╣рдо рдореИрдХреНрд░реЛ рдЗрдирд╡реЛрдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ

m!(item1, item2)

рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рд╣реИ

item1.m!(item2)

рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рджреЛрдиреЛрдВ рд╢реИрд▓реА рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

await!(future)

рддрдерд╛

future.await!()

@ CAD97

await рдЖрдкрдХреЛ рдирд╣реАрдВ рдмрддрд╛рддрд╛ "рдЕрд░реЗ рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ"ред async рдХрд░рддрд╛ рд╣реИред await рд╕рд┐рд░реНрдл рдЖрдк рдХреИрд╕реЗ рдкрд╛рд░реНрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрд╕реНрдердЧрд┐рдд рдЧрдгрдирд╛ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд░рд╕реНрдЯ рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдпрд╛ рдЬрд╛рдПред
рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдБ рд▓реЗрдХрд┐рди рдХрдареЛрд░рддрд╛ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ред

рдореИрдВ рднреА рдЖрдкрдХреА рдмрд╛рдд рд╕рдордЭрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ await рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЬрдмрд░рджрд╕реНрдд рд░реВрдк рд╕реЗ рдмреЗрд╣рддрд░ рд▓рдЧреЗрдЧрд╛ред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ |> рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рдФрд░ рдЕрд░реНрде рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ await рд╕реНрдерд╛рди рдкрд░ Rust рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдФрд░ рдмреЗрд╣рдж рд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрддрд╛ рд╣реИ:

// A
if |> db.is_trusted_identity(recipient.clone(), message.key.clone())? {
    info!("recipient: {}", recipient);
}

// B
match |> db.load(message.key)? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = |> client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .send()?
    .error_for_status()?;

// D
let mut res: InboxResponse =
    |> client.get(inbox_url)
        .headers(inbox_headers)
        .send()?
        .error_for_status()?
    |> .json()?;

// E
let mut res: Response =
    |> client.post(url)
        .multipart(form)
        .headers(headers.clone())
        .send()?
        .error_for_status()?
    |> .json()?;

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = |> self.request(url, Method::GET, None, true)?
               |> .res.json::<UserResponse>()?
                  .user
                  .into();

    Ok(user)
}

рдкрдврд╝рдиреЗ рдХреЗ рдЖрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ ? рдСрдкрд░реЗрдЯрд░ try!() рдкрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред рд╕рдм рдХреЗ рдмрд╛рдж, "рдЕрд░реЗ рдпрд╣ рдЙрдкрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди "рдЕрд░реЗ рдпрд╣ рдЬрд▓реНрджреА рд▓реМрдЯ рд╕рдХрддрд╛ рд╣реИ" рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреГрд╢реНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ ? ( рдЗрд╕ рдЗрдВрдЯрд░реНрдирд▓ рдереНрд░реЗрдб рдФрд░ рдЗрд╕ GitHub рдореБрджреНрджреЗ рд╕рд╣рд┐рдд ) рдкрд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╕рдореБрджрд╛рдп рдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕реЗ рдордВрдЬреВрд░реА рджреЗ рджреА, рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреА рдЖрджрдд рдкрдбрд╝ рдЧрдИред рдпрд╣ рдЕрдм рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкрдХреНрд╖реЛрдВ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ ? рдФрд░ await рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ, рд╕рдореБрджрд╛рдп рдиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рджрд┐рдпрд╛ рдХрд┐ рджреГрд╢реНрдпрддрд╛ рдХрд┐рддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдкрдврд╝рдиреЗ рдХреЗ рдЖрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддрд░реНрдХ ? рдСрдкрд░реЗрдЯрд░ try!() рдкрд░ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред рд╕рдм рдХреЗ рдмрд╛рдж, "рдЕрд░реЗ рдпрд╣ рдЙрдкрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ" рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди "рдЕрд░реЗ рдпрд╣ рдЬрд▓реНрджреА рд▓реМрдЯ рд╕рдХрддрд╛ рд╣реИ" рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреГрд╢реНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ ? ( рдЗрд╕ рдЗрдВрдЯрд░реНрдирд▓ рдереНрд░реЗрдб рдФрд░ рдЗрд╕ GitHub рдореБрджреНрджреЗ рд╕рд╣рд┐рдд ) рдкрд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╕рдореБрджрд╛рдп рдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЗрд╕реЗ рдордВрдЬреВрд░реА рджреЗ рджреА, рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреА рдЖрджрдд рдкрдбрд╝ рдЧрдИред рдпрд╣ рдЕрдм рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдХрд┐ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд рдкрдХреНрд╖реЛрдВ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ ? рдФрд░ await рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ, рд╕рдореБрджрд╛рдп рдиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓ рджрд┐рдпрд╛ рдХрд┐ рджреГрд╢реНрдпрддрд╛ рдХрд┐рддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреНрдпрд╛ рдореЙрдбрд▓ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЭрдЯрдХреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рд╕рд╣рдЬ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпреЗ рдХрд╛рдлреА рд╣рдж рддрдХ рдПрдХ рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рдкрд░ рдФрд░ рдмрд╣рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдореБрджрд╛рдп рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рдорд╛рдзрд╛рди рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣рд╛рдВ рдХрдИ рд▓реЛрдЧ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

рдореЛрдЬрд╝рд┐рд▓рд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рд╕рд╣реА рдмрдирд╛рддрд╛ рд╣реИ? рдпрд╣ рд╕рдм рдпреВрдЖрдИ / рдпреВрдПрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ! рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЧрдВрднреАрд░ рдПрдЪрд╕реАрдЖрдИ рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдЕрдиреБрдорд╛рдиред

@ dowchris97 рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реНрд╡ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рдХреЗрд╡рд▓ ( рджреЛ ) рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ: рдбреЗрдЯрд╛рдмреЗрд╕ рдФрд░ рд░реЗрдХрд╡реЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде ~ 24k рд▓рд╛рдЗрдиреЛрдВ рдХреА рдПрдХ рддреБрд▓рдирд╛ рдФрд░ рдПрдХ рддреБрд▓рдирд╛ рдЬреЛ C # рдкрд░ рдЖрдзрд╛рд░ RR рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд╕рдЯреАрдХ рддреБрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ ред рджреЛрдиреЛрдВ рдпрд╣ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ realworld рдХреЗ рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддреА рд╣реИ, рдФрд░ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдмрд┐рдирд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдореВрд▓реНрдп рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рд╣реИред рдЬрдм рддрдХ рдХреЛрдИ рдЕрдиреНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рдкрд░реАрдд рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ, рдореИрдВ рдХрд╛рдлреА рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реНрд╡рдпрдВ рдкрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рд░рд╕реНрдЯ рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдореВрд▓реНрдп рд╢рдмреНрджрд╛рд░реНрде (рдЬрд╣рд╛рдВ рдореБрд╣рд╛рд╡рд░рд╛ рдХреЛрдб рдкрдврд╝рдирд╛ рд╣реИ) рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рд╕реБрдЭрд╛рдПрдЧрд╛)ред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрджрд┐ рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ C #, Python, C ++, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рднреА рд╕рджрд╕реНрдп рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЗ рдмрдЬрд╛рдп self рдореВрд▓реНрдп рдХреЗ рд╣реЛрдВред C ++ рдореЗрдВ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рддрд╛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рдХрдЯрддрдо рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдХреНрд░рдо рдЕрднреА рднреА рд░рд╕реНрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ await рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдЙрдкрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ рди рдХрд┐ рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рдЕрдкрдиреЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреИрд╕реЗ рдЬрдВрдЧ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИрдВ (рдХреЗ рд▓рд┐рдП) рдЙрдкрд╕рд░реНрдЧ, рдЬрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ sigils рдХреЗ рд░реВрдк рдореЗрдВ ? рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдХрд░рдгреАрдп рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣реИ await foo() рд╕реЗ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ foo() await рдФрд░ рдХреНрдпреЛрдВ рдХреБрдЫ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ @ рдПрдХ рдмрдпрд╛рди рдХреЗ рдЕрдВрдд рдореЗрдВ рдФрд░ рд╣реЛрдиреЗ рдирд╛рдкрд╕рдВрдж await рд╡рд╣рд╛рдБред

рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП .await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ: рдбреЙрдЯ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЦреЗрддреЛрдВ рдФрд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рддрд░реАрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рднреА рдХрд┐ рдЗрд╕реЗ рд╢реБрджреНрдз рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛), рдЗрд╕рд▓рд┐рдП .await рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ рдХрд┐ "рдбреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рди рддреЛ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рд╣реИ рдФрд░ рди рд╣реА рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди"ред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ await рдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд░реНрдЬрди ( @ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ) рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рджреЛрдиреЛрдВ рдпрд╣ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд░рд┐рдпрд▓рд╡рд░реНрд▓реНрдб рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддреА рд╣реИ

рдпрд╣ рдПрдХ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдмрдпрд╛рди рд╣реИред рд░реЗрдХрд╡реЗрд╕реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдЕрд▓рдЧ рдиреЛрдЯ рдкрд░, рдЕрдЧрд░ рдпрд╣ рдЪрд░реНрдЪрд╛ рдПрдХ рд╡реЛрдЯ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддреА рд╣реИ рдХрд┐ рдХреМрди рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдЗрд╕реЗ рд░реЗрдбрд┐рдЯ рдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд▓реЛрдЧ рд╢рд┐рдХрд╛рдпрдд рди рдХрд░реЗрдВ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдореЗрдВ impl Trait рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред

@ рдпреВрдЬреАрди 2k рд░реБрд╕реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рдорд╛рдирд╕рд┐рдХ рдореЙрдбрд▓ рдХреЛ рдлрд┐рдЯ рдХрд░реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВ рдЗрд╕рдХреА рдореМрд▓рд┐рдХ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХрд╛рдВрд╢ рдпрд╛ рд╕рднреА рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЙрдкрд╕рд░реНрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЗ рдмреАрдЪ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рдмреАрдЪ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрдардиреАрдпрддрд╛ рдЕрдВрддрд░ рд╣реИред рдСрдкрд░реЗрдЯрд░ рдкреВрд░реНрд╡рддрд╛ рдХреА рдореЗрд░реА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рддреБрд▓рдирд╛ рднреА рджреЗрдЦреЗрдВ рдЬреЛ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдЕрдзрд┐рдХрддрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╛рдорд▓рд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдСрдкрд░реЗрдЯрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрд░реНрде рдмрддрд╛рддрд╛ рд╣реИ (рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдирд╣реАрдВ рджреВрд╕рд░реЛрдВ рдкрд░ рдПрдХ рдордЬрдмреВрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ)ред

@ рд░рд╕реНрдЯ рдореЗрдВ

рдХреЛрд░ / рд▓реИрдВрдЧ рдЯреАрдореЗрдВ рд╕рднреА рд╡рд┐рднрд┐рдиреНрди рддрд░реНрдХреЛрдВ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЛ рджреЗрдЦрддреА рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдирд┐рд░реНрдгрдп рд▓реЗрддреА рд╣реИрдВред рдпрд╣ рдирд┐рд░реНрдгрдп рдЖрдо рд╕рд╣рдорддрд┐ (рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдмреАрдЪ) рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рд░рд╕реНрдЯ рдЯреАрдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдореБрджрд╛рдп рдХреА рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░рдХрд╛рд░ рд╡реЗ рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ рд░реБрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдордЭрддреА рд╣реИрдВред

рд░рд╕реНрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирдИ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕реНрддреБрдд рдирдИ рдмрд╣рд╕ рдХрд░рдирд╛ рд╣реИ, рдпрд╛ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рджрд┐рдЦрд╛рдирд╛ рд╣реИред

рдореМрдЬреВрджрд╛ рддрд░реНрдХреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП рдпрд╛ "рдореБрдЭреЗ рднреА" (рдпрд╛ рд╕рдорд╛рди) рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрднреА рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЕрдкрд╡реЛрдЯ / рдбрд╛рдЙрдирд╡реЛрдЯреНрд╕ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреЗ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

(рдореИрдВ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдмрддрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред)

@Pauan рдпрд╣ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреЛрд░ / рд▓реИрдВрдЧ рдЯреАрдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рджреЗрдЦрддреА рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдирд┐рд░реНрдгрдп рд▓реЗрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди "рдЬреЛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ" рдХреЗ рдирд┐рд░реНрдгрдп рд╡реНрдпрдХреНрддрд┐рдЧрдд рдирд┐рд░реНрдгрдп рд╣реИрдВред рдирд┐рд░реНрдгрдпрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рддрд╛рд░реНрдХрд┐рдХ рддрд░реНрдХ рдХреА рдХреЛрдИ рднреА рд░рд╛рд╢рд┐ рдЙрдирдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдирд╣реАрдВ рдмрджрд▓реЗрдЧреА рдЬреЛ рд╡реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реНрдХ 'рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓реЛрдЧ рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо рдкрдврд╝рддреЗ рд╣реИрдВ' рдФрд░ 'рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрдзреНрдпрдпрди рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╢реЛрдзреЛрдВ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд▓реЛрдЧ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХрд┐' рдЖрд╕рд╛рдиреА рд╕реЗ рдЪреБрдирд╛рд╡ рд▓рдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдмреБрд░реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ)ред рдирд┐рд░реНрдгрдпрдХрд░реНрддрд╛ рдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдкрдиреЗ рдирд┐рд░реНрдгрдп рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рджреЗрдЦ рдФрд░ рдирд╛рдкрд╕рдВрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЗрди рд╕рднреА рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рдЯреАрдо рдХреЗ рдирд┐рд░реНрдгрдпрдХрд░реНрддрд╛рдУрдВ рдкрд░ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЬреЛ рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рдЯреАрдо рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЗрди рд╕рднреА рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рдЯреАрдо рдХреЗ рдирд┐рд░реНрдгрдпрдХрд░реНрддрд╛рдУрдВ рдкрд░ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЬреЛ рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рдЯреАрдо рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдирд┐рд░реНрдгрдп рд╣рдореЗрд╢рд╛ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрд╡рдзрд┐ред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдЬрд╛рдирдмреВрдЭрдХрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЕрдХреНрд╕рд░ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдиреЗ рд╕рдореБрджрд╛рдп рдХреЗ рднреАрддрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рднреА рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рдкрд╛рд╕ рдбреЗ рдЬреНрдпреВрд░ рдФрд░ рдбреА рдлреИрдХреНрдЯреЛ рдЕрдереЙрд░рд┐рдЯреА рджреЛрдиреЛрдВ рд╣реИрдВред

рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддреА рд╣реИ (рд╢рд╛рдпрдж рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдФрд░ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдп рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЕрдкрдирд╛ рдирд┐рд░реНрдгрдп рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдирд┐рд░реНрдгрдп рд╣рдореЗрд╢рд╛ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдлреИрд╕рд▓реЛрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рдХреБрдЫ рдорд╛рддреНрд░рд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЦреБрд╢ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рд░реНрдгрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрд┐рд╕реА рдирд┐рд░реНрдгрдп рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд░реВрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдгрд╛рд▓реА рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЖрдо рд╕рд╣рдорддрд┐ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред

рд░рд╕реНрдЯ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╢рд╛рд╕рд┐рдд рдХрд┐рдпрд╛

(рдкреАрдПрд╕ рдореИрдВ рдХреЛрд░ рдпрд╛ рд▓реИрдВрдЧ рдЯреАрдореЛрдВ рдкрд░ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕ рдлреИрд╕рд▓реЗ рдореЗрдВ рдХреЛрдИ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рдЯрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛, рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдЬреИрд╕реЗ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ)

@HeroicKatora

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рдмреАрдЪ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрдардиреАрдпрддрд╛ рдХрд╛ рдЕрдВрддрд░ рд╣реИ

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ foo().await()?.bar().await()? foo() await?.bar() await? рдпрд╛ foo()@?.bar()@? рддреБрд▓рдирд╛ рдореЗрдВ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕реЗ рддрд░реАрдХреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдПрдХ рдмреБрд░реА рдорд┐рд╕рд╛рд▓ рдирд╣реАрдВ рд╣реИрдВред

рдореИрдВ рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ: foo(){await}?.bar()?{await} ? рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЖрд╕рд╛рди рд╣реИред

рдФрд░ рдлрд┐рд░ рднреА рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.[await request(url, Method::GET, None, true)]?
        .res.[await json::<UserResponse>()]?
        .user
        .into();

    Ok(user)
}

рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ рдпрд╣ рдХреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ:

  • рд╕реНрдХреНрд╡рд╛рдпрд░ рдХреЛрд╖реНрдардХ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдлрд╛рдИ рдХрд░рддрд╛ рд╣реИред
  • рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИ рдЬреЛ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдЕрд╕реНрдерд╛рдпреА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдлрд╛рдпрджрд╛ рд╣реИред рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдПрдХ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдЙрдЪреНрдЪ рдЬрдЯрд┐рд▓рддрд╛ / рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЕрдиреБрдкрд╛рдд рдХреЗ рдХрд╛рд░рдг рдЙрдирдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рд░рд╕реНрдЯ рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИрдВред рд╕рдВрднрд╛рд╡рд┐рдд рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рд╕реВрдЪреА рдиреАрдЪреЗ рджреА рдЧрдИ рд╣реИ:

  1. рд╕рднреА рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ ( await - рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП):
let result = api.method().[await returns_future()];
let cond = long.method().chain().[!is_empty()];
let val = something.[*returns_ref()];
  1. рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрдкрд░реЗрдЯрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛:
// from https://users.rust-lang.org/t/pipe-results-like-elixir/11175/19
let deserialized: DataType =
    Path::new("path/to/file.json")
        .[File::open(&it)].expect("file not found")
        .[serde_json::from_reader(it)].expect("error while reading json");
  1. рдУрд╡рд░рд░рд╛рдЗрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди:
let sorted_vec = iter
    .map(mapper)
    .collect::<Vec<_>>()
    .[sort(),];
  1. рдирд┐рдХрд╛рд╕реА рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛:
consume(&HashMap::new(). [
    insert("key1", val1),
    insert("key2", val2),
]);
  1. рдЪреЗрди рд╡рд┐рднрд╛рдЬрди:
let sf = surface(). [
    draw_circle(ci_dimens).draw_rectangle(rect_dimens).finish()?,
    draw_something_custom().finish()?,
];
  1. рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝:
let x = long().method().[dbg!(it)].chain();

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдореИрдЬрд┐рдХ рдлрд╝реАрд▓реНрдб, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝, рдмреНрд░реИрдХреЗрдЯреНрд╕) рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рд╕реЗ рднрд╛рд╖рд╛ рдкрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд░рдПрдлрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рднрдВрдбрд╛рд░ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА await рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдореИрдВ рд╣рд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╢реИрд▓реА рдореЗрдВ рдПрдХ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реВрдВрдЧрд╛, рддрд╛рдХрд┐ рд╣рдо рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдпреЗ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдб рдХрд┐рддрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореИрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд░рд┐рд╕реАрдорди рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

// A
if await {db.is_trusted_identity(recipient.clone(), message.key.clone())}? {
    info!("recipient: {}", recipient);
}

// B
match await {db.load(message.key)}  {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = await { client
    .get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .send()
}?.error_for_status()?;

// D
let mut res = await {client.get(inbox_url).headers(inbox_headers).send()}?.error_for_status()?;

let mut res: InboxResponse = await {res.json()}?;

// E
let mut res = await { client
    .post(url)
    .multipart(form)
    .headers(headers.clone())
    .send()
}?.error_for_status()?;

let res: Response = await {res.json()}?;

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let (_, mut res) = await {self.request(url, Method::GET, None, true)}?;
    let user = await {res.json::<UserResponse>()}?
        .user
        .into();

    Ok(user)
}

рдпрд╣ await!() рдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИред рддреЛ, рдпрд╣ рд╕реБрдВрджрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ! рдПрдХ рдпрд╛ рджреЛ рд╕рд╛рд▓ рдХреЗ рд▓рд┐рдП await!() рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрдЪрд╛рдирдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреНрдпреЛрдВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдХрд╣реАрдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рд╣реБрд╣ред @ I60R рдХрд╛ expr.[await it.foo()] рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ it рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реИред рдореИрдВ рдХрд┐рд╕реА рднреА рдлреИрдВрд╕реА рдирдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдкрд╕рдВрдж рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реНрдерд╛рди рдХрд╛ рдПрдХ рдЪрддреБрд░ рдЙрдкрдпреЛрдЧ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ IIRC .[ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╣реАрдВ рднреА рд╡реИрдз рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ), рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд╣рд▓ рдХрд░реЗрдЧрд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред

рд╕рд╣рдордд рдереЗ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЖрд░рдПрдлрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордп рдХреЗ рд▓рд┐рдП await рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдмрд╕рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИ, рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рдХрд┐ "рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬреЛ рдЪреЗрди рдХреЗ рд▓рд┐рдП рдЕрдЬреАрдм рд╣реИрдВ" рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдлрд┐рд░ рднреА рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.[await request(url, Method::GET, None, true)]?
        .res.[await json::<UserResponse>()]?
        .user
        .into();

    Ok(user)
}

рдЕрдиреНрдп рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ рдпрд╣ рдХреНрдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ:

* Square brackets makes precedence and scoping much cleaner.

* Syntax is extensible enough to allow temporary bindings removal in other contexts as well.

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд┐рд▓рд┐рдЯреА рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдлрд╛рдпрджрд╛ рд╣реИред рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдПрдХ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдЙрдЪреНрдЪ рдЬрдЯрд┐рд▓рддрд╛ / рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЕрдиреБрдкрд╛рдд рдХреЗ рдХрд╛рд░рдг рд░рд╕реНрдЯ рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИрдВред рд╕рдВрднрд╛рд╡рд┐рдд рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рд╕реВрдЪреА рдиреАрдЪреЗ рджреА рдЧрдИ рд╣реИ:

1. Deferring of all prefix operators (including `await` - it's how it supposed to work):
let result = api.method().[await returns_future()];
let cond = long.method().chain().[!is_empty()];
let val = something.[*returns_ref()];
1. Pipeline operator functionality:
// from https://users.rust-lang.org/t/pipe-results-like-elixir/11175/19
let deserialized: DataType =
    Path::new("path/to/file.json")
        .[File::open(&it)].expect("file not found")
        .[serde_json::from_reader(it)].expect("error while reading json");
1. Overriding function return:
let sorted_vec = iter
    .map(mapper)
    .collect::<Vec<_>>()
    .[sort(),];
1. Wither functionality:
consume(&HashMap::new(). [
    insert("key1", val1),
    insert("key2", val2),
]);
1. Chain splitting:
let sf = surface(). [
    draw_circle(ci_dimens).draw_rectangle(rect_dimens).finish()?,
    draw_something_custom().finish()?,
];
1. Postfix macros:
let x = long().method().[dbg!(it)].chain();

рд╕рдЪрдореБрдЪ рдЕрддреБрд▓рдиреАрдпред

@tajimaha рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо await {} рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ await!() рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ "рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрд╖реНрдардХ" рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ await!() рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБред

рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:
`` `рдЧ #
рдкреНрд░рддреАрдХреНрд╖рд╛ {foo.bar (url, false, qux.clone ())};

with

```c#
await!(foo.bar(url, false, qux.clone()));

(ps рдЖрдк рднрд╛рд╖рд╛ рдХреЛ c # рдкрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП async рдФрд░ await рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)

@nicoburns рдЖрдк () , {} , рдпрд╛ [] рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@sgrif рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ "рдЕрдирд┐рд╡рд╛рд░реНрдп рдбреЗрд▓реНрдЯрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб" рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЛрдИ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

(рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди "рдмрд╕ рдореМрдЬреВрджрд╛ рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рдЫрдбрд╝реА" рд╡рд┐рдХрд▓реНрдк рдореБрдЭ рдкрд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ ...

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ "рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб" рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЛрдИ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рдордЭ рдореЗрдВ рдХреНрдпреЛрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╛рд▓реЗ рдХреАрд╡рд░реНрдб рдХреА рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

@tajimaha

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ "рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдХреАрд╡рд░реНрдб" рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЛрдИ рд▓рд╛рдн рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИред

рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рдордЭ рдореЗрдВ рдХреНрдпреЛрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╛рд▓реЗ рдХреАрд╡рд░реНрдб рдХреА рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ?

рдЕрдЧрд░ await рдПрдХ рдореИрдХреНрд░реЛ рдереЗ, рддреЛ рднрд╛рд╖рд╛ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлрд╛рдпрджрд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рднрд╛рд╖рд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд┐рд╕реА рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реНрдХ рд╣реИ: return , break , continue , рдФрд░ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд╢реЛрдзрди рдирд┐рд░реНрдорд╛рдг рднреА рдХреАрд╡рд░реНрдб рд╣реИрдВред рд▓реЗрдХрд┐рди рдпреЗ рд╕рднреА рдкрд░рд┐рд╕реАрдорди рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрди рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, await рдХреЛ рдмрд┐рдирд╛ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрд░рд┐рд╕реАрдорди рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ:

// Macros using `macro!(foo);` syntax 
format!("{}", foo);
println!("hello world");

// Normal keywords using `keyword foo;`
continue foo;
return foo;

// *and* the await keyword which is kind of in between the other two syntaxes:
await(foo);
await{foo};

рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рднреНрд░рд╛рдордХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЖрдкрдХреЛ 3 рдХреЗ рдмрдЬрд╛рдп 3 рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд░реВрдкреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдХреАрд╡рд░реНрдб-рдХреЗ рд╕рд╛рде рдЕрдирд┐рд╡рд╛рд░реНрдп-рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрдиреЗ рд╕реЗ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрджрд┐ рд╣рдо рд╕реАрдорд╛рдВрдХрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЬреЛ рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢реНрди рдЬреЛ рдЖрдЬ Rust рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ / рд╡рд┐рдзрд┐рдпреЛрдВ рдмрдирд╛рдо рдЪрд░ рдпрд╛ рдХреНрд╖реЗрддреНрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдкреНрд░рд╕рдВрдЧ:

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ C # рдореЗрдВ рдРрд╕реА рдЪреАрдЬреЗрдВ рдХрд░рдирд╛ рдЖрдо рд╣реИ рдЬреЛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рдЙрдмрд╛рд▓рддреА рд╣реИрдВ:

var fooTask = this.FooAsync();
var bar = await this.BarAsync();
var foo = await fooTask;

рдЗрд╕ рддрд░рд╣ рджреЛрдиреЛрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдЪрд▓рддреЗ рд╣реИрдВред (рдХреБрдЫ рд▓реЛрдЧ рдХрд╣реЗрдВрдЧреЗ рдХрд┐ Task.WhenAll рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдкреВрд░реНрдг рдЕрдВрддрд░ рдЫреЛрдЯрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреЛрдб рдХреЛ рдЧрдбрд╝рдмрдбрд╝ рдХрд░ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред)

рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реА рд╕рдордЭ рд╣реИ рдХрд┐, рд░рд╕реНрдЯ рдореЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ poll fooTask рддрдм рддрдХ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ bar рдЗрд╕рдХреА рдХреАрдордд рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддреА, рдФрд░ рдпрд╣ _needs_, рдПрдХ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж

let (foo, bar) = when_all!(
    self.foo_async(),
    self.bar_async(),
).await;

рдЗрд╕рд▓рд┐рдП рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЛ рдПрдХ рдЪрд░ рдпрд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдорд╛рдкреНрдд рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХреЙрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдпрд╣ рдмрд╛рдж рдХрд╛ рд╣реИ, рддреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░рд╛рд░реВрдкрдг рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдордиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рд╣реИ: рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб _no-space_ред

рдореИрдВрдиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреЛрдИ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛

client.get("https://my_api").send()await?.json()await?

(рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛ рд╣реИ, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд░рд╕рд░рд╛рд╣рдЯ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб _was_ рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдВрддрд░рд┐рдХреНрд╖ рджреГрд╢реНрдп рджреГрд╢реНрдп рдХреЛ рддреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред)

рдЕрдЧрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП .await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ
рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐, рдирд╣реАрдВ?

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢реНрди рдЬреЛ рдЖрдЬ Rust рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдЖрдк рдХрд┐рддрдиреА рдмрд╛рд░ рдХрд╛рд░реНрдпреЛрдВ / рд╡рд┐рдзрд┐рдпреЛрдВ рдмрдирд╛рдо рдЪрд░ рдпрд╛ рдХреНрд╖реЗрддреНрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реА рд╕рдордЭ рд╣реИ рдХрд┐, рд░рд╕реНрдЯ рдореЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ [...]

рд╕рд╣реА рдмрд╛рддред рдкрд╣рд▓реЗ рдХреЗ рд╕рдорд╛рди рдХреЛрдб-рдмреЗрд╕ рд╕реЗ, рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

let self__ = self_.clone();
let responses: Vec<Response> = {
    let futures = all_ids.into_iter().map(move |id| {
        self__.request(URL, Method::GET, vec![("info".into(), id.into())])
            .and_then(|mut response| response.json().from_err())
    });

    await!(futures_unordered(futures).collect())?
};

рдЕрдЧрд░ рдореИрдВ async рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдХреНрд▓реЛрдЬрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:

let self__ = self_.clone();
let responses: Vec<Response> = {
    let futures = all_ids.into_iter().map(async move |id| {
        let mut res =
            await!(self__.request(URL, Method::GET, vec![("info".into(), id.into())]))?;

        Ok(await!(res.json())?)
    });

    await!(futures_unordered(futures).collect())?
};

рдЕрдЧрд░ рдореБрдЭреЗ .await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдерд╛ (рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рдЪреЗрди рдХрд░рдирд╛):

let self__ = self_.clone();
let responses: Vec<Response> =
    futures_unordered(all_ids.into_iter().map(async move |id| {
        Ok(self__
            .request(URL, Method::GET, vec![("info".into(), id.into())]).await?
            .json().await?)
    }))
    .collect().await?;

рдХреНрдпрд╛ рдХреЛрдИ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рднрд╛рд░реА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ? рдореИрдВ рд╣рд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╢реИрд▓реА рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ

@gralpli рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ, рдореИрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЛрд▓ рд╕рдХрддрд╛ рд╕реНрд░реЛрдд рднрд╛рд░реА await! рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рдордп (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг) рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдб рдХреЛрдб рджреЗрддрд╛ рд╣реИред

let self__ = self_.clone();
let responses: Vec<Response> =
    futures_unordered(all_ids.into_iter().map(async move |id| {
        Ok(self__
            .request(URL, Method::GET, vec![("info".into(), id.into())]).await?
            .json().await?)
    }))
    .collect().await?;

рдпреЗ рд▓рд╛рдЗрдиреЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рджрд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВ рдХреИрд╕реЗ рдХреЛрдб рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ overusing рдФрд░ рдЪреЗрдирд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдореЗрдВ рдЧрдбрд╝рдмрдбрд╝ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг:

let func = async move |id| {
    let req = await { self.request(URL, Method::GET, vec![("info".into(), id.into())]) }?;
    Ok(await(req.json())?)
}
let responses: Vec<Response> = await {
    futures_unordered(all_ids.into_iter().map(func)).collect()
}?;

рджреЛ рд╕рдВрд╕реНрдХрд░рдг рджреЛрдиреЛрдВ 7 рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди IMO рджреВрд╕рд░рд╛ рдХреНрд▓реАрдирд░ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ takeaways рднреА рд╣реИрдВ:

  1. await { future }? рд╢реЛрд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдЕрдЧрд░ future рд╣рд┐рд╕реНрд╕рд╛ рд▓рдВрдмрд╛ рд╣реЛред let req = await { self.request(URL, Method::GET, vec![("info".into(), id.into())]) }?;
  2. рдЬрдм рд▓рд╛рдЗрди рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИ, рддреЛ await(future) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред Ok(await(req.json())?)

IMO, рджреЛ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдХреЗ, рдЗрд╕ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рд╣реИред

рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдмреБрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рд░реВрдкрд┐рдд рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЬрдВрдЧреА рдкреНрд░рд╛рд░реВрдк рдХреА рддрд░рд╣ рд╣реИ
рдЙрд╕ред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕ рдкрд░ рд╕рд░рд╕рд░рд╛рд╣рдЯ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдпрд╣рд╛рдБ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@ivandardi @mehcode рдХреНрдпрд╛ рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВ .await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреИрд╕реЗ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдЕрднреА рдХреЛрдб рдХреЙрдкреА рдХрд┐рдпрд╛ рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

  1. рдЙрддреНрдкрд╛рджрди рдХреЛрдб рд╕рд┐рд░реНрдл рдЕрдЪреНрдЫрд╛ рдФрд░ рд╕рд░рд▓ рдЪреЗрди рдирд╣реАрдВ рд╣реЛрдЧрд╛:
client.get("https://my_api").send().await?.json().await?
  1. рд▓реЛрдЧ рдЪреИрдирд┐рдВрдЧ рдХрд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдпрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
let responses: Vec<Response> =
    futures_unordered(all_ids.into_iter().map(async move |id| {
        Ok(self__
            .request(URL, Method::GET, vec![("info".into(), id.into())]).await?
            .json().await?)
    }))
    .collect().await?;

рдпрд╣рд╛рдБ, Async рдХреНрд▓реЛрдЬрд░ рд╣рд░ ID рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг futures_unordered ред рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рд╕реЗ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЖрдкрдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ рдХрд╛рдлреА рдХрдореА рдЖрддреА рд╣реИред

рд╕рдм рдХреБрдЫ _was_ рдореЗрд░реА рдкреЛрд╕реНрдЯ рд╕реЗ rustfmt рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ (рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд╛рдореВрд▓реА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде)ред рдЬрд╣рд╛рдВ .await? рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрднреА рддрдХ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред


рдЕрдм рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рд╕рдм рдмрд╣реБрдд рднрдпрд╛рдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдПрдХ рд╕рдордп рд╕реАрдорд╛ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЬрдм рдЖрдк рдХреБрдЫ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд╛рдирд╛ рдкрдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдорд░рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рд╕рд╛рдорд╛рди рднрдпрд╛рдирдХ рджрд┐рдЦрдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВ рдЖрдкрдХреЛ (рдЖрдкрдХреА рдмрд╛рдд рд╕реЗ) рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдмреБрд░рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ):

let responses: Vec<Response> = await!(futures_unordered(all_ids.into_iter().map(async move |id| {
    Ok(await!(await!(self__
        .request(URL, Method::GET, vec![("info".into(), id.into())]))?
        .json())?)
}))
.collect())?;

рдЕрдм рдЪрд▓реЛ рдордЬрд╝реЗ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рдпрд╕ v0.3 рдореЗрдВ hindight рдФрд░ рдХреБрдЫ рдирдП рдПрдбреЗрдкреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ

"рд╕реНрдкрд╖реНрдЯ" рд╡рд░реАрдпрддрд╛ (рдФрд░ рдЪреАрдиреА) рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ
let responses: Vec<Response> = await? stream::iter(all_ids)
    .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
    .and_then(|mut res| res.json().err_into())
    .try_buffer_unordered(10)
    .try_collect();
"рдЙрдкрдпреЛрдЧреА" рд╡рд░реАрдпрддрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ
let responses: Vec<Response> = await stream::iter(all_ids)
    .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
    .and_then(|mut res| res.json().err_into())
    .try_buffer_unordered(10)
    .try_collect()?;
рдЕрдирд┐рд╡рд╛рд░реНрдп рджреЗрд░реА рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ
let responses: Vec<Response> = await {
    stream::iter(all_ids)
        .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
        .and_then(|mut res| res.json().err_into())
        .try_buffer_unordered(10)
        .try_collect()
}?;
рдЙрдкрд╕рд░реНрдЧ рдХреНрд╖реЗрддреНрд░
let responses: Vec<Response> = stream::iter(all_ids)
    .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
    .and_then(|mut res| res.json().err_into())
    .try_buffer_unordered(10)
    .try_collect().await?;
рдЙрдкрд╕рд░реНрдЧ рдХреБрдВрдЬреАрд╢рдмреНрдж
let responses: Vec<Response> = stream::iter(all_ids)
    .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
    .and_then(|mut res| res.json().err_into())
    .try_buffer_unordered(10)
    .try_collect() await?;

рдорд╛рдЗрдирд░ рдирд╛рдЗрдЯ рдпрд╣рд╛рдБред рдХреЛрдИ TryStreamExt::and_then , рд╢рд╛рдпрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдордп рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди рдкреАрдЖрд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рдпреЛрдЧрджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред


  • рдореИрдВ рдлрд┐рд░ рд╕реЗ, await? рд▓рд┐рдП рдЕрдкрдиреА рдордЬрдмреВрдд рдирд╛рдкрд╕рдВрдж рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдореЗрдВ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ ? рдХрд╛ рдЯреНрд░реИрдХ рдЦреЛ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред fallible рдФрд░ may_exit the function_ред

  • рдореИрдВ рдЖрдЧреЗ await .... ? ( fn foo() -> Result<impl Future<Output = Result<_>>> рд╣реЛ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

    // Is this an error? Does`await .. ?` bind outer-most to inner?
    await foo()??
    

рдореИрдВ рдЖрдкрдХреЛ (рдЖрдкрдХреА рдмрд╛рдд рд╕реЗ) рд╕рдВрдХреЗрдд рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдмреБрд░рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ):

let responses: Vec<Response> = await!(futures_unordered(all_ids.into_iter().map(async move |id| {
    Ok(await!(await!(self__
        .request(URL, Method::GET, vec![("info".into(), id.into())]))?
        .json())?)
}))
.collect())?;

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдЬрдЧрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬрдЧрд░ рдореЗрдВ await (await f) рд╣реИред

рдЕрдирд┐рд╡рд╛рд░реНрдп рджреЗрд░реА рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ

let responses: Vec<Response> = await {
    stream::iter(all_ids)
        .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
        .and_then(|mut res| res.json().err_into())
        .try_buffer_unordered(10)
        .try_collect()
}?;

рдпрд╣ рднреА рд╡рд╛рдкрд╕ combinators рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрддрд╛ рд╣реИред рдЬрдмрдХрд┐ async / await рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреБрдХреНрдд рд╣реЛред

рдЦреИрд░, рдпрд╣ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╣реЛрдиреЗ рдХреЗ рдкреВрд░реЗ рдмрд┐рдВрджреБ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИред рдЪреВрдБрдХрд┐ рдпрд╣ Rust рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЛрдЧ рдЗрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ Rust рдЪреИрдирд┐рдВрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ рддрд╛рдХрд┐ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкреНрд░рд╡рд╛рд╣ рд▓рд╛рдЗрди-рд░реАрдбрд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрд╕реНрдерд╛рдпреА рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реЛрдВрдЧреЗ рдЬреЛ рдХрд┐ рдЬрдВрдЬреАрд░ рднреА рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рдереА рдЬреЛ рд╕рднреА рдПрдХ рд╣реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИред

Async / рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд Rust RFC рд╕реЗ @ivandardi @mehcode рдХреЙрдкреА рдХрд░рдирд╛:

рд╡рд╛рдпрджрд╛ рдЖрдзрд╛рд░рд┐рдд рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╡ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдХреБрдЫ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдХреА рдЦреЛрдЬ рдХреАред рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдмреЗрд╣рдж рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдерд╛ - рдЬрд┐рд╕рдореЗрдВ рдпрд╛ рддреЛ рдЖрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрд╛ рдкреАрдЫрд╛ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реИ - рдФрд░ рдЬрдмрдХрд┐ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдЕрдХреНрд╕рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рднрд╡рд┐рд╖реНрдп рд▓рд┐рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╣реЛрддреЗ рдереЗ, рдлрд┐рд░ рднреА рд╡реЗ рдЕрдХреНрд╕рд░ рдиреЗрд╕реНрдЯреЗрдб рдФрд░ рдЬрдВрдЬреАрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЧрдиреНрджреЗ рд╕реЗрдЯреЛрдВ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддреЗ рдереЗред

... рдПрдХ рд╕рд┐рдВрдереИрдЯрд┐рдХ рдЪреАрдиреА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдХрд┐ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ async IO рдХреЗ рд╕рд╛рде рдЖрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ - async рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдбред

рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╡реЗ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдерд╛, рдФрд░ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдХреЙрд▓ рдХреЛ рдПрдиреЛрдЯреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, async рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдиреЗ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ, рд╢реНрд░реГрдВрдЦрд▓рди рдХреЛ рдХрдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░

рдЪреЗрдВрдЬрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗрдирд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдХреЛ рд╕рдВрднрд╡рддрдГ рдЗрд╕ RFC рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

@tajimaha рдЖрдкрдиреЗ RFC рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ ( map , and_then , рдЖрджрд┐), рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬрдВрдЬреАрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рддрд░реАрдХреЗ рдЬреЛ impl Future )ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ рдХрд┐ async рд╡рд┐рдзрд┐рдпрд╛рдВ рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдВрдЧреА, рдЗрд╕рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪреЗрдирд┐рдВрдЧ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрд▓рдд рд╕рдордЭрддреЗ рд╣реИрдВ: RFC рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред RFC рдПрдХ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рднреА RFC рдкрддреНрдерд░ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ (рди рд╣реА рдЙрдиреНрд╣реЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!)

RFC рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддрд░рд▓ рд╣реИ, рдпрд╣ рд▓рдЧрднрдЧ рдЙрддрдирд╛ рдХрдареЛрд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдЖрдк рдЖрд╕рдиреНрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред RFC рдореЗрдВ рдХреБрдЫ рднреА рд╣рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИред

рд╕рд╛рде рд╣реА, рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реНрдерд┐рд░реАрдХрд░рдг RFC рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛, рди рдХрд┐ рдореВрд▓ RFC (рдЬреЛ рдкрд╣рд▓реЗ рд╣реА рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред

рдЪреЗрдВрдЬрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджреЗрдирд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдХреЛ рд╕рдВрднрд╡рддрдГ рдЗрд╕ RFC рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдореИрдВ рдпрд╣рд╛рдВ рдордЬрд╛рдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

RFC рд▓рд┐рдЦрддреЗ рд╕рдордп рдПрдХ рдмрд╛рдд рд╢рд╛рдпрдж рд╕рдЪ рд╣реИред рд▓реЛрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ рдЙрдкрдХрд░рдг рдЪрд╛рд╣рддреЗ рдереЗ "рдЬреЛ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдерд╛"ред рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рдж рдХреА рдкрд░рдВрдкрд░рд╛ рдЗрд╕ рд╡рд╛рджреЗ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧреАред
рдФрд░ рдпрд╣рд╛рдБ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдирд╣реАрдВ рд╣реИрдВ,

let responses: Vec<Response> =
    futures_unordered(all_ids.into_iter().map(async move |id| {
        Ok(self__
            .request(URL, Method::GET, vec![("info".into(), id.into())]).await?
            .json().await?)
    }))
    .collect().await?;

рдлрд┐рд░ рднреА, "рд╡реЗ рдЕрдм рднреА рдЕрдХреНрд╕рд░ рдиреЗрд╕реНрдЯреЗрдб рдФрд░ рдЬрдВрдЬреАрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЧрдВрджреЗ рд╕реЗрдЯреЛрдВ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддреЗ рдереЗред"

рд▓реЛрдЧ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ рдЙрдкрдХрд░рдг рдЪрд╛рд╣рддреЗ рдереЗ "рдЬреЛ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдерд╛"ред рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рдж рдХреА рдкрд░рдВрдкрд░рд╛ рдЗрд╕ рд╡рд╛рджреЗ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧреАред

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рдЪ рд╣реИ: рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рджреЛрдиреЛрдВ await рдЙрд╕ рдЗрдЪреНрдЫрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рд╢рд╛рдпрдж рдЙрд╕ рдЗрдЪреНрдЫрд╛ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдкреВрд░рд╛ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ (рдЬреЛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЬрдВрдЧ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рдЖрдо рд╣реИ!)

рдЙрдкрд╕рд░реНрдЧ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдХреНрд╕рд░ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдЬрдВрдЧ рд╢реИрд▓реА рдирд╣реАрдВ рд╣реИред

рдлрд┐рд░ рднреА, "рд╡реЗ рдЕрдм рднреА рдЕрдХреНрд╕рд░ рдиреЗрд╕реНрдЯреЗрдб рдФрд░ рдЬрдВрдЬреАрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЧрдВрджреЗ рд╕реЗрдЯреЛрдВ рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддреЗ рдереЗред"

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдВрдж рджреЗрдЦрддрд╛ рд╣реВрдВ, рдФрд░ рдпрд╣ рдХреЙрд▓рдмреИрдХ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл map рдХреЛ Iterator (рдлреНрдпреВрдЪрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХреБрдЫ рдирд╣реАрдВ) рдкрд░ рдХреЙрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ!

рдХреГрдкрдпрд╛ await рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдФрдЪрд┐рддреНрдп рд╕рд┐рджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП RFC рдХреЗ рд╢рдмреНрджреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдореБрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВред

RFC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдкрд╕рд░реНрдЧ await рдХреЛ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣реА рдЕрдЬреАрдм рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ RFC рд╕реНрд╡рдпрдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрдВрддрд┐рдо рдирд╣реАрдВ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЙрд╕ рдирд┐рд░реНрдгрдп рдХрд╛ рд╕рдордп рдЕрдм тАЛтАЛрд╣реИред

рдирд┐рд░реНрдгрдп рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдореВрд▓ RFC рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ (рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рдВрджрд░реНрдн рд╕рдВрджрд░реНрдн рдХреЛ рдЫреЛрдбрд╝рдХрд░)ред

рдзреНрдпрд╛рди рджреЗрдВ, @ mehcode рдХрд╛ рдирд╡реАрдирддрдо рдЙрджрд╛рд╣рд░рдг рдЬреНрдпрд╛рджрд╛рддрд░ _stream_ combinators рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдФрд░ рдПрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдПрдХ async рдмреНрд▓реЙрдХ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдореЗрдВ рдЗрдЯрд░реЗрдЯрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╡реЗ рдЫреЛрд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред

рдпрд╣ рдЕрдкрдорд╛рдирдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд╛рддрдЪреАрдд рдПрдХ рджрд░реНрдЬрди рдпрд╛ рддреЛ рдЯрд┐рдкреНрдкрдгреАрдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред 383 рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдЬрд┐рд╕ рд╕рдордп рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦрдВрдЧрд╛рд▓рд╛, рдЙрд╕ рд╕рдордп рдХреЗрд╡рд▓ 88 рдЕрджреНрд╡рд┐рддреАрдп рдкреЛрд╕реНрдЯрд░ рдереЗред рдЬреЛ рд▓реЛрдЧ рдЗрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрди рдкрд░ рдмреЛрдЭ рдбрд╛рд▓рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдпрдерд╛рд╕рдВрднрд╡ рдпрдерд╛рд╕рдВрднрд╡ рд░рд╣рдиреЗ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдкрд┐рдЫрд▓реЗ рдмрд┐рдВрджреБ рдХрд╛ рдкреБрдирд░реНрдорд┐рд▓рди рдирд╣реАрдВ рд╣реИред


рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо

HeroicKatora:(32)********************************
Centril:(22)**********************
ivandardi:(21)*********************
I60R:(21)*********************
Pzixel:(16)****************
novacrazy:(15)***************
scottmcm:(13)*************
EyeOfPython:(11)***********
mehcode:(11)***********
Pauan:(10)**********
XX:(9)*********
nicoburns:(9)*********
tajimaha:(9)*********
skade:(8)********
CAD97:(8)********
Laaas:(8)********
dpc:(8)********
ejmahler:(7)*******
Nemo157:(7)*******
yazaddaruvala:(6)******
traviscross:(6)******
CryZe:(6)******
Matthias247:(5)*****
dowchris97:(5)*****
rolandsteiner:(5)*****
earthengine:(5)*****
H2CO3:(5)*****
eugene2k:(5)*****
jplatte:(4)****
lnicola:(4)****
andreytkachenko:(4)****
cenwangumass:(4)****
richardanaya:(4)****
chpio:(3)***
joshtriplett:(3)***
phaylon:(3)***
phaazon:(3)***
ben0x539:(2)**
newpavlov:(2)**
comex:(2)**
DDOtten:(2)**
withoutboats:(2)**
valff:(2)**
darkwater:(2)**
tanriol:(1)*
liigo:(1)*
yasammez:(1)*
mitsuhiko:(1)*
mokeyish:(1)*
unraised:(1)*
mzji:(1)*
swfsql:(1)*
spacekookie:(1)*
sgrif:(1)*
nikonthethird:(1)*
edwin-durai:(1)*
norcalli:(1)*
quodlibetor:(1)*
chescock:(1)*
BenoitZugmeyer:(1)*
F001:(1)*
FuGangqiang:(1)*
Keruspe:(1)*
LegNeato:(1)*
MSleepyPanda:(1)*
SamuelMoriarty:(1)*
Swoorup:(1)*
Uristqwerty:(1)*
alexmaco:(1)*
arabidopsis:(1)*
arielb1:(1)*
axelf4:(1)*
casey:(1)*
lholden:(1)*
cramertj:(1)*
crlf0710:(1)*
davidtwco:(1)*
dyxushuai:(1)*
eaglgenes101:(1)*
AaronFriel:(1)*
gralpli:(1)*
huxi:(1)*
ian-p-cooke:(1)*
jonimake:(1)*
josalhor:(1)*
jsdw:(1)*
kjetilkjeka:(1)*
kvinwang:(1)*

рдзреНрдпрд╛рди рджреЗрдВ, @ mehcode рдХрд╛ рдирд╡реАрдирддрдо рдЙрджрд╛рд╣рд░рдг рдЬреНрдпрд╛рджрд╛рддрд░ _stream_ combinators рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдФрд░ рдПрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдПрдХ async рдмреНрд▓реЙрдХ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдореЗрдВ рдЗрдЯрд░реЗрдЯрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╡реЗ рдЫреЛрд░реЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рднреА рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрдкрд╕рд░реНрдЧ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдБ рд╡реЗ рдЬрдВрдЬреАрд░ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред

@Pauan рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рд╢рдмреНрджреЛрдВ рдХреЛ рдШреБрдорд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реВрдБ, рдЬреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдорд░реНрдердХ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЧрдИ рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЙрдкрд╕рд░реНрдЧ рд╢реИрд▓реА рдХреЛрдб рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЖрдкрдХреЗ рдЗрд░рд╛рджреЗ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдХрд░реНрдордЪрд╛рд░реА рд╣реЛрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рдорд░реНрдердХреЛрдВ рдХреЛ рд╢рд┐рдХрд╛рдпрдд рд╣реЛрддреА рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ)ред рдпрд╣ рднреА рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдПрдХ рд▓рд╛рдЗрдирд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИрдВ, рдореИрдВ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдХреИрд╕реЗ рдбрд┐рдмрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? (рдпрд╣ рдПрдХ рд╕рдЪреНрдЪрд╛ рд╕рд╡рд╛рд▓ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛)ред
рджреВрд╕рд░рд╛, рдЬрдВрдЧ рд╕рдореБрджрд╛рдп рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╡рд┐рд╡рд┐рдз рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓реЛрдЧ (рдЬреИрд╕реЗ рдХрд┐ рдореИрдВ, рдореИрдВ рдЕрдЬрдЧрд░ / рд╕реА / рдЬрд╛рд╡рд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рд╕рднреА рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдХрд┐ рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╕рдордп, рдпрд╣ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рдЧреЛрдж рд▓реЗрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@tajimaha рдкреЛрд╕реНрдЯ-рдлрд┐рдХреНрд╕ рд╕реЗ рдЙрдкрд╕рд░реНрдЧ рддрдХ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреБрдЫ рдиреЗрд╕реНрдЯреЗрдб рддрд░реНрдХреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд╛рдиреАрдп рдмрдВрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реА рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рд╡реЗ рдХрд╛рдлреА рдУрд░реНрдереЛрдЧреЛрдирд▓ рд╣реИрдВред рдЖрдк рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдФрд░ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реИред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╢рд╛рдпрдж рдХреБрдЫ рдХреЛрдб рдЖрдзрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рджреБрд░реБрдкрдпреЛрдЧ рдХреИрд╕реЗ рдЕрдиреЛрдЦрд╛ рд╣реИ рдпрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рддрд░реАрдХреЗ рд╕реЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИред

let get_one_id = async move |id| {
    self.request(URL, Method::GET, vec![("info".into(), id.into())])
        .await?
        .json().await
};

let responses: Vec<Response> = futures_unordered(all_ids.into_iter().map(get_one_id))
    .collect().await?;

рд▓реЗрдХрд┐рди, рдкрд░рд┐рдгрд╛рдо рдореЗрдВ let -рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдФрд░ Ok рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ ? рдХреЛ рдПрдХ рд╕рд╛рде рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдХреЛрдб рдмреНрд▓реЙрдХ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрд╡рд╛рдж рдкрд░ред рдПрдХ рд╣реА рдХрдерди рдореЗрдВ рджреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдмрддрд╛рдП рдЧрдП рднрд╛рд╡ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ рдпреВрдирд┐рдбрд╛рдпрдореИрдЯрд┐рдХ рд╣реИред рд╡реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдмрд╛рд░-рдмрд╛рд░ рдФрд░ рдЖрдо рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ред рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдФрд░ рдЕрдзрд┐рдХ рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ 2 ? рдЙрд╕ рдХреЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ idiomatic рднрд╛рд╖рд╛ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдзреНрдпрд╛рди рд░рдЦреВрдВрдЧрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдПрдХ рдЙрдкрд╕рд░реНрдЧ await рдХреАрд╡рд░реНрдб рдкреВрд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдкрд╣рд▓реЗ рдЙрдард╛рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓реЗрддреЗ рд╣реБрдП:

let result = await client.get("url").send()?.json()?

рдЬрд╣рд╛рдБ get , send , рдФрд░ json async рд╣реИрдВред

рдореЗрд░реЗ рд▓рд┐рдП (рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ async рдЕрдиреБрднрд╡ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж) рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ expr await рдкреНрд░рд╛рдХреГрддрд┐рдХ рджрд┐рдЦрддреА рд╣реИ: "рдРрд╕рд╛ рдХрд░реЛ, _then_ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред"

рдХреБрдЫ рдЪрд┐рдВрддрд╛рдПрдБ рдереАрдВ рдЬреЛ рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдЕрдЬреАрдм рд▓рдЧрддреА рд╣реИрдВ:

client.get("https://my_api").send() await?.json() await? // or
client.get("https://my_api").send()await?.json()await?

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореЗрд░рд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

client.get("https://my_api").send() await?
    .json() await?

рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн рд╣реИ рдХрд┐ await рдХреЛ рд╕реНрдкреЙрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЕрдЧрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рд▓рд╛рдЗрди рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред

рдПрдХ рдЖрдИрдбреАрдИ рдореЗрдВ, рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ "рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐" рдХрд╛ рдЕрднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ: рдЬрдм рдЖрдк рдбреЙрдЯ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддрдм рдиреЛрдЯрд┐рд╕ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ await , рддреЛ рдЖрдкрдХреЛ рдмрд╕ рдбреЙрдЯ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ " await " рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдпрд╛рдиреА, рдЕрдЧрд░ IDE рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдГ рдкреВрд░реНрдг рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рдбреЙрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ expr.await рднреНрд░рдорд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдХреАрд╡рд░реНрдб рдбреЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЬрдВрдЬреАрд░ рд╣реИ, рдЬреЛ рдХрднреА-рдХрднреА рдмрд╣реБрдд рд╕реБрдВрджрд░ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╣рдореЗрдВ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдЪрд░рдо рдкрд░ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдЪрд╛рдЗрдирд┐рдВрдЧ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ C рдпрд╛ рдкрд╛рдпрдерди рд╕реНрдЯрд╛рдЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдХрд░рдг рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкрд╛рдЗрдерди рдХреЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ рдХреЛрдИ рдЪреИрдирд┐рдВрдЧ рдШрдЯрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХреЛрдб рдХреЛ рдЕрдХреНрд╕рд░ рдкрдардиреАрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╛рдпрдерди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рднреА рд╢рд┐рдХрд╛рдпрдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рд╣реИрдВред

рдХреИрд╕реЗ рдПрдХ рдЙрдкрд╕рд░реНрдЧ then ?

рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдмрддрд╛рдП рдЧрдП рднрд╛рд╡ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ рдпреВрдирд┐рдбрд╛рдпрдореИрдЯрд┐рдХ рд╣реИред рд╡реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдмрд╣реБрдд рдмрд╛рд░-рдмрд╛рд░ рдФрд░ рдЖрдо рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ред рдореИрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдФрд░ рдЕрдзрд┐рдХ рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ 2 ? рдЙрд╕ рдХреЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрдпрд╛ idiomatic рднрд╛рд╖рд╛ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдзреНрдпрд╛рди рд░рдЦреВрдВрдЧрд╛ред

рдЗрд╕рдиреЗ рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рд░рд╕реНрдЯ рдХреЛрдб рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рдПрдХ рд▓рд╛рдЗрди рдореЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ ? (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдорд▓реНрдЯреАрд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред рдореИрдВрдиреЗ xi-editor, alacritty, ripgrep, bat, xray, fd, firecracker, yew, Rocket, exa, iron, parity-ethereum, tikv рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдпреЗ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рд┐рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд░рд╕реНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 585562 рдХреА рдХреБрд▓ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 40 рд▓рд╛рдЗрдиреЗрдВ ? рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рд╡рд╣ 0.006% рд╣реИ ред

рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдирдП рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреМрдХрд░реА рджреА рдЧрдИ рд╣реИ рдпрд╛ рдЖрдк рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдирдП рд╣реИрдВред рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рд▓рд┐рдЦреЗрдВрдЧреЗ

client.get("https://my_api").send().await?.json().await?

рд╕рд┐рд░реНрдл рдПрдХ рд╢реЙрдЯ рдореЗрдВ ? рдпрджрд┐ рдЖрдк рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдирдП рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдЖрдк рдЕрдиреБрд░реЛрдз рдХрд╛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ, рд╡рд╛рдкрд╕реА рдХреА рд╕реНрдерд┐рддрд┐ рджреЗрдЦреЗрдВ, рдпрд╣ рдПрдкреАрдЖрдИ рдХреНрдпрд╛ рд╣реИ рдпрд╛ рдмрд╕ рдЗрд╕ рддрд░рд╣ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рдзрд╛рд░рдгрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ:

let request = client.get("https://my_api").header("k", "v");
dbg!(request);
let response = await(request.send())?;
dbg!(response);
let data = await(response.json())?;
dbg!(data);

рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдПрдкреАрдЖрдИ рдореЗрдореЛрд░реА рдбреЗрдЯрд╛ рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реИред рдпрд╣ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИред рдФрд░, рдЬрдм рдЖрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЪрд┐рдВрддрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рди рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ ред рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ:

let request = client.get("https://my_api").header("k", "v");
dbg!(request);
let response = request.send().await?;
dbg!(response);
let data = response.json().await?;
dbg!(data);

рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдпрд╣ рд╣реИ:

let request = client.get("https://my_api").header("k", "v");
dbg!(request);
let response = await(request.send())?;
dbg!(response);
let data = await(response.json())?;
dbg!(data);

рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реИ рдФрд░ рдЖрдкрдХрд╛ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЪреЗрдирд┐рдВрдЧ рднреА рдирд╣реАрдВ рдирд┐рдХрд▓рддреА рд╣реИред

рдореБрдЭреЗ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 585562 рдХреА рдХреБрд▓ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 40 рд▓рд╛рдЗрдиреЗрдВ рдХреЗрд╡рд▓ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ? рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВред

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╣рд╛рдпрдХ рдорд╛рдк рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрдЯрд░ _per рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐_ред рдареЗрда (рд░рд╕реНрдЯрдлрдПрдордЯреА) рд╢реИрд▓реА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡реЗ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рд░рд╛рд╢рд┐ рдореЗрдВ рдЬрдВрдЬреАрд░ рд╣реЛрдЧреА рдЬреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ (рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ) await рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред

рд╣рдореЗрдВ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдЪрд░рдо рдкрд░ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдм рдХреБрдЫ рдЬрдВрдЬреАрд░ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ _should_ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдореИрдВрдиреЗ рдЕрдм рддрдХ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП _ergonomic_ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдХреЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред

585562 рдХреБрд▓ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 40 рд▓рд╛рдЗрдиреЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ? рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рдмрдирд╛рдо рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ C # рдХреЗ _none_ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ await , рди рд╣реА рдХрдИ await s рдПрдХ рдХрдерди рдореЗрдВред рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд▓реЗрдЖрдЙрдЯ рдХреЗ рдиреЗ рдПрдХ рд▓рд╛рдЗрди рдкрд░ рдХрдИ await s рдирд╣реАрдВ рдбрд╛рд▓реЗред

рдПрдХ рдмреЗрд╣рддрд░ рддреБрд▓рдирд╛ рд╕рдВрдХрд▓рдХ рд╕реЗ рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддрд░рд╣ ? рдЬрдВрдЬреАрд░реЛрдВ рд╕реЗ рд╣реЛ рд╕рдХрддреА рд╣реИ:

Ok(&self.get_bytes(cx, ptr, size_with_null)?[..size])
self.try_to_scalar()?.to_ptr().ok()
let idx = decoder.read_u32()? as usize;
.extend(self.at(cause, param_env).eq(v1, v2)?.into_obligations());
for line in BufReader::new(File::open(path)?).lines() {

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░ рд╣рд░рд╛рдпрд╛, @ CAD97 :

рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ then s рдХреЗ рд╕рд╛рде javascipt рдХреЗ рд╡рд╛рджреЗ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИред рдореИрдВ рдЗрд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ред рдпрд╣ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдПрдХ await рдФрд░ рд╕рдордХрд╛рд▓рд┐рдХ рд╣реЛрдиреЗ рдХрд╛ рдирд╛рдЯрдХ рдХрд░реЗрдВред

рдЕрдирд┐рд╡рд╛рд░реНрдп рджреЗрд░реА рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ

let responses: Vec<Response> = await {
    stream::iter(all_ids)
        .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
        .and_then(|mut res| res.json().err_into())
        .try_buffer_unordered(10)
        .try_collect()
}?;

@ CAD97 @scottmcm рдЕрдЪреНрдЫрд╛ рдмрд┐рдВрджреБред рдореБрдЭреЗ рдкрддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдЬреЛ рдорд╛рдк рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рд╣реИ:

(рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдмрд╣реБ-рдЙрдкрдпреЛрдЧ рдХрд╛ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ)

рдореИрдВ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ @skade рдиреЗ await рдФрд░ ? рдмреАрдЪ рд╕рдорд╛рдирддрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рддреНрд╡рд░рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ред рдореИрдВ рдПрдХ рдЧрдВрднреАрд░ рд╢реЛрдз рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдорд╣реАрди-рдмрд╛рд░реАрдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рд╣реИ рдирд╛? рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХреЛрдИ рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдХрд╣рд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЬрдВрдЬреАрд░ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? рдореИрдВрдиреЗ рдЕрдм рддрдХ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╡рд╣реА рд╕рдордХрд╛рд▓рд┐рдХ рдХреЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рдЬреЛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдпрджрд┐ рдХреЗрд╡рд▓ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реАрдо / рдкрд╛рдпрдерди рд╢реИрд▓реА рдЕрдЪреНрдЫреА рд▓рдЧрдиреЗ рд╡рд╛рд▓реА (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдиреБрдХрд░рдгреАрдп) рд╣реЛрдиреЗ рдкрд░ рдЕрдирд┐рд░реНрдгрд╛рдпрдХ рд╣реЛрдЧреАред рдЬрдм рдЖрдк рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рджрд┐рд╢рд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЪреИрдирд┐рдВрдЧ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ, рдФрд░ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХреИрд╕реЗ рдХрд░реЗрдВред

рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рднреА рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡реЗрд░рд┐рдПрдВрдЯ рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ, рдФрд░ рд╕рдВрд╕рд╛рдзрди рдПрдХреАрдХрд░рдг рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ 400 рдореЗрдВ 5 рд╕реЗ рдХрдо рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЙрди рдЕрдВрддрд░реЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрди рдЕрдВрддрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рд╡рд░реНрддрдорд╛рди рд░рд╛рдд рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрдХрдбрд╝реЛ, рдФрд░ async рдХреЛрдб рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ 20 рдкрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдХреЛрдб рд╕рдВрдХрд▓рди рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдПрдХ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ (рдЧреИрд░-рджрд╣рдирд╢реАрд▓) async / рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдЬ рд╢реБрджреНрдз рд░реВрдк рд╕реЗ / рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдореМрдЬреВрдж рд╣реИ, рдХреНрдпрд╛ рд╕рдВрджрд░реНрдн рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдХреНрд╕рд░ рд╡рд╛рдпрджрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреБрдЫ рдЕрдЬреАрдмреЛрдЧрд░реАрдм рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕рдВрдпреЛрдЬрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ !Unpin рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрджрд┐ рд╣рдо async рдмреНрд▓реЙрдХ рд╕реЗ рдлреНрдпреВрдЪрд░реНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рд╡реЗ рд╕реАрдзреЗ join! рдпрд╛ select! рдЬреИрд╕реЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ pinned рдФрд░ fused рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП pin_mut! рдФрд░ .fuse() рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓ рдХрд░реЗрдВ

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ async рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдореИрдХреНрд░реЛ рдЖрдзрд╛рд░рд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ join! рдФрд░ select! рдкреБрд░рд╛рдиреЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдпреЗ рдЕрддреНрдпрдзрд┐рдХ рдлреИрд╢рди рдореЗрдВ рд╣реИрдВ рдЬреЛ рдЕрдХреНрд╕рд░ рдпрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЯреЛрдХреАрдУ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ .unwrap() рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

let response = await!({
    client.get(uri)
        .timeout(Duration::from_secs(10))
}).unwrap();

рдпрджрд┐ рдЙрдкрд╕рд░реНрдЧ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрди рдЬрд╛рдПрдЧрд╛

let response = await {
    client.get(uri).timeout(Duration::from_secs(10))
}.unwrap();

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЛ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,

client.get(uri).timeout(Duration::from_secs(10)).await.unwrap()
client.get(uri).timeout(Duration::from_secs(10)) await.unwrap()

рдХреНрдпрд╛ рдХреЛрдИ рд╕рд╣рдЬ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИ рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдореМрдЬреВрджрд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИред await рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИ? рдпрд╛ await рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реИ рдЬрд┐рд╕рдХреА рдПрдХ рд╡рд┐рдзрд┐ unwrap() ? рдмрд╣реБрдд рдмреБрд░рд╛! рдЬрдм рд╣рдо рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдмрд╣реБрдд рдХреБрдЫ рдЦреЛрд▓ рджреЗрддреЗ рд╣реИрдВред рдкрд╛рдпрдерди рдХреЗ рдЬрд╝реЗрди рдореЗрдВ рдХрдИ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ред

рдирд┐рдпрдо рддреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред
рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдордЭрд╛рдирд╛ рдХрдард┐рди рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред
рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд╕рд╛рдордиреЗ, рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рдкреНрд░рд▓реЛрднрди рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░реЗрдВред

рдХреНрдпрд╛ рдХреЛрдИ рд╕рд╣рдЬ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИ рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдореМрдЬреВрджрд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИред await рдПрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИ? рдпрд╛ await рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╣реИ рдЬрд┐рд╕рдХреА рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕реЗ unwrap() рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ? рдмрд╣реБрдд рдмреБрд░рд╛! рдЬрдм рд╣рдо рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдмрд╣реБрдд рдХреБрдЫ рдЦреЛрд▓ рджреЗрддреЗ рд╣реИрдВред рдкрд╛рдпрдерди рдХреЗ рдЬрд╝реЗрди рдореЗрдВ рдХрдИ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ред

рдпрджреНрдпрдкрд┐ рд╡рд╣рд╛рдБ рдореЗрдВ рдРрд╕реЗ рдЕрдиреЗрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ рдореИрдВ, рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ docs.rs рдмреБрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ unwrap , unwrap рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ? рдХрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВред рдкрдЯреНрдЯреЗ рдкрд░, рдпрд╣ рдореЗрд░реА рдкреНрд░реЗрдЯрд┐рд╕ рд╣реИред

рдореБрдЭреЗ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 585562 рдХреА рдХреБрд▓ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 40 рд▓рд╛рдЗрдиреЗрдВ рдХреЗрд╡рд▓ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ? рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВред

рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рд╣рд╛рдпрдХ рдорд╛рдк рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрдЯрд░ _per рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐_ред рдареЗрда (рд░рд╕реНрдЯрдлрдПрдордЯреА) рд╢реИрд▓реА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡реЗ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рд░рд╛рд╢рд┐ рдореЗрдВ рдЬрдВрдЬреАрд░ рд╣реЛрдЧреА рдЬреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ (рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ) await рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред

рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореИрдВрдиреЗ xi-editor, alacritty, ripgrep, bat, xray, fd, firecracker, yew, Rocket, exa, iron, parity-ethereum, tikv рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдпреЗ рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рд┐рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд░рд╕реНрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИрдВред рдЗрд╕ рдмрд╛рд░ рдореИрдВрдиреЗ рдкреИрдЯрд░реНрди рдХреА рддрд▓рд╛рд╢ рдХреА:

xxx
  .f1()
  .f2()
  .f3()
  ...

рдФрд░ рдХреНрдпрд╛ рдЗрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХрдИ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрдЪрд╛рд▓рдХ рд╣реИрдВред

рдореИрдВрдиреЗ рдкрд╣рдЪрд╛рдирд╛ рдХрд┐ 7066 рдЪреЗрди рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 15 рдореЗрдВ рдорд▓реНрдЯреАрдкрд▓ рдХрдВрдЯреНрд░реЛрд▓ рдлреНрд▓реЛ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВред рд╡рд╣ 0.2% рд╣реИ ред рдпреЗ рд░реЗрдЦрд╛рдПрдБ 585562 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ 167 рд╣реИрдВред рд╡рд╣ 0.03% рд╣реИ ред

@ cenwangumass рд╕рдордп рд▓реЗрдиреЗ рдФрд░ рдорд╛рддреНрд░рд╛рддреНрдордХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред :рджрд┐рд▓:

рдПрдХ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЪреВрдБрдХрд┐ рд░реБрд╕реНрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╡рд┐рджреНрд░реЛрд╣ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрдкрд╕рд░реНрдЧ await рд▓рд┐рдП рдПрдХ рд╕рдореНрдореЛрд╣рдХ рддрд░реНрдХ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЗрд╕рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ await рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓рд╛рдЗрди рд╣реЛрдЧреАред -рдмрд┐рдВрджреБред рджреЛ рдЧреБрдирд╛ рд╣реЛрдиреЗ рдХрд╛ рдлрд╛рдпрджрд╛: рд╕реНрдЯреИрдХрдЯреНрд░реИрдХреНрд╕реЗрд╕, рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрди рдирдВрдмрд░ рдЬрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рд╡рд╣рд╛рдВ рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ, рдФрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЪрд░ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рддреАрдХреНрд╖рд╛-рдмрд┐рдВрджреБ рдкрд░ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдирд╛ рдЖрдо рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЙрдкрд╕рд░реНрдЧ-рд╢реИрд▓реА рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЗ рдмреАрдЪ рдореЗрдВ рдлрдЯрд╛ рд╣реБрдЖ рд╣реВрдБ, рд╣рд╛рд▓рд╛рдВрдХрд┐ https://github.com/rust-lang/rust/issues/57640#issuecomment -457457727 рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рд╢рд╛рдпрдж рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд░реНрдЬрди рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдБред

рдкреНрд░рд╕реНрддреБрдд рдЙрдкрд╕рд░реНрдЧ рд╢реИрд▓реА:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = await? self.request(url, Method::GET, None, true));
    let user = await? user.res.json::<UserResponse>();
    let user = user.user.into();

    Ok(user)
}

рдкреНрд░рд╕реНрддреБрдд рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╢реИрд▓реА:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.request(url, Method::GET, None, true)) await?;
    let user = user.res.json::<UserResponse>() await?;
    let user = user.user.into();

    Ok(user)
}

рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ sigil @:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.request(url, Method::GET, None, true))@?;
    let user = user.res.json::<UserResponse>()@?;
    let user = user.user.into();

    Ok(user)
}

рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд░реНрдЬрди #:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.request(url, Method::GET, None, true))#?;
    let user = user.res.json::<UserResponse>()#?;
    let user = user.user.into();

    Ok(user)
}

рдореИрдВрдиреЗ рдкрд░реНрдпрд╛рдкреНрдд рд▓реЛрдЧреЛрдВ рдХреЛ await Stream s рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ, рдЪрд╛рд░реЛрдВ рдУрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ await рд╕реЗ рджреВрд░рджрд░реНрд╢рд┐рддрд╛ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдХреЗ рд╕рд╛рде Stream рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕

for await response in stream {
    let response = response?;
    ...
}

// In which case an `await?` variant might be beneficial
for await? response in stream {
    ...
}

рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреЗрдХреНрд╕

for response in stream await {
    let response = response?;
    ...
}
for response in stream.await!() {
    let response = response?;
    ...
}

// Or a specialized variant of `await` and `?`
//     Note (Not Obvious): The `?` actually applies to each response of `await`
for response in stream await? {
    ...
}
for response in stream.await!()? {
    ...
}

рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ / рд╕реБрд╕рдВрдЧрдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛

let results: Vec<Result<_, _>> = ...;
for value in? results {
    ...
}
for response await? stream {
    ...
}

рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдХрдо рд╕реЗ рдХрдо рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ Future рдкреАрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣ Stream рд▓рд┐рдП рд╕рдмрд╕реЗ рдХрдо рд╕рд╣рдЬ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ await рдХреЗ рд▓рд┐рдП Future рдФрд░ рдХреА рдПрдХ рдЕрд▓рдЧ рд╢реИрд▓реА await рдХреЗ рд▓рд┐рдП Stream ? рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЧреИрд░-рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИред

рдпреЗ рд╕рдм рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд╢реБрд░реБрдЖрддреА рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ, рдпрд╣ Stream usecase рджреЗрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЗ рдирдЬрд╝рд░рд┐рдП рд╕реЗ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ Stream рд╕рд╛рде рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреИрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП?

рдзрд╛рд░рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореИрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕рдХреА рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░рддрд╛ рд╣реВрдВред while let рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░реЗрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐:

рдЙрдкрд╕рд░реНрдЧ рдХреНрд╖реЗрддреНрд░
while let Some(value) = stream.try_next().await? {
}
"рд╕реБрд╕рдВрдЧрдд" рд╡рд░реАрдпрддрд╛ рдФрд░ рдЪреАрдиреА рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ
while let Some(value) = await? stream.try_next() {
}
рдЕрдирд┐рд╡рд╛рд░реНрдп рджреЗрд░реА рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ
while let Some(value) = await { stream.try_next() }? {
}

рдЪреАрдЬреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдореМрдЬреВрджрд╛ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ (рдкреНрд▓рд╕ await )ред


рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг "рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ" рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рдЬрдмрдХрд┐ await(...)? рдПрдХ рдЯрдЪ рдирд┐рдХрд░ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо "рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ" рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ _one_ рддрд░рд╣ рдХреЗ рд╕реАрдорд╛рдВрдХрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВрдЧреЗ (рдЬреИрд╕реЗ try { ... } )ред

рддреНрд╡рд░рд┐рдд рд╕реНрдкрд░реНрд╢рд░реЗрдЦрд╛, рд▓реЗрдХрд┐рди "рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ" рдмрд╕ рд╣реЛ рдЬрд╛рдПрдЧрд╛ ... рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрд╕рд░реНрдЧ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ? await рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП await expr рдФрд░ await { expr } рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рднреА рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ {} рджреНрд╡рд╛рд░рд╛ рдШреЗрд░ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓ рдиреЗ рдореБрдЭреЗ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рди рдХреЗрд╡рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдкреИрдЯрд░реНрди рдореЗрдВ рдПрдХ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

// These two lines mean the same - both await the future
let x = await my_future;
let async x = my_future;

рдЬреЛ рддрдм рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ for рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ

for async x in my_stream { ... }

@ivandardi

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ "рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ" ? рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреВрд░реНрд╡рддрд╛ рдХрд╛ рд╕рд╡рд╛рд▓ рд╣реИред _Mandatory_ delimiters рдХреЗ рд╕рд╛рде, рдХреЛрдИ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реИред

_Similar_ (рд╕реНрдерд┐рд░) рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП try { .... } рджреЗрдЦреЗрдВред рдХреЛрд╢рд┐рд╢ рдХреА рдЧрдИ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдПрдХ рд╣реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ - рдпрд╣ ? рд╕рд╛рде рдХреИрд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ - рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рдЕрдВрджрд░ ? рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред

@yazaddaruvala рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рд▓реВрдк рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ async рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрд┐ рдмрд╕ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ Iterator<Item = Result<...>> рд╕рд╛рде рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

// postfix syntax
for response in stream await {
    ...
}

рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ stream: impl Future<Output = Iterator> рдФрд░ рдЖрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдирд╣реАрдВред рдореИрдВ async for item in stream рд╕реЗ рдмреЗрд╣рддрд░ рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдореМрдХрд╛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ ( @tanriol рдЙрд▓реНрд▓реЗрдЦ рдХреА рддрд░рд╣ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдмрд┐рдирд╛)ред


рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреАрдЫрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ

await (foo.bar()).baz()?;
await { let foo = quux(); foo.bar() }.baz()?;

рдХреМрди рд╕реЗ рдкрд╛рд░реНрд╕ (рдкрд░реНрдпрд╛рдкреНрдд рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдХрд┐ рдпреЗ рддреАрдиреЛрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрджрд┐рдЧреНрдз рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)

// obvious precedence prefix
await ((foo.bar()).baz()?);
await ({ let foo = quux(); foo.bar() }.baz()?);

// useful precedence prefix
(await ((foo.bar()).baz()))?;
(await ({ let foo = quux(); foo.bar() }.baz())?;

// mandatory delimiters prefix
(await (foo.bar())).baz()?;
(await { let foo = quux(); foo.bar() }).baz()?;

рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ, Csc рд╕реЗ https://github.com/rust-lang/rust/issues/57640#issuecomment -457457727 рдореЗрдВ @scottmcm рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрд╕ (await foo).bar рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЧрдП рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде рдареАрдХ рджрд┐рдЦрддреЗ рд╣реИрдВ await(foo).bar рд╕реНрдерд┐рддрд┐:

await(response.Content.ReadAsStringAsync()).Should().Be(text);
var previous = await(branch.ListHistoryAsync(timestampUtc, null, cancellationToken, 1)).HistoryEntries.SingleOrDefault();

Et ceteraред рдпрд╣ рд▓реЗрдЖрдЙрдЯ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдореМрдЬреВрджрд╛ рдХреАрд╡рд░реНрдб-рдЖрдзрд╛рд░рд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдФрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ (C # рд╕рд╣рд┐рдд) рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред рдпрд╣ рдЕрдирдЬрд╛рди рдмрдЬрдЯ рдХреЛ рддреЛрдбрд╝рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реИ, рдФрд░ рдкреЛрд╕реНрдЯ await рдЪреЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдмреЗрд╢рдХ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ try! рдмрд╣реБ рдХреЗ рд▓рд┐рдП await рдЪреЗрдирд┐рдВрдЧ, рдХрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛ рдПрдХ рд╕рдордЭреМрддреЗ рдХреЗ рдмрдбрд╝рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ Result ? рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЕрдзрд┐рдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдпрдХреАрдирди рдЕрдкрдардиреАрдп рдкреИрдЯрд░реНрди рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣рд╛рдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдЪрд┐рддреНрд░рддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реВрдВрдЧрд╛ред

рдФрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд (C # рд╕рд╣рд┐рдд)

рдпрд╣ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛рд░реНрдп C # (рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдпрд╛ рдкрд╛рдпрдерди) рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

await(response.Content.ReadAsStringAsync()).Should().Be(text);

рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

var future = (response.Content.ReadAsStringAsync()).Should().Be(text);
await future;

(рдбреЙрдЯ рдСрдкрд░реЗрдЯрд░ рдХреА await рд╕реЗ рдЕрдзрд┐рдХ рдкреВрд░реНрд╡рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк await рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднреА рдЕрдзрд┐рдХ рдХрд╕рдХрд░ рдмрд╛рдВрдзрддрд╛ рд╣реИ)ред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдпрд╣ рджрд╛рд╡рд╛ рдореИрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдЖрджреЗрд╢ рд╕рдорд╛рди рд░рд╣рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡рд╣ (рдЕрд▓рдЧ рд╕реЗ) рдореМрдЬреВрджрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рд╕рд╣реА рдкреВрд░реНрд╡рддрд╛ рд╣реИред

рдпрд╣ рд▓реЗрдЖрдЙрдЯ рдореМрдЬреВрджрд╛ рдХреАрд╡рд░реНрдб-рдЖрдзрд╛рд░рд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд [...] рд╣реИ

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ _warn_ рдХреЗ рдЦрд┐рд▓рд╛рдл рдореМрдЬреВрджрд╛ рд▓реЗрдЖрдЙрдЯ-рдЖрдзрд╛рд░рд┐рдд рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЙрд╕ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

warning: unnecessary parentheses around `return` value
 --> src/lib.rs:2:9
  |
2 |   return(4);
  |         ^^^ help: remove these parentheses
  |
  = note: #[warn(unused_parens)] on by default

рдФрд░ rustfmt рдмрджрд▓рддрд╛ рд╣реИ рдХрд┐ return (4); , _adding_ in a spaceред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдмрд╛рд▓реЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдЬреИрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реВрдВред return (4) , return(4) , рдпрд╣ рдПрдХ рд╢реИрд▓реА рдХреЗ рдореБрджреНрджреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред

рдореИрдВрдиреЗ рдкреВрд░рд╛ рдореБрджреНрджрд╛ рдкрдврд╝рд╛ рдФрд░ рдореБрдЭреЗ рд▓рдЧрдиреЗ рд▓рдЧрд╛ рдХрд┐ {} рдмреНрд░реЗрд╕реЗрдЬрд╝ рдФрд░ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдареАрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдпрд╣ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛

рдЪрд▓реЛ рджреЗрдЦрддреЗ рд╣реИрдВ:

let foo = await some_future();
let bar = await {other_future()}?.bar

рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд╣реИ рдирд╛? рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЕрдзрд┐рдХ await рдХреЛ рдЪреЗрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

let foo = await some_future();
let bar = await {
                await {other_future()}?.bar_async()
          }?;

IMHO рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рдЦрд░рд╛рдм рд▓рдЧ рд░рд╣рд╛ рд╣реИ

let foo = some_future() await;
let bar = other_future() await?
           .bar_async() await?;

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореИрдВ async chaining рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛, рдЬреИрд╕рд╛ рдХрд┐ @cenwangumass рдХреА рдкреЛрд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рдЗрдкрд░ рд╕рд░реНрд╡рд░ рдореЗрдВ async/await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдХреГрдкрдпрд╛, рдпрд╣ рджрд┐рдЦрд╛рдПрдВ рдХрд┐ рдЗрд╕ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪреЗрдирд┐рдВрдЧ рдХрд╣рд╛рдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд▓рдЪрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдХреЛрдИ рдордЬрд╛рдХ рдирд╣реАрдВред


рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ "рднреНрд░рд╖реНрдЯ" рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рд╕реЗ рдЖрдк рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддрдм рдЖрдкрдХреЛ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрддреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

let responses: Vec<Response> = await {
    stream::iter(all_ids)
        .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
        .and_then(|mut res| res.json().err_into())
        .try_buffer_unordered(10)
        .try_collect()
}?;

рд╕рд┐рд░реНрдл

let responses: Vec<Response> = all_ids
   .map(async |id|  {
      let response = self.request(URL, Method::GET, vec![("info".into(), id.into())]) await?;
      Ok(res.json() await?)
   })
   .join_all() await
   .collect()?

рдЕрдЧрд░ рд╡рд╛рдпрджрд╛ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ рддреЛ рдмрд╕ рдЙрддрдирд╛ рд╣реА рд╕рд░рд▓ рд╣реИ:

let responses: Vec<Response> = all_ids
   .map(async |id|  {
      let response = self.request(URL, Method::GET, vec![("info".into(), id.into())])? await?;
      Ok(res.json()? await?)
   })
   .join_all()? await
   .collect()?

@ рд▓рдирд┐рдХреЛрд▓рд╛ , @nicoburns ,

рдореИрдВрдиреЗ https://internals.rust-lang.org/t/pre-rfc-extended-dot-operator-as-possible-syntax-for-await рдкрд░ val.[await future] рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░реА-рдЖрд░рдПрдлрд╕реА рдзрд╛рдЧрд╛ рдмрдирд╛рдпрд╛ рд╣реИред -chaining / 9304

@ рдбрд╛рдЙрд╡реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░рд╢реНрдиреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд╣реАрдВ рдФрд░ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://internals.rust-lang.org

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рджреЛ рд╢рд┐рд╡рд┐рд░ рд╣реИрдВ: рд╡реЗ рд▓реЛрдЧ рдЬреЛ рдкреИрджрд╛рд╡рд╛рд░ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд▓реЛрдЧ рдЙрди рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд░реВрд╕реНрдЯ рдореЗрдВ Async, 2018 рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреНрд▓рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

Async / рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдЕрдВрдХрди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред

рдКрдкрд░ рд╕реЗ рд╕рд░рд▓ рдЯреЛрдХрд┐рдпреЛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реБрдП ( unwrap() рд╕реЗ ? рдмрджрд▓рддреЗ рд╣реБрдП):

let response = await!({
    client.get(uri).timeout(Duration::from_secs(10))
})?;

рдФрд░ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдЧрдирд▓ рд▓рдЧрд╛рдиреЗ рд╕реЗ рд╣реЛрддрд╛ рд╣реИ

let response = client.get(uri).timeout(Duration::from_secs(10))!?

рдЬреЛ рдмрд╛рд░реАрдХреА рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдорд┐рд▓рддрд╛ рдЬреБрд▓рддрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкрд╢реНрдЪрд╛рдд рд░рд╛рд╢рди рдореЗрдВ await рдХрд╛ рдЕрдВрддрд░ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрдиреЗ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд░реНрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ ! рдХрд┐рдпрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕ рд╕реБрдЭрд╛рд╡ рд╕реЗ рдореБрдЭреЗ рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдХреБрдЫ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИред рдореИрдВрдиреЗ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдЪрд┐рд╣реНрди рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрд░реНрде рд╣реИ рдЬреЛ рджреЛрдиреЛрдВ @ (рдХрд┐ рдореЗрд░рд╛ рдорд╕реНрддрд┐рд╖реНрдХ "рдкрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рддрд╛ рд╣реИ) рдФрд░ # рдХрдореА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рд╕реНрд╡рд╛рдж рдХреА рдмрд╛рдд рд╣реИ рдФрд░ рдореЗрд░реА рдмрд╛рдд рдирд╣реАрдВред

рдореИрдВ рдЕрдиреНрдп рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд┐рд╕реА рднреА рдПрдХрд▓ рд╡рд░реНрдг рдХреЗ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХреЛ рдареАрдХ рд╕реЗ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рд╡рд┐рдиреАрдд рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрдХрдбрд╝ рд▓реЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреЛ рдХреЛрдб рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдирд╛рдо рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдореИрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ ? рдорд╛рдорд▓реЗ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рд░рд┐рдЯрд░реНрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП: рдЖрдк рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдЙрдкрдЬ рдмрд┐рдВрджреБрдУрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдкрдврд╝рддреЗ рд╕рдордп рдЗрддрдирд╛ рдирд╣реАрдВред рдЪреВрдВрдХрд┐ рдХреЛрдб рд▓рд┐рдЦрд┐рдд рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, await рд▓рд┐рдП рдПрдХ рд╡рд┐рдиреАрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдореИрдВ C # рдЯреАрдо рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ (рдЬреЛрд░ рдореЗрд░рд╛ рд╣реИ):

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо 'рд╡реЗрдЯ' рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА 'рдирд┐рд╣рд┐рдд' рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЧрдПред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдерд╛ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЛрдЧ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдФрд░ рдЬрд┐рд╕реЗ рд╡реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдлреНрд░рдВрдЯ-рдПрдВрдб-рд╕реЗрдВрдЯрд░ рдЪрд╛рд╣рддреЗ рдереЗ рддрд╛рдХрд┐ рд╡реЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХреЗрдВред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрд╖реЛрдВ рдмрд╛рдж рднреА, рдпрд╣ рдкреНрд░рд╡реГрддреНрддрд┐ рдмрдиреА рд╣реБрдИ рд╣реИред рдЕрд░реНрдерд╛рдд рдХрднреА-рдХрднреА рд╣рдореЗрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ рдмрд╛рдж рдкрдЫрддрд╛рд╡рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЕрддреНрдпрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ ред рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдЕрдЪреНрдЫреА рд╣реИрдВ рдЬреЛ рдЬрд▓реНрджреА рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рд▓реЛрдЧ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреБрдЫ рдирд┐рдбрд░ рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рд╣реЛрддреЗ рд╣реИрдВред 'рд╡реЗрдЯ' рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ ред рд▓реЛрдЧ рдЕрднреА рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдХреАрд╡рд░реНрдб рдХреЗ рднрд╛рд░реА-рд╡рдЬрди рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣реЗ рд╣реИрдВ

рд╕рд┐рдЧрд┐рд▓ рд╡рд░реНрдг рдЙрдЪрд┐рдд рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рд▓рдЧрднрдЧ рдЕрджреГрд╢реНрдп рд╣реИрдВ рдФрд░ рдирдП рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдо рдЕрдиреБрдХреВрд▓ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛)ред


рд▓реЗрдХрд┐рди sigils рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, @ рд╢рд╛рдпрдж рдЧреИрд░-рдЕрдВрдЧреНрд░реЗрдЬреА рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ (рдЬреИрд╕реЗ рдореБрдЭреЗ) рдХреЛ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ at рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдкрдврд╝рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд╕рд░рд╛ рдирд╛рдо рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдХреЛрдб рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрд░реНрде рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдЪрд┐рддреНрд░рд▓рд┐рдкрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрддреЗ рд╣реИрдВред

@ рд╣рдХреНрд╕реА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ sigils рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╛рд╣рд░ рд╢рд╛рд╕рди рдХрд░ рд░рд╣реЗ рд╣реИрдВред Centril рдХреА рдкреЛрд╕реНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЙрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рджреЗрдЦреЗрдВ, await рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдмрд╣реБрдд рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ "рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣рд╛рдБ рдмрд╣реБрдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЛрдб рдирд╣реАрдВ рд╣реИ рдЬреЛ рдХрд┐ рдЬрдВрдЬреАрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдХреЛ рдЬреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП", рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рдХрд┐рд╕реНрд╕рд╛ рд╣реИ (рдХрд┐ рдореИрдВ рд╢рд╛рдпрдж рдЦрд░рд╛рдм рд╕реНрдореГрддрд┐ рдХреЗ рдХрд╛рд░рдг рдХрд╕рд╛рдИ рд╣реВрдБ):

рджреНрд╡рд┐рддреАрдп рд╡рд┐рд╢реНрд╡ рдпреБрджреНрдз рдореЗрдВ, рд▓рдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рджреЗрд╢реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд╣рд╛рдБ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдорд╛рдиреЛрдВ рдХреЛ рдЦреЛ рд░рд╣рд╛ рдерд╛ред рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдиреЗ рд╡рд┐рдорд╛рдиреЛрдВ рдХреЛ рдордЬрдмреВрдд рдХрд░рдирд╛ рдерд╛ред рддреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд╣рд╛рдБ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рдорд╛рдиреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЧреЛрд▓рд┐рдпрд╛рдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХрд╣рд╛рдБ рд╕реЗ рдЯрдХрд░рд╛рддреА рд╣реИрдВред рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдорд╛рди рдореЗрдВ, рдкрдВрдЦреЛрдВ рдореЗрдВ рдФрд╕рддрди 70% рдЫреЗрдж, рдЗрдВрдЬрди рдХреНрд╖реЗрддреНрд░ рдореЗрдВ 10% рдФрд░ рд╡рд┐рдорд╛рди рдХреЗ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ 20% рдереЗред рддреЛ рдЙрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде, рдпрд╣ рдкрдВрдЦреЛрдВ рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдЧрд▓рдд! рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЙрди рд╡рд┐рдорд╛рдиреЛрдВ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рдкрд╕ рдЖрдП рдереЗред рдФрд░ рдЙрди рд╡рд┐рдорд╛рдиреЛрдВ рдореЗрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдкрдВрдЦ рдкрд░ рдЧреЛрд▓реА рдХрд╛ рдиреБрдХрд╕рд╛рди рдЙрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╡рд┐рдорд╛рдиреЛрдВ рдиреЗ рдХреЗрд╡рд▓ рдЗрдВрдЬрди рдХреНрд╖реЗрддреНрд░ рдХреЛ рдорд╛рдореВрд▓реА рдиреБрдХрд╕рд╛рди рдкрд╣реБрдВрдЪрд╛рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЬрди рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрдбрд╝реА рдХреНрд╖рддрд┐ рдШрд╛рддрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрдВрдЬрди рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рдмрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рдЙрдкрд╛рдЦреНрдпрд╛рди рдХреЗ рд╕рд╛рде рдореЗрд░реА рдмрд╛рдд рдпрд╣ рд╣реИ: рд╢рд╛рдпрдж рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдХреЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рд▓рд╛рдн рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╕рднреА рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХрднреА рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд▓реЛрдЧ рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдЕрдзрд┐рдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд▓рдЪреАрд▓реЗрдкрди рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд░рд╛рдд рдореЗрдВ рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рдПрдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреБрдирддреЗ рд╣реИрдВред рдореИрдВ "рд╕реНрдкрд╖реНрдЯрддрд╛ рдкреВрд░реНрд╡рддрд╛" рдЙрдкрд╕рд░реНрдЧ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ .await рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВред рдпреЗ рдЕрдВрддрд┐рдо рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рджреЛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рдЕрдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЕрдиреБрднрд╡ рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред рдЬрдм рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рд░рд╛рдд рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддрдм рд╣рдо рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдЖрдВрдХрдбрд╝реЗ рдФрд░ рд░рд╛рдп рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рддрдм рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪрд░реНрдЪрд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░ рдПрдХ рдмреЗрд╣рддрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕рдорд░реНрдерд┐рдд рд╣реИред

@ivandardi рдХрд┐рд╕реНрд╕рд╛ рдмрд╣реБрдд рднрд╛рд░реА рд╣реИ рдФрд░ IMHO рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИ: рдпрд╣ рдПрдХ рдпрд╛рддреНрд░рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдкреНрд░реЗрд░рдХ рдХрд╣рд╛рдиреА рд╣реИ, рд▓реЛрдЧреЛрдВ рдХреЛ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрдиреЗ рдФрд░ рд╕рднреА рдХреЛрдгреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ _not_ one рд╡рд┐рдкрдХреНрд╖ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдПрдХ рдЪрд░реНрдЪрд╛ред рдпрд╣ рд░реБрд╕реНрдЯ 2018 рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдерд╛, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдореБрджреНрджреЗ рдкрд░ рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдмрд╣рд╕ рдореЗрдВ рджреВрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЕрдпреЛрдЧреНрдп рд╣реИрдВ, рдЖрдкрдХреЛ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдпрд╛ рдЕрдзрд┐рдХ рджреГрд╖реНрдЯрд┐ рд░рдЦрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдпрд╣реА рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрд╕реНрд╡реАрд░ рдореЗрдВ рд░рд╣рдирд╛, рд╢рд╛рдпрдж рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдиреЗ рдЗрд╕реЗ рдХрднреА рдШрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛;)ред

рд▓реЛрдЧреЛрдВ рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдкрд╛ рдФрд░ рджреЗрдЦрд╛ рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Rust ( ? ) рдореЗрдВ рдПрдХ рдЪреЗрдиреЗрдмрд▓ рдСрдкрд░реЗрдЯрд░ рд╣реИ рдЬреЛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЪреЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред https://github.com/rust-lang/rust/issues/57640#issuecomment -458022676

рдпрд╣ рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ _only_ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдорд╛рдк рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ @cenwangumass рдиреЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╣рд╛рдВ рд░рдЦрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/57640#issuecument-457962730 ред рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЗрд╕реЗ рдЕрдВрддрд┐рдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рдПрдХ рдХрд╣рд╛рдиреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЧрд░ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ рддреЛ рдЪреИрдирд┐рдВрдЧ рдПрдХ рдЖрдзреА рдкреНрд░рдореБрдЦ рд╢реИрд▓реА рдмрди рдЬрд╛рддреА рд╣реИред рдореИрдВ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдБ, рд╣рд╛рд▓рд╛рдБрдХрд┐ред рдореИрдВрдиреЗ рдКрдкрд░ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдореБрдЦ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ ( reqwest ) рдХреЗ рдЖрд╕рдкрд╛рд╕ рдорд┐рдЯрд╛рдП рдЧрдП рд╣реИрдВ, рдХреЗрд╡рд▓ 2 рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ API рдиреЗ рдРрд╕рд╛ рдЪреБрдирд╛ рд╣реИ рдФрд░ 2 рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдПрдкреАрдЖрдИ рдЖрдЬ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬрдм рдореИрдВ рдПрдХ рд╢реЛрдз рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрдВрднреАрд░ рд░реВрдк рд╕реЗ рджреЗрд░реА рд╣реЛ рд░рд╣реА рд╣реИ, рдХрд┐рд╕реА рднреА рд╢реЛрдз рдЪрд░рдг рдХреЛ рдмрджрддрд░ рдмрдирд╛ рджреЗрдЧрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдХреЛрдбрдмреЗрд╕ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХрд╛ рднреА рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдЦреБрдж рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗрдЯ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдпрд╣рд╛рдБ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрд╕рдВрдзрд╛рди рдкрд╕рдВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдордп, рд╕реЗрдЯрдЕрдк рд╣реИ рдХрд┐ рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рд▓реЛрдЧ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

@Pixixel рдХреЛ рд░рд┐рдмреЙрдиреНрдбрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

let foo = await some_future();
let bar = await {
                await {other_future()}?.bar_async()
          }?;

рдЬреИрд╕рд╛

`` `
рдЪрд▓реЛ рдлреВ = рдХреБрдЫ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ ();
рд▓реЗрдЯ рдмрд╛рд░ = рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд {other_future ()}? bar_async ();
рд▓реЗрдЯ рдмрд╛рд░ = рдкреНрд░рддреАрдХреНрд╖рд╛ {рдмрд╛рд░} ;;

@Pzixel рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрд╕ C # рдЯреАрдо рдЕрдиреБрднрд╡ рдЙрджреНрдзрд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реНрд░реЛрдд рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдереА ред рдпрд╣ рдЖрд░реЛрдк рдпрд╛ рдХреБрдЫ рдХреЗ рд░реВрдк рдореЗрдВ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл рдкреВрд░рд╛ рдкрд╛рда рдкрдврд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдИрдореЗрд▓ рдкрддреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдореЗрд░рд╛ рджрд┐рдорд╛рдЧ @ "рдкрд░" рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдЙрд╕ рдкреНрд░рддреАрдХ рдХреЛ рдореЗрд░реА рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ "рдХреНрд▓реИрдордлрд╝реЙрдлрд╝" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдореЛрдЯреЗ рддреМрд░ рдкрд░ "рдХреНрд▓рд┐рдВрдЧрд┐рдВрдЧ рдмрдВрджрд░" рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдорд╕реНрддрд┐рд╖реНрдХ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп "рдкрд░" рдХреЗ рд▓рд┐рдП рдмрд╕ рдЧрдпрд╛ред

рдореЗрд░реЗ 2 рд╕реЗрдВрдЯ, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдП рд░рд╕реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ (рд╕реА ++ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред

рдЖрдк рдореЗрдВ рд╕реЗ рдХреБрдЫ рдиреЗ рдирдП рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣рд╛рдБ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ:

  • рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ await!( ... ) рдореИрдХреНрд░реЛ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЧрд▓рдд рдирд╣реАрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред println!() , panic!() , рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ ... рдФрд░ рдРрд╕рд╛ рд╣реА try! рд▓рд┐рдП рд╣реБрдЖ рд╣реИред
  • рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рднреА рд╕рд░рд▓ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИрдВред
  • рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг, рдпрд╛ рддреЛ рдлрд╝реАрд▓реНрдб, рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдореИрдХреНрд░реЛ, IMHO рдХреЛ рдкрдврд╝рдирд╛ рдпрд╛ рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдирд╡рд╛рдЧрдВрддреБрдХ рдмрд╕ "рдареАрдХ рд╣реИ, рдпрд╣реА рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВ"ред рдпрд╣ рддрд░реНрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рднреА рд╣реИ, рдпрд╣ "рдЕрд╕рд╛рдорд╛рдиреНрдп" рд╣реИ, рд▓реЗрдХрд┐рди "рдХреНрдпреЛрдВ рдирд╣реАрдВ"ред
  • рдЙрдкрдпреЛрдЧреА рдкреВрд░реНрд╡рддрд╛ рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдХреЗрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреНрд░рд╛рдордХ рд▓рдЧреЗрдЧрд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ await рдмрд╛рдВрдзрдиреЗ рд╡рд╛рд▓рд╛ рддрдВрдЧ рдХреБрдЫ рджрд┐рдорд╛рдЧ рдЙрдбрд╝рд╛ рджреЗрдЧрд╛ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ (рдЬрдВрдЬреАрд░ рдпрд╛ рдирд╣реАрдВ) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрд╖реНрдардХ рд▓рдЧрд╛рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред
  • рдЪреАрдиреА рдХреЗ рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рдкреВрд░реНрд╡рддрд╛ рд╕рдордЭрдиреЗ рдФрд░ рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИред рдлрд┐рд░, рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЪреАрдиреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ await? рдПрдХ рдЙрдкрдпреЛрдЧреА рдХреАрд╡рд░реНрдб рдХрд╣реЗрдВред рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреЛрдЭрд┐рд▓ рдХреЛрд╖реНрдардХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рджреВрд░ рдХрд░рддрд╛ рд╣реИ:
    `` c# let response = (await http::get("https://www.rust-lang.org/"))?; // see kids? рдЗрдВрддрдЬрд╛рд░ ... unwraps the future, so you have to use ? to unwrap the Result // but there is some sugar if you want, thanks to the рдкреНрд░рддреАрдХреНрд╖рд╛? `рдСрдкрд░реЗрдЯрд░
    рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдирд╛ = рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛? http :: get ( "https://www.rust-lang.org/");
    //, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЪреЗрди рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдкрдардиреАрдп рдЬрдВрдЬреАрд░ рдХреЛрдб рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ
- sigils can be understood quite easily *if the chosen character makes sense* if it is introduced to be "the `?` for futures".

That being said, since no agreement seems to be reached, I think it would be reasonable to ship `await!()` to stable Rust. Then this discussion can be extended without blocking the whole process. Same that what happened for `try!()`/`?`, so again newcomers won't be lost. And if [Simple postfix macros](https://github.com/rust-lang/rfcs/pull/2442) get accepted, the problem will disappear since we'll get postfix macro for "free".

---

Just a thought, what about a postfix keyword, but which can be put as prefix as well, similar in some ways to the `const` keyword of C++? (I don't know if that was already proposed) In prefix position, it behaves like "prefix `await` with obvious precedence and optional sugar":
```c#
// preferred without chaining:
let response = await? http::get("https://www.rust-lang.org/");

// but also possible: (rustfmt warning)
let response = http::get("https://www.rust-lang.org/") await?;
let response = (http::get("https://www.rust-lang.org/") await)?;
let response = (await http::get("https://www.rust-lang.org/"))?;

// chains well
let matches = http::get("https://www.rust-lang.org/") await?
    .body?
    .async_regex_search("(?=(\d+))\w+\1") await;

// any of these are also allowed, but arguably ugly (rustfmt warning again)
let matches = await ((http::get("https://www.rust-lang.org/") await?)
    .body?
    .async_regex_search("(?=(\d+))\w+\1"));
let matches = (await? http::get("https://www.rust-lang.org/"))
    .body?
    .async_regex_search("(?=(\d+))\w+\1") await;
let matches = await http::get("https://www.rust-lang.org/") await?
        .body?
        .async_regex_search("(?=(\d+))\w+\1");
let matches = await (await http::get("https://www.rust-lang.org/"))?
    .body?
    .async_regex_search("(?=(\d+))\w+\1");
let matches = await!(
    http::get("https://www.rust-lang.org/")) await?
        .body?
        .async_regex_search("(?=(\d+))\w+\1")
);
let matches = await { // <-- parenthesis or braces optional here, but they clarify
    (await? http::get("https://www.rust-lang.org/"))
        .body?
        .async_regex_search("(?=(\d+))\w+\1")
};

рдХреИрд╕реЗ рд╕рд┐рдЦрд╛рдПрдБ:

  • ( await!() рдореИрдХреНрд░реЛ рд╕рдВрднрд╡)
  • рд╢реБрдЧрд░ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдЙрдкрд╕рд░реНрдЧ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рдЪреАрдиреА рдХреЗ рд╕рд╛рде (рдКрдкрд░ рджреЗрдЦреЗрдВ)
  • рдЪрд╛рдЗрдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ
  • рдЙрдиреНрд╣реЗрдВ рдорд┐рд╢реНрд░рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИ
  • рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЬрдВрдЬреАрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ

рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдиреБрднрд╡ рд╕реЗ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдЪреЗрдирд┐рдВрдЧ рдЙрдкрд╕рд░реНрдЧ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдХрд┐рд╕реА рднреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдЦреЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ f.then(x => ...) рдЬреИрд╕реЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рд╣реИрдВ рдФрд░ рд╡реЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХрд╛ рд╡реНрдпрд╛рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рдХрд┐рд╕реА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

let ret = response.await!().json().await!().to_string();

рдХреЗ рд╕рдорд╛рди рд╣реИ:

let ret = await future.then(|x| x.json()).map(|x| x.to_string());

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдЪреЗрди рдХреЗ рдКрдкрд░ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдХреЗ рд▓рд╛рдн рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рдХреЛрдИ рдкрдардиреАрдпрддрд╛, рдЬрдВрдЬреАрд░ рдпрд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдореБрджреНрджреЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ:

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {

    let user = await? fetch(format!("/user/{0}", name).as_str())
        .map(|x| serde_json::from_str::<User>(x?))
        .then(|x| fetch(format!("/permissions/{0}", x?.id).as_str()))
        .map(|x| serde_json::from_str::<Vec<Permission>>(x?));

    Ok(user)
}

рдореИрдВ рдЗрд╕ рдЙрдкрд╕рд░реНрдЧ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд░рд╣реВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐:

  • рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХреАред
  • рдЕрдиреНрдп рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрдг (рд╡рд╛рдкрд╕реА, рдмреНрд░реЗрдХ, рдЬрд╛рд░реА, рдЙрдкрдЬ, рдЖрджрд┐ ...)ред
  • рдпрд╣ рдЕрднреА рднреА рдЬрдВрдЧ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ рд╣рдо рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ)ред

Async / wait рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдврд╝рд┐рдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдЗрд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдФрд░ рдЗрд╕рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рдЕрдзрд┐рдХ рд╡рд╛рдпрджрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред
рдХреБрдЫ рд▓реЛрдЧ рд░реВрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рдмрд╛рд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднреА рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЛ рдХрдо рд░рдЦрдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕реНрдХрд┐рдВрд╕ рдХреЗ рдкреАрдЫреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрдард┐рди рд╣реЛ рд╕рдХрддреА рд╣реИред

рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдЙрдкрд╕рд░реНрдЧ рджреЛрдиреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рд╣реИред

@ рд╣рдХреНрд╕реА рд╣рд╛рдВ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рдКрдкрд░ рд▓рд┐рдВрдХ рдХрд░ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ: https://github.com/rust-lang/rust/issues/50547#issuecomment -388939886

рдИрдореЗрд▓ рдкрддреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рдореЗрд░рд╛ рдорд╕реНрддрд┐рд╖реНрдХ @ рд╕реЗ "рдкрд░" рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдЙрд╕ рдкреНрд░рддреАрдХ рдХреЛ рдореЗрд░реА рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ "рдХреНрд▓реИрдордлрд╝реЙрдлрд╝" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдореЛрдЯреЗ рддреМрд░ рдкрд░ "рдХреНрд▓рд┐рдВрдЧрд┐рдВрдЧ рдмрдВрджрд░" рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдорд╕реНрддрд┐рд╖реНрдХ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп "рдкрд░" рдХреЗ рд▓рд┐рдП рдмрд╕ рдЧрдпрд╛ред

рдореЗрд░реА рднреА рдРрд╕реА рд╣реА рдХрд╣рд╛рдиреА рд╣реИ: рдореЗрд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдпрд╣ "рдХреБрддреНрддрд╛" рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдИрдореЗрд▓ рдкрдврд╝рдиреЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рджреЗрдЦрдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ред

@llambda рд╕рд╡рд╛рд▓ рдЪреЗрдирд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ред рдмреЗрд╢рдХ рдЖрдк рд╕рд┐рд░реНрдл рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рдкреЗрд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА рдпрд╣ await { foo }? рдмрдЬрд╛рдп await? foo рдпрд╛ foo await? рджрд┐рдЦрддрд╛ рд╣реИред

@totorigolo
рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рджреВрд╕рд░рд╛ рд╕реБрдЭрд╛рд╡ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред рдЬрдм рдЖрдк рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рддрд░реАрдХреЗ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдЖрдк рдХреЗрд╡рд▓ рднреНрд░рдо рдФрд░ рдкрд░реЗрд╢рд╛рдиреА рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рд░рдлрд╛рди рд╡рд┐рдХрд▓реНрдк рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИ рдпрд╛ рдЖрдкрдХрд╛ рдХреЛрдб рдЧрдбрд╝рдмрдбрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

@Hirevo async/await рдХреЛрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рдЪрд▓реЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ "рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЕрдХреЗрд▓реЗ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ"ред рдЖрдкрдХрд╛ рдХреЛрдб рд╕рдорд╛рди рд╣реИ

future.then(|x| x.json()).map(|x| x.to_string()).map(|ret| ... );

рддреЛ рдЪрд▓реЛ async/await рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ?

рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХрдо рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИрдВ, рдХрдо рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рдЖрдк рд╕рд┐рд░реНрдл await рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдЙрдзрд╛рд░ рд▓реЗрдирд╛ (рдХреНрдпрд╛ Pin рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред

рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рдХреЛрдИ рдкрдардиреАрдпрддрд╛, рдЬрдВрдЬреАрд░ рдпрд╛ рдкреВрд░реНрд╡рд╡рд░реНрддреА рдореБрджреНрджреЗ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {

    let user = await? fetch(format!("/user/{0}", name).as_str())
        .map(|x| serde_json::from_str::<User>(x?))
        .then(|x| fetch(format!("/permissions/{0}", x?.id).as_str()))
        .map(|x| serde_json::from_str::<Vec<Permission>>(x?));

    Ok(user)
}

рдореИрдВ рдХрд░рддрд╛ рд╣реВрдБ:

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
    let user = fetch(format!("/user/{0}", name).as_str()) await?;
    let user: User = serde_json::from_str(user);
    let permissions =  fetch(format!("/permissions/{0}", x.id).as_str()) await?;
    let permissions: Vec<Permission> = serde_json::from_str(permissions );
    Ok(user)
}

рдХреБрдЫ рдЕрдЬреАрдм рдЪрд▓ рд░рд╣рд╛ рд╣реИ? рдХреЛрдИ рджрд┐рдХреНрдХрдд рдирд╣реАрдВ рд╣реИ:

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
    let user = dbg!(fetch(format!("/user/{0}", name).as_str()) await?);
    let user: User = dbg!(serde_json::from_str(user));
    let permissions = dbg!(fetch(format!("/permissions/{0}", x.id).as_str()) await?);
    let permissions: Vec<Permission> = dbg!(serde_json::from_str(permissions));
    Ok(user)
}

рдХрдВрдмрд╛рдЗрдиреЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рд╣реИред рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХрд╛ ? then / map рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЖрдкрдХрд╛ рдХреЛрдб into_future() рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред async/await рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЖрдкрдХреЛ рдЕрдЬреАрдм рдЪреАрдЬрд╝реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ async рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рдиреВрдиреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рд╡реЗ рд╣рдорд╛рд░реЗ рд╕рднреА рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрдиреБрдордд рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдВ рд╣реЛрдВрдЧреА:

  • await!(...) , try!() рдФрд░ println!() рдЬреИрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП
  • await , await(...) , await { ... } , рдпрд╛рдиреАред рдЪреАрдиреА рдХреЗ рдмрд┐рдирд╛ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕
  • await? , await?() , await? {} , рдпрд╛рдиреАред рдЪреАрдиреА рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕
  • ... await , рдпрд╛рдиреАред рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ (рдкреНрд▓рд╕ ... await? , рд▓реЗрдХрд┐рди рдЬреЛ рдЪреАрдиреА рдирд╣реАрдВ рд╣реИ)
  • рдЙрди рд╕рднреА рдХреЗ рд╕рдВрдпреЛрдЬрди, рд▓реЗрдХрд┐рди рдЬреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдирд╣реАрдВ рд╣реИрдВ ( рдореЗрд░реА рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВ )

рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ:

  • рдЙрдкрд╕рд░реНрдЧ рдмрд┐рдирд╛ Result s: await , рдпрд╛ await { ... } рд▓рдВрдмреЗ рднрд╛рд╡реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  • рдЙрдкрд╕рд░реНрдЧ Result s: await? , рдпрд╛ await? {} рд▓рдВрдмреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  • рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдЬрдм рдЙрдкрд╕рд░реНрдЧ: ... await , ... await?

+1 рд╕реЗ рдЬрд╣рд╛рдЬ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ (!) рд╕реНрдереВрд▓ рддрдХ рд╕реНрдереВрд▓ред рдХрд▓, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ ЁЯШД

рдЗрд╕ рдмрд╛рдд рдХрд╛ рдмрд╣реБрдд рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдореИрдВ рдЗрди рдЪрд┐рдВрддрд╛рдУрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЖрдХрд░реНрд╖рдХ рдХрд╛рд░рдг рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдкреАрдврд╝реА рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдмрд╛рдж рдореЗрдВ рдЕрдиреБрдХреВрд▓рди (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ) рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ Async Rust рдХреЛ рдЕрдкрдирд╛рдирд╛ рдХрд┐рд╕реА рднреА рдмрд╛рдж рдХреЗ рдмрдбрд╝реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ / рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИред рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд / рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рддреЛ рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рд╡рдХрд╛рд▓рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЙрд╕ рдПрдбреЙрдкреНрд╢рди рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЕрднреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдирд┐рд░рдВрддрд░ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рджрд░реНрдж рдХрд╛ рдХрд╛рд░рдг рдмрди рд░рд╣реА рд╣реИред

@Pzixel
(рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдлрдВрдХреНрд╢рди рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд╣реИ fetch_user, рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛)

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдмреЗрдХрд╛рд░ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рдВрдпреЛрдЬрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
Await рднрд╡рд┐рд╖реНрдп рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЙрд╕реА рджрд╛рдпрд░реЗ рдореЗрдВ рдПрдХ рдЪрд░ рдореЗрдВ рдмрд╛рдБрдзрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрдХреЗрд▓реЗ рд╕рдВрдпреЛрдЬрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдирд┐рдХрд╛рд▓рдирд╛ рдореЗрд░реЗ рдмрд╕ рдХреА рдмрд╛рдд рдирд╣реАрдВ рдереАред
рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣рд╛ рдХрд┐ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд┐ рдЬреНрд╡рд▓рдВрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреЗрд╡рд▓ рдХреЙрдореНрдмреАрдиреЗрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдкреВрд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдХреЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( await (await fetch("test")).json() рдпрд╛ await { await { fetch("test") }.json() } рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП)ред

рдореЗрд░реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, ? рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХреНрдпреБрдЯрд┐рдВрдЧ рджреНрд╡рд╛рд░рд╛ рдЗрдЪреНрдЫрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓реЛрдЬрд░ Err(...) рд╡рд╛рдкрд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди (рдпрд╣ рднрд╛рдЧ await? рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░)ред

рдЖрдкрдиреЗ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╣рд┐рд╕реНрд╕рд╛ (рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд░рдХреЗ) рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рдмрдЧрд┐рдВрдЧ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ dbg рдХреЗ рд╕рд╛рде рд╕рдЯреАрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ! рдФрд░ рдХреБрдЫ рдирд╣реАрдВ (рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрд╖реНрдардХ рднреА рдирд╣реАрдВ):

async fn fetch_permissions(name: &str) -> Result<Vec<Permission>, Error> {
    let user = await? fetch(format!("/user/{0}", name).as_str())
        .map(|x| dbg!(serde_json::from_str::<User>(dbg!(x)?)))
        .then(|x| fetch(format!("/permissions/{0}", x?.id).as_str())))
        .map(|x| dbg!(serde_json::from_str::<Vec<Permission>>(dbg!(x)?)));
    Ok(user)
}

рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдмрд┐рдирд╛ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдФрд░ рдмрд┐рдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдпрд╛ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рдорд╛рди рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред
рдХреБрдЫ рд▓реЛрдЧ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХреЗ рд╕рд╛рде рдЧреБрдВрдЬрд╛рдЗрд╢ рднрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдВрдЬреАрд░ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП рдореИрдВ рдмрд╕ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╕рдордп рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░, рдЕрдВрдд рдореЗрдВ, рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░, рдХреЛрдб .into_future() рдмрд┐рдирд╛ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпрд╛ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рдпрджрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдореИрдВ рдЗрд╕ рдкрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдирд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╛рдпрджрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛)ред

рдореИрдВ fut await рд╕рд╛рде рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛: рдпрд╣ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдЧрдбрд╝рдмрдбрд╝ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдХреЛрдб рдХреИрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЗ рд╕рдорд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рд╣реИ, рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ for value in collection {..} рдЬреИрд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХреНрдпреЛрдВ рд╣реИрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣рдо a + b рд▓рд┐рдЦрддреЗ рд╣реИрдВ ("a plus b") a b + рдмрдЬрд╛рдп, рдФрд░ "рдХреБрдЫ рдХрд╛ рдЗрдВрддрдЬрд╛рд░" рд▓рд┐рдЦрдирд╛ рдЕрдВрдЧреНрд░реЗрдЬреА (рдФрд░ рдЕрдиреНрдп SVO рднрд╛рд╖рд╛рдУрдВ) рдХреЗ рд▓рд┐рдП "рдХреБрдЫ рдЗрдВрддрдЬрд╛рд░" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИред рдЬрд╝рд░рд╛ рд╕реЛрдЪрд┐рдП рдХрд┐ ? рдмрдЬрд╛рдп рд╣рдордиреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ try рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛: let val = foo() try; ред

fut.await!() рдФрд░ fut.await() рдХреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкрд░рд┐рдЪрд┐рдд рдЕрд╡рд░реЛрдзрдХ рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди "рдореИрдХреНрд░реЛ" рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдмрджреНрдз "рдЬрд╛рджреВ" рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдВрддрд░рд┐рдХреНрд╖ рд╕реЗ рдЕрд▓рдЧ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ рдХреАрд╡рд░реНрдбред рд╕рд┐рдЧрд┐рд▓ рдХреЛ рднреА рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдЕрдзрд┐рдХ рдЕрдореВрд░реНрдд рддрд░реАрдХреЗ рд╕реЗ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдорд╛рдирддрд╛ рдХреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдХреЗ рд╡рд╛рдХреНрдпрд╛рдВрд╢реЛрдВ рдХреЗ рд╕рд╛рде, рдФрд░ рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рд┐рдЧрд┐рд▓ рдХреИрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ: рдпрджрд┐ рдпрд╣ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рдкрдХрдирд╛ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ рд╡реЗрд░рд┐рдПрдВрдЯ рд╕реЗ рд╣реА рдЪреБрдирдирд╛ рдЪрд╛рд╣рд┐рдПред

@rpjohnst рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдмрд╛рдд рдХреНрдпрд╛ рд╣реИ, рдлрд┐рд░ред actual_fun(a + b)? рдФрд░ break (a + b)? рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд┐рд╕рд╛рд▓ рдХреЗ рдХрд╛рд░рдг рдореЗрд░реЗ рд▓рд┐рдП рдорд╛рдпрдиреЗ рд░рдЦрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ await(a + b)? рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рджреВрд░ рд╕реЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рд╡рд╛рд▓ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВред

рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдпрд╣ тАЛтАЛрд╣реИ рдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ .await!() рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕реЗрдВрдЯреНрд░рд┐рдХ рдХреЗ рд╕рднреА рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдХреЗ рдЕрдкрд╡рд╛рдж рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:

" await рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреА рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб рдмрдирд╛ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред"

рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ await рдХреАрд╡рд░реНрдб рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ?


рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдореИрдВрдиреЗ рдЧрд▓рдд рд╕рдордЭрд╛ рдХрд┐ рдХреИрд╕реЗ await рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЧрд▓рдд рдмрдпрд╛рдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рд░рд╛ рд╣реИ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рд╣реИред

рдореЗрд░реА рджреВрд╕рд░реА рдЯрд┐рдкреНрдкрдгреА рдпрд╣ тАЛтАЛрд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ await рдХреАрд╡рд░реНрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ await рд╕реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреНрд░рдо рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдкреИрджрд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

async function waitFor6SecondThenReturn6(){
  let result1 = await waitFor1SecondThenReturn1(); // executes first
  let result2 = await waitFor2SecondThenReturn2(); // executes second
  let result3 = await waitFor3SecondThenReturn3(); // executes third
  return result1 + result2 + result3;
}

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдПрдХ рдЙрдкрд╕рд░реНрдЧ async рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ async рдорд╛рди рдПрдХ рд╕рдВрдХрд▓рдХ-рдирд┐рд░реНрдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рдЯреБрдХрдбрд╝реЗ рд╣реИрдВ:

async function waitFor6SecondThenReturn6(){
  let async result1 = waitFor1SecondThenReturn1(); // executes first
  let async result2 = waitFor2SecondThenReturn2(); // executes second
  let async result3 = waitFor3SecondThenReturn3(); // executes third
  return result1 + result2 + result3;
}

рдпрд╣ рд╕рд╣рдЬ рд╣реИ рдХрд┐ async рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЛ async рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рднреА рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрд╛рдо рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдорд╢реАрдирд░реА рд╣реИ рдФрд░ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдХреБрдЫ рдЕрдирд╕реБрд▓рдЭреЗ рд╕рд╡рд╛рд▓ рд╣реИрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрдВрдкреЛрдЬрд╝реАрдмрд┐рд▓рд┐рдЯреА рдХреЗ рдореБрджреНрджреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рдо рдХрд╣рд╛рдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрдпреЛрдЬрдиреАрдп рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз .await!() рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕-рд╕реНрдЯрд╛рдЗрд▓ рдкреВрд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдкрд╣рд▓реЗ рдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ-рд╢реИрд▓реА рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реБрдИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛрдЧрд╛:

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
    let async user = dbg!(fetch(format!("/user/{0}", name).as_str()));
    let user: User = dbg!(serde_json::from_str(user?));
    let async permissions = dbg!(fetch(format!("/permissions/{0}", user.id).as_str()));
    let permissions: Vec<Permission> = dbg!(serde_json::from_str(permissions?));
    Ok(user)
}

(рдПрдХ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз .dbg!() рдореИрдХреНрд░реЛ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЬрд╛рдиреЗ рдХрд╛ рддрд░реНрдХ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдордВрдЪ рдХреЗ рд▓рд┐рдП рд╣реИред)

Tue рдкрд░, 29 рдЬрдирд╡рд░реА, 2019 рдХреЛ 11:31:32 PM -0800 рдкрд░, рд╕рд░реНрдлрд╝рд┐рдХрди рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВ рджреВрд░ рд╕реЗ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рд╡рд╛рд▓ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВред

рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдпрд╣ тАЛтАЛрд╣реИ рдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ .await!() рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕реЗрдВрдЯреНрд░рд┐рдХ рдХреЗ рд╕рднреА рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдмрд┐рдВрджреБ рдХреЗ рдЕрдкрд╡рд╛рдж рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:

" await рдХреЛ рднрд╡рд┐рд╖реНрдп рдХреА рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреАрд╡рд░реНрдб рдмрдирд╛ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред"

.await!() рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рд╕рдорд░реНрдердХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ
рдмрд┐рд▓рдХреБрд▓ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ await рдПрдХ рдХреАрд╡рд░реНрдб рдмрдиреЗ рд░рд╣реЗрдВред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдХрд░реЗрдВрдЧреЗ
.await!() рдХреА рдЬрд░реВрд░рдд рд╣реИ рд╡реИрд╕реЗ рднреА рд╕рдВрдХрд▓рдХ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ
рддреБрдЪреНрдЫред

@Hirevo

рдЖрдкрдиреЗ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╣рд┐рд╕реНрд╕рд╛ (рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд░рдХреЗ) рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ред

рдореБрдЭреЗ рдпрд╣ "рдкреАрдЫрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЫрд╛" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдЬрдм рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдЪреЗрдирд┐рдВрдЧ рдЕрдЪреНрдЫреА рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдмреЗрдХрд╛рд░ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, "рдЖрдкрдиреЗ рдЪреИрдирд┐рдВрдЧ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛", рд▓реЗрдХрд┐рди рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдБ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рдмрдЧрд┐рдВрдЧ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ dbg рдХреЗ рд╕рд╛рде рд╕рдЯреАрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ! рдФрд░ рдХреБрдЫ рдирд╣реАрдВ (рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрд╖реНрдардХ рднреА рдирд╣реАрдВ)

рдирд╣реАрдВ, рдЖрдкрдиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
    let user = fetch(format!("/user/{0}", name).as_str()) await?;
    let user: User = dbg!(serde_json::from_str(dbg!(user)));
    let permissions =  fetch(format!("/permissions/{0}", x.id).as_str()) await?;
    let permissions: Vec<Permission> = dbg!(serde_json::from_str(dbg!(permissions));
    Ok(user)
}

рдпрд╣ рдПрдХ рд╣реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣рд╛ рдХрд┐ рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд┐ рдЬреНрд╡рд▓рдВрдд рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреЗрд╡рд▓ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рдкреВрд░реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд (рдкреНрд░рддреАрдХреНрд╖рд╛ рдкрд░реАрдХреНрд╖рд╛) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛рдХрд░)ред json () {рдкреНрд░рддреАрдХреНрд╖рд┐рдд {рднреНрд░реВрдг ("рдкрд░реАрдХреНрд╖рдг")} .json ()})ред

рдпрд╣ рдХреЗрд╡рд▓ рдЙрдкрд╕рд░реНрдЧ await рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдпрд╣ рдЗрд╕рдХреЗ рдЕрдиреНрдп рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдмрд┐рдирд╛ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдФрд░ рдмрд┐рдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдпрд╛ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рдорд╛рди рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИред

рдпреЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрдирд╛рддреЗ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╣рдореЗрд╢рд╛ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдбреАрдмрдЧрд░ рд╣реИ рдЬреЛ рдПрдХ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдореВрд▓реНрдп рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдИ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓реАред рдЖрдкрдиреЗ рд╕рд┐рд░реНрдл labmda |user| рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдБ рдореИрдВрдиреЗ let user = ... ред рдЗрд╕рдиреЗ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрдЪрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдЗрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдХрдард┐рди рд╣реИ, рдбреАрдмрдЧ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рдФрд░ рдЗрд╕рдХреА рдЕрднрд┐рднрд╛рд╡рдХ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХреЙрд▓ рдХрд░реЗрдВред рд╢рд╛рдпрдж)ред


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рд╢реНрд░реГрдВрдЦрд▓рди рд╕реНрд╡рдпрдВ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдореВрд▓реНрдп рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЬрдм рд╕реЗ рдореИрдВ рдЫрд╣ рд╕рд╛рд▓ рд╕реЗ рдЕрдзрд┐рдХ рдХреЗ рд▓рд┐рдП async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЖрдк рдЬрдВрдЬреАрд░ async рдХреЛрдб рдХрднреА рдирд╣реАрдВ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рдЖрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдмрд╛рдзреНрдпрдХрд╛рд░реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рд╣рдореЗрд╢рд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдХреНрд╕рд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ async/await , рддреЛ рдЖрдкрдХреЛ futures / streams рдкрд░ рдЗрди рд╕реИрдХрдбрд╝реЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рджреЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: join рдФрд░ select ред рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ / рдмрд╛рдЗрдВрдбрд┐рдВрдЧ / ... рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛рдиреА рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рдЙрдкрдХрд░рдг, рдЬреЛ рдЖрдкрдХреЛ рдЕрднреА рддрдХ рдПрдХ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред

@ рд╢реЗрдлрд┐рдХрди AFAIK рд╕рдореБрджрд╛рдп рдиреЗ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╛ рддреЛ рдХреАрд╡рд░реНрдб рдпрд╛ рдПрдХ рд╕рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП async рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ RFC рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореЗрд░реА рджреВрд╕рд░реА рдЯрд┐рдкреНрдкрдгреА рдпрд╣ тАЛтАЛрд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рднреНрд░рдо рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдкреИрджрд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? рдореБрдЭреЗ рдЬреЗрдПрд╕ / рд╕реА # рд╡реЗрдЯ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рд╕рд┐рд╡рд╛рдп рд╡рд╛рдпрджрд╛ рдХреЗ рдХрд┐ рдпрд╣ рдЪреБрдирд╛рд╡ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ async/await рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдБ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд await? рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:
`` `рд╕реА #
рдЪрд▓реЛ рдлреВ = рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ? bar_async ();

How would this look with ~~futures of futures~~ result of results *) ? I.e., would it be arbitrarily extensible:
```C#
let foo = await?? double_trouble();

IOW, рдЙрдкрд╕рд░реНрдЧ await? рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╡рд┐рд╢реЗрд╖ рд╣реИред

) * рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдлреНрдпреВрдЪрд░ рдХреЗ рдлреНрдпреВрдЪрд░ рдХреЗ рд╕рд╛рде рдпрд╣ рдХреИрд╕рд╛ рд▓рдЧреЗрдЧрд╛? рдпрд╛рдиреА, рдХреНрдпрд╛ рдпрд╣ рдордирдорд╛рдирд╛ рд╣реЛрдЧрд╛:

let foo = await?? double_trouble();

IOW, await? рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╡рд┐рд╢реЗрд╖ рд╣реИред

"рд╡рд╛рдпрджрд╛ рдХрд╛ рд╡рд╛рдпрджрд╛" рд╕реЗ @rolandsteiner рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк impl Future<Output = Result<Result<_, _>, _>> (рдПрдХ await + рджреЛ ? рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЕрд▓рд┐рдЦрд┐рдд" рдПрдХ рд╣реА рднрд╡рд┐рд╖реНрдп рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рджреЛ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ, рдиреЗрд╕реНрдЯреЗрдб рдлреНрдпреВрдЪрд░ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ )ред

await? _is_ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рд╕рдВрднрд╡рддрдГ await 90% + рдЙрдкрдпреЛрдЧреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред рд╡рд╛рдпрджрд╛ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ _IO_ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, IO рдЧрд┐рд░рд╛рд╡рдЯ рдпреЛрдЧреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП 90% + async fn рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреА, io::Result<_> (рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ IO рд╕рдВрд╕реНрдХрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ )ред рдРрд╕реЗ рдХрд╛рд░реНрдп рдЬреЛ Result<Result<_, _>, _> рд╣реИрдВ рд╡реЗ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдирд╕реЗ рд╡рд┐рд╢реЗрд╖-рдХреЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред

@ рдирд┐рдореЛ 157 рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реИрдВ: рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдоред рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдирд╡реАрдиреАрдХреГрддред

рдЖрдЬ, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ

  1. await!(future?) future: Result<Future<Output=T>,E>
  2. await!(future)? future: Future<Output=Result<T,E>>

рдФрд░ рдЕрдЧрд░ рд╣рдо await future? рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ рдХрд┐ рдХреЗрд╕ 1 рд╣рдореЗрд╢рд╛ рдХреЗрд╕ 2 рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ? рд╕реНрдерд┐рддрд┐ 1 рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рддреЛ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреА рд╣реИ, рдпрд╛ рддреНрд░реБрдЯрд┐ рдХрд╛ред рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐ рдХреЛ рд╡рд┐рд▓рдВрдмрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдВрджрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдХреЗрд╕ 2 рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣рд╛рдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, Result<Future<Output=T>,E> рдЧрд╛рд░рдВрдЯрд┐рдпрд╛рдБ рддреНрд░реБрдЯрд┐ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд▓реМрдЯрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рджреЛрдиреЛрдВ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕реЗрдирд┐рдХ рд╣реИред рдореИрдВ рдЫрд╡рд┐ рд╕рдВрдХрд▓рдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдпрджрд┐ рддреНрд░реБрдЯрд┐ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рддреЛ рдЕрддрд┐рд░рд┐рдХреНрдд poll рдХреЙрд▓ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рддреЛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ:

await exp? рд╡реНрдпрд╛рдЦреНрдпрд╛ await (exp?) рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдпрджрд┐ exp Result<Future<Output=T>,E> , рдФрд░ (await exp)? рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдпрджрд┐ exp Future<Output=Result<T,E>> ред рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдпрджрд┐ рдареАрдХ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рддреЛ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдЧрд╛ред

рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╡рд┐рдзрд┐ рд░рд┐рд╕реАрд╡рд░ рдХреА рддрд░рд╣ рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

> рдЬрдм await exp???? рддреЛ рд╣рдо рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ exp рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд░ Result , try рд╣реЛ рдФрд░ рддрдм рднреА рдЪрд▓рддреЗ рд░рд╣реЗрдВ рдЬрдм рдкрд░рд┐рдгрд╛рдо рдЕрднреА рднреА Result ? рдмрд╛рд╣рд░ рдЪрд▓рдиреЗ рддрдХ рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ Result ред рдлрд┐рд░ рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╣рдо рдЗрд╕ рдкрд░ await рд▓рдЧреЗрдВрдЧреЗ рдФрд░ рдмрд╛рдХреА ? s рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред

рдореИрдВ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб / рд╕рддрд░реНрдХ рд╕рдорд░реНрдердХ рдерд╛ рдФрд░ рдЕрдм рднреА рд╣реВрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рдХреА рдкреВрд░реНрд╡рддрд╛ рд╢рд╛рдпрдж pratice рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдбреНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдирд┐рд╣рд┐рдд рдЪреАрдЬреЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реЗрдореЗрдВрдЯрд┐рдХреНрд╕ рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рдХрдо рдЕрдВрддрд░ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рд╣реА рдХрд╛рдо рдХрд░реЗрдВред

await? рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ рдЬреЛ рд╕рдВрднрд╡рддрдГ await 90% + рдЙрдкрдпреЛрдЧреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛ред рд╡рд╛рдпрджрд╛ рдХрд╛ рдкреВрд░рд╛ рдмрд┐рдВрджреБ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ IO рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИ, IO рдЧрд┐рд░рд╛рд╡рдЯ рдпреЛрдЧреНрдп рд╣реИ, async fn 90 async fn рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, io::Result<_> (рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕рдореЗрдВ IO рд╕рдВрд╕реНрдХрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ )ред Result<Result<_, _>, _> рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдирд╕реЗ рд╡рд┐рд╢реЗрд╖-рдХреЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред

рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рдХреЛ рд░рдЪрдирд╛, рд╡рд┐рд╕реНрддрд╛рд░ рдпрд╛ рд╕реАрдЦрдирд╛ рдФрд░ рдЕрдВрддрддрдГ рд╕рд╛рдорд╛рди рдореЗрдВ рдмрджрд▓рдирд╛ рдмреБрд░рд╛ рд╣реИред рдпрд╣ рдПрдХ рдПрдХрд▓ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкреНрд░рдпреЛрдЬреНрдп рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ Result<T, E> where T: Future рд▓рд┐рдП Future рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛? рдЗрд╕ рддрд░рд╣ рдЖрдк await result_of_future рд╕рд╛рде рдЗрд╕реЗ рдЦреЛрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ ? ред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ await result_of_future рдХрд╣реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде (await result_of_future)? ред рдЗрд╕ рддрд░рд╣ рд╣рдореЗрдВ await? рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд╕рд╛рде await рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ (рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреМрди рд╕рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ):

  • ? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рдирд╣реАрдВ, await? рдпрд╛ await??
  • рдореМрдЬреВрджрд╛ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрдЯрд░реЛрдВ рдЬреИрд╕реЗ loop , while , рдФрд░ for , рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реАрдорд╛рдВрдХрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
  • рдШрд░ рдкрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╛рди рдореМрдЬреВрджрд╛ рдЬрдВрдЧ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ
  • рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рд▓рд┐рдЦрддреЗ рд╕рдордп рдкрд░реЗрд╢рд╛рдиреА рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ
  • рд╡рд┐рдЪрд┐рддреНрд░ рдмрдЬрдЯ рд╕реЗ рдЦрд░реНрдЪ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧрд┐рд▓ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

рдЙрджрд╛рд╣рд░рдг:

let p = if y > 0 { op1() } else { op2() };
let p = await { p }?;

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЕрднреА рднреА рдмреЛрдЭрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ await рдФрд░ await? delimiters рдХреЗ рдмрд┐рдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ break рдФрд░ return ред

рдХреНрдпрд╛ рдлреНрдпреВрдЪрд░ рдлреЙрд░ рд░рд┐рдЬрд▓реНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛рдХрд╣рд╛рдБ T: рднрд╡рд┐рд╖реНрдп?

рдЖрдк рдЙрд▓рдЯрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЖрдо рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрдХ рднрд╡рд┐рд╖реНрдп рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХ agaisnt рдЫреБрдкрд╛ рд╣реИ рдпрд╛ рдЕрдиреНрдпрдерд╛ ? рдХреЛ рдХреЗрд╡рд▓ рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдкрд░ рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЖрджрд┐ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Result<Future<Result<T, E2>>, E1> , рддреЛ рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдХреЗ Result<Result<T, E2>, E1> рд╡рд╛рдкрд╕ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Future<Result<T, E1>> , рддреЛ рдЗрд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдмрд╕ Result<T, E1> ред

? рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдЫрд┐рдкрд╛рдирд╛ рдпрд╛ рдЕрд╡рд╢реЛрд╖рд┐рдд рдХрд░рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдЬреЛ рдХреБрдЫ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рд╡рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдУрд╣ред рдореБрдЭреЗ рддрдм рдЖрдкрдХреЛ рдЧрд▓рдд рд╕рдордЭ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЕрднреА рднреА ? рд╕рд╛рде 99% рд╕рдордп рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рдУрд╣ред await? рд╕рд┐рдВрдЯреИрдХреНрд╕ (await future)? рдХрд╛ рдЕрд░реНрде рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛ред

рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реАред рддреЛ рд╣рдо рдмрд╕ рдмрдирд╛рдиреЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ await рдмрд╛рдБрдз рддрдВрдЧ рдореЗрдВ await expr? , рдФрд░ рдЕрдЧрд░ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ рдПрдХ Result<Future<Result<T, E2>>, E1> рддреЛ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдЧрд╛ Result<T, E2> ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реЛрдЧрд╛ рдХрд┐ рд░рд┐рдЬрд▓реНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИред

@ivandardi Result<Future<Item=i32, Error=SomeError>, FutCreationError> рдХреНрдпрд╛ рд╣реИ?

@Pzixel рдиреЛрдЯ, рднрд╡рд┐рд╖реНрдп рдХрд╛ рд╡рд╣ рд░реВрдк рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдПрдХ рд╣реА рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЖрдЙрдЯрдкреБрдЯ (рдЬреЛ рд╢рд╛рдпрдж рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛)ред


@ivandardi рдареАрдХ рд╣реИред рдореБрдЭреЗ рдЕрдм рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЖрдкрдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реЛрдЧреА, рд╡рд╣ рд╣реИ рдХрд┐ рдорд┐рд╕рд╛рд▓ рдХреЗ рддреМрд░ рдкрд░ рдХреБрдЫ рд╡рд┐рдЪрд┐рддреНрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рд╕реАрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рдЪрд▓рди рд╣реИ рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдХреБрдЫ рднреА await рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдЬреЛ рднрд╡рд┐рд╖реНрдп рджреЗрддрд╛ рд╣реИ рд╡рд╣ рдЗрддрдирд╛ рджреБрд░реНрд▓рдн рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЯреЛрдХрд┐рдпреЛ рдХреЛрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЪреАрдиреА / рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

@ivandardi Result<Future<Item=i32, Error=SomeError>, FutCreationError> рдХреНрдпрд╛ рд╣реИ?

рдЦреИрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ Future рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗрд╡рд▓ Output рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд╣реИред


@mehcode рдЦреИрд░, рдпрд╣ рдЙрди рдХреБрдЫ рдЪрд┐рдВрддрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд▓рд╛рдИ рдЧрдИ рдереАрдВ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ред рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдореЗрдВ рднреА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ "рд╕реНрдкрд╖реНрдЯ рд╡рд░реАрдпрддрд╛" рдФрд░ "рдЙрдкрдпреЛрдЧреА рд╡рд░реАрдпрддрд╛" рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рд░реНрдл рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдЧрд╛ред

рдЦреИрд░, рдореИрдВ рдорд╛рди рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ Future trait рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реИред

рдХреНрдпреЛрдВ рдирд╣реАрдВ?

fn probably_get_future(val: u32) -> Result<impl Future<Item=i32, Error=u32>, &'static str> {
    match val {
        0 => Ok(ok(15)),
        1 => Ok(err(100500)),
        _ => Err("Coulnd't create a future"),
    }
}

@Pzixel https://doc.rust-lang.org/std/future/trait.Future.html рджреЗрдЦреЗрдВ

рдЖрдк рдкреБрд░рд╛рдиреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ futures рдХреНрд░реЗрдЯ рдореЗрдВ рдереАред

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = (yield self.request(url, Method::GET, None, true)))?;
    let user = (yield user.res.json::<UserResponse>())?;
    let user = user.user.into();
    Ok(user)
}

рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рд╕рддрд░реНрдХ рд╣реЛрдиреЗ рдкрд░ рдХреЛрдИ рдордЬрдмреВрдд рд▓рд╛рдн рд╣реИ:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = (*self.request(url, Method::GET, None, true))?;
    let user = (*user.res.json::<UserResponse>())?;
    let user = user.user.into();
    Ok(user)
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рджрд┐рдЦрддрд╛ рд╣реИ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдмреЗрдорд╛рдиреА рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдб рдХреЛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рджреВрд░реА рдкрд░ рджрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред


рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдбреЙрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ ( рдкреНрд░реА-рдЖрд░рдПрдлрд╕реА ) рдХреЗ рд╕рд╛рде рд╕рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдХреЛрдк рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.[*request(url, Method::GET, None, true)]?;
    let user = user.res.[*json::<UserResponse>()]?;
    let user = user.user.into();
    Ok(user)
}

рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рдирд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.[*request(url, Method::GET, None, true)]?
        .res.[*json::<UserResponse>()]?
        .user
        .into();
    Ok(user)
}

рдФрд░ рдЬрд╛рд╣рд┐рд░ рд╣реИ, * @ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░реЗрдВ рдЬреЛ рдпрд╣рд╛рдВ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:

async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = (@self.request(url, Method::GET, None, true))?;
    let user = (@user.res.json::<UserResponse>())?;
    let user = user.user.into();
    Ok(user)
}
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.[@request(url, Method::GET, None, true)]?;
    let user = user.res.[<strong i="27">@json</strong>::<UserResponse>()]?;
    let user = user.user.into();
    Ok(user)
}
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.[@request(url, Method::GET, None, true)]?
        .res.[<strong i="30">@json</strong>::<UserResponse>()]?
        .user
        .into();
    Ok(user)
}

рдореБрдЭреЗ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдкрд╕рдВрдж рд╣реИ рдХрд┐ @ await @ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛ рдХреЗ LHS рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ ? Result<User> рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬреЛ RHS рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рд╕рдорд╛рд░реЛрд╣ рдХреА рдШреЛрд╖рдгрд╛ред рдпрд╣ @ ? рд╕рд╛рде рдмреЗрд╣рдж рд╕рдВрдЧрдд рдмрдирд╛рддрд╛ рд╣реИред


рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдмреНрд░реЗрд╕рд┐рдЬрд╝ рд╕рд┐рд░реНрдл рдПрдХ рдирд╣реАрдВ рд╣реИрдВ

@mehcode рд╣рд╛рдВ, рдореБрдЭреЗ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рд╣реБрдЖ рдХрд┐ рдЕрдм рд╡рд╛рдпрджрд╛ рдореЗрдВ Error рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рдВрджреБ рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИ: рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ funtion рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдкрд░рд┐рдгрд╛рдо рдпрд╛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рд╣рд╛рдБ! рд╕реЗрдВрдЯреНрд░рд┐рд▓ рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рд┐рдЧрд┐рд▓ рдмрд╣реБрдд рдХрд╕рд╛ рд╣реБрдЖ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рд╕рд┐рдЧрд▓реНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛ рдпрджрд┐ рдХреЛрдИ рдПрдХ рд░реЗрдЧреАрдХреНрд╕ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рднреА рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдХреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдбреЙрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрд╣реБрдд рдЧрд╣рд░рд╛рдИ рд╕реЗ рд╕рдордЭрд╛рдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ рд╢рдмреНрджрд╛рд░реНрде рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдореИрдВ рдЙрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЕрд░реНрде рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддрд╛ред


рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рдВрджреБ рдЕрднреА рднреА рдорд╛рдиреНрдп рд╣реИ: рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ funtion рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрднрд╡рддрдГ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдкрд░рд┐рдгрд╛рдо рдпрд╛ рддреНрд░реБрдЯрд┐ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ Future<Item=Result<T, E>> , рд╣реИ рдирд╛? рдЦреИрд░, рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдмрд╕ ... рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдирд┐рдкрдЯреЗрдВ,

рдЬреИрд╕реЗ, рдорд╛рди рд▓реЗрдВ рдХрд┐ foo Future<Item=Result<T, E>> рдЯрд╛рдЗрдк рдХрд╛ рд╣реИред рддрдм await foo Result<T, E> рдФрд░ рдЖрдк рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

await foo?;
await foo.unwrap();
match await foo { ... }
await foo.and_then(|x| x.bar())

@melodicstream

рддреЛ рдЖрдкрдХрд╛ рдлреНрдпреВрдЪрд░ рд╣реЛрдЧрд╛>, рд╕рд╣реА рд╣реИ? рдЦреИрд░, рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдмрд╕ ... рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдирд┐рдкрдЯреЗрдВ,

рдирд╣реАрдВ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ Result<Future<Item=Result<T, E>>, OtherE>

рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЖрдк рдмрд╕ рдХрд░рддреЗ рд╣реИрдВ

let bar = foo()? await?.bar();

@melodicstream рдореИрдВрдиреЗ рдЕрдкрдиреА рдкреЛрд╕реНрдЯ рдЕрдкрдбреЗрдЯ рдХреА рдФрд░ рдЙрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-RFC рд╕реЗ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рд╛

рдУрд╣ рдбрд┐рдпрд░ ... рдореИрдВрдиреЗ рддреАрд╕рд░реА рдмрд╛рд░ рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ ...

рдПрдХрдорд╛рддреНрд░ рд╕реБрд╕рдВрдЧрдд рднрд╛рд╡рдирд╛ рдореЗрд░реА рд╕рднреА рднрд┐рдиреНрдирддрд╛рдУрдВ рдореЗрдВ .await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рдВрдХреЗрддрди рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдирд╛рдкрд╕рдВрджрдЧреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ await рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░реВрдБрдЧрд╛, рдЬреЛ рдХрд┐ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде Future рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛ред "рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐" рдПрдХ рдЖрдИрдбреАрдИ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдЕрдЧрд░ рдпрд╣ рд╕реНрдерд┐рд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрднреА рднреА рдореЗрд░реЗ рд▓рд┐рдП "рд╕рд╣реА" рдорд╣рд╕реВрд╕ рдХрд░реЗрдЧрд╛ред

рдореИрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╕реБрдкрд░ рдмреБрдирд┐рдпрд╛рджреА await рдЙрдкрд╕рд░реНрдЧ рдЕрдВрдХрди рдХрд┐рд╕реА рднреА рдЕрдирд┐рд╡рд╛рд░реНрдп рдХреЛрд╖реНрдардХ рдХреЗ рдмрд┐рдирд╛, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреА рд╡рдЬрд╣ рд╕реЗ KISS рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХрд░ рд░рд╣реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдмрд╣реБрдд рд▓рд╛рдпрдХ рд╣реИред

рдбреА-рд╢реБрдЧрд░рд┐рдВрдЧ await? future рд╕реЗ (await future)? рдареАрдХ рдФрд░ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЖрдЧреЗ рдХреБрдЫ рднреА рдФрд░ рдЕрдзрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рд╣реИред рд╕рд░рд▓ let рд░рд┐рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдиреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдореИрдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рд╕рдВрднрд╡рдд: рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рднреА рдЙрд╕ рдорд╛рд░реНрдЧ рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рдКрдВрдЧрд╛ рднрд▓реЗ рд╣реА рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк рд╣реЛред

рдЗрд╕рдХреЗ рд╕рд╛рде рд╣реА рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдХрд╛рдлреА рдЦреБрд╢ рд╣реВрдВ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдлреИрд╕рд▓рд╛ рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВред

рдореИрдВ рдЕрдм рдЖрдЧреЗ рдХреЗ рд╢реЛрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ рдФрд░ рдЕрдВрддрд┐рдо рдлреИрд╕рд▓реЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реВрдВрдЧрд╛ (рд╕рдЬрд╛ рдХрд╛ рдЗрд░рд╛рджрд╛)ред

... рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛ ...

@Pzixel foo рдкреНрд░рдХрд╛рд░ Result<Future<Item=Result<T, E1>>, E2> , рддреЛ await foo Result<Result<T, E1>, E2> рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рдЖрдк рддрджрдиреБрд╕рд╛рд░ рдЙрд╕ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВред

await foo?;
await foo.and_then(|x| x.and_then(|y| y.bar()));
await foo.unwrap().unwrap();

@melodicstream рдирд╣реАрдВ, рдпрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЖрдк Result, рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЖрдк Future. So you have to do рдлреВ () рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? to unwrap рднрд╡рд┐рд╖реНрдп from рдкрд░рд┐рдгрд╛рдо , then do to get a result, then again рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ? `рднрд╡рд┐рд╖реНрдп рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдЙрдкрд╕рд░реНрдЧ рддрд░реАрдХреЗ рд╕реЗ рдпрд╣ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ foo? await? , рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред

рддреЛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рдПрдХ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

(await foo.unwrap()).unwrap()

рд╣рд╛рд▓рд╛рдБрдХрд┐, @ рд╣рдХреНрд╕реА рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд╣рдо рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╢рд╛рдпрдж рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдпрд╣ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдореВрд▓ async/await рдЕрдкрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдбрдмреЗрд╕ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред

@Pzixel рдЗрд╕реАрд▓рд┐рдП рдореИрдВрдиреЗ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ Result<Future<Item=T>, E> рдкрд░ Future рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдореИрдВ рдЬреЛ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ, рд╡рд╣ рд╣реЛрдиреЗ рд▓рдЧреЗрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ await foo?? рдХреЗ рд▓рд┐рдП Result<Future<Output=Result<T, E1>>, E2> , рдореИрдВ рдХреЗ рд╕рд╛рде рдЦреБрд╢ рдирд╣реАрдВ рд╣реВрдБ await foo.unwrap().unwrap() ред рдореЗрд░реЗ рдкрд╣рд▓реЗ рдорд╕реНрддрд┐рд╖реНрдХ рдореЙрдбрд▓ рдореЗрдВ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

(await foo.unwrap()).unwrap()

рдирд╣реАрдВ рддреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреНрд░рдорд┐рдд рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛ред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ ? рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдФрд░ unwrap рдПрдХ рд╡рд┐рдзрд┐ рд╣реИред рд╕рдВрдХрд▓рдХ . рдЬреИрд╕реЗ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЦрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХрд╛ рд╣реИ, рддреЛ рдореИрдВ рдпрд╣ рдорд╛рдиреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рдмрд╛рдПрдВ рд╣рд╛рде рдореЗрдВ рдирд┐рдХрдЯрддрдо рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдХреЗрд╡рд▓ред

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕, foo.unwrap() await.unwrap() , рдореЗрд░реЗ рд▓рд┐рдП рднреА рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ await рдХреЗрд╡рд▓ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ, рдПрдХ рд╡рд╕реНрддреБ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ unwrap() рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╢реИрд▓реА рдХрд╛ рдореИрдХреНрд░реЛ рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣рдо рдХреЗрд╡рд▓ рдореМрдЬреВрджрд╛ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЙрдкрд╕рд░реНрдЧ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдореИрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд░реВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ:

fn foo(n: u32) -> impl Future<Item = u32> {
   if n == 0 {
      panic!("Can't be zero");
   } else {
      do_async_call().map(|_| 10)
   }
}

рддрдерд╛

async fn foo(n: u32) -> u32 {
   if n == 0 {
      panic!("Can't be zero");
   } else {
      await!(do_async_call());
      10
   }
}

рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рднрд╡рд┐рд╖реНрдп рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдШрдмрд░рд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рджреВрд╕рд░рд╛ рд╡реНрдпрдХреНрддрд┐ рдкрд╣рд▓реЗ рдЪреБрдирд╛рд╡ рдореЗрдВ рдШрдмрд░рд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЗрд╕реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

fn foo(n: u32) -> impl Future<Item = u32> {
   if n == 0 {
      panic!("Can't be zero");
   } else {
      async {
         await!(do_async_call());
         10 
      }
   }
}

рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдХрдо рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

@Pzixel : рдпрд╣ рдПрдХ рдирд┐рд░реНрдгрдп рд╣реИ рдЬрд┐рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред async fn рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд▓рд╕реА рд╣реИрдВ рдФрд░ рдорддрджрд╛рди рддрдХ рд╕рднреА рдкрд░ рдирд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдкреВрд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЗрдирдкреБрдЯ рдЬреАрд╡рди рдХрд╛рд▓ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдПрдХ рд░реИрдкрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ impl Future рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рдЖрд╕реНрдердЧрд┐рдд рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП async рдмреНрд▓реЙрдХ (рдпрд╛ fn) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмреАрдЪ рдореЗрдВ рдЖрд╡рдВрдЯрди рдХреЗ рдмрд┐рдирд╛ Future рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░реЛрдВ рдХреЛ рдвреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _required_ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдирд┐рд░реНрдгрдп рд╣реИ рдФрд░ рдХреНрдпреЛрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ) рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

рд╕реА # рдбреЗрд╡рд▓рдкрд░ рдпрд╣рд╛рдВ, рдФрд░ рдореИрдВ рдЙрдкрд╕рд░реНрдЧ рд╢реИрд▓реА рдХреА рд╡рдХрд╛рд▓рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдУред

рдПрдХ рдмрд┐рдВрджреБ ( read().await рдпрд╛ read().await() ) рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрд╣реБрдд рднреНрд░рд╛рдордХ рд╣реИ рдФрд░ рдПрдХ рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдпрд╛ рд╡рд┐рдзрд┐ рдордВрдЧрд▓рд╛рдЪрд░рдг рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рдФрд░ await рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рднреА рдирд╣реАрдВ рд╣реИ; рдпрд╣ рдПрдХ рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХ рдЕрдиреБрднрд╡реА Rustacean рдирд╣реАрдВ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдореИрдВ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп .something рдорд╛рдорд▓реЛрдВ рд╕реЗ рдЕрд╡рдЧрдд рдирд╣реАрдВ рд╣реВрдВ рдЬреЛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ рдЬрд┐рд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рдирд┐рдХрдЯрддрдо рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ ? рдкреНрд░рддреНрдпрдп рд╣реИред

рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП C # рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдорд╛рдирдХ рдЙрдкрд╕рд░реНрдЧ-рдП-рдП-рд╕реНрдкреЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ ( await foo() ) рдХреЗ рдХрд╛рд░рдг рдореБрдЭреЗ рдЙрд╕ рд╕рдордп рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реБрдИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рдиреЗрд╕реНрдЯреЗрдб await рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╣ рдкрд░реЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЬреЛ рд╕рднреА рд╕реНрдкрд╖реНрдЯ рдСрдкрд░реЗрдЯрд░ рдкреВрд░реНрд╡рддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЧреНрд░реЙрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬреИрд╕реЗред

`` `рдЧ #
var рд╕реВрдЪреА = (GetListAsync () рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ)ред ToList ();


`await` is essentially a unary operator, so treating it as such makes sense.

In C# 8.0, currently in preview, we have async enumerables (iterators), which comes with an `IAsyncEnumerable<T>` interface and `await foreach (var x in QueryAsync())` syntax. The lack of async enumerables has been an issue since async was added in C# 5; for example, we have ORMs that return a `Task<IEnumerable>` which is only half asynchronous; we have to block on calls to `MoveNext()`. Having proper async enumerables is a big deal.

If a postfix `await` is used and similar async iterator support is added to Rust, that would look something like

```rust
for val in v_async_iter {
    println!("Got: {}", val);
} await // or .await or .await()

рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░рдВрддрд░рддрд╛ рднреА рд╡рдЬрди рджреЗрдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ await рдХреАрд╡рд░реНрдб C #, VB.NET, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИ, рдФрд░ рдпрд╣ C ++ рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИред рдпрд╣ рджреБрдирд┐рдпрд╛ рдХреА рд╢реАрд░реНрд╖ рд╕рд╛рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдкрд╛рдВрдЪ рд╣реИ; C рдФрд░ Java рдореЗрдВ рдЕрднреА рддрдХ async / рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рд╡реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЧрдПред

рдЬрдм рддрдХ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИрдВ, рдЕрдЧрд░ рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рджреЛрдиреЛрдВ рдлрд╛рдпрджреЗ рдФрд░ рд╕рдордЭреМрддреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдХрд┐ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рдХрд╣рд╛ рдЬрд╛рдирд╛ рд╣реИ " рдорд╛рдирдХ "рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред

@markrlele рдореИрдВ C # dev рднреА рд╣реВрдВ, 2013 рд╕реЗ async/await рд▓рд┐рдЦрдирд╛ред рдФрд░ рдореБрдЭреЗ рдЙрдкрд╕рд░реНрдЧ рднреА рдкрд╕рдВрдж рд╣реИред рд▓реЗрдХрд┐рди рдЬрдВрдЧ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред

рдЖрдк рд╢рд╛рдпрдж рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ (await Foo()).ToList() рдПрдХ рджреБрд░реНрд▓рдн рдорд╛рдорд▓рд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рд╕рд┐рд░реНрдл await Foo() рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдпрдж Foo рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЬрдВрдЧ рджреВрд╕рд░реА рдмрд╛рдд рд╣реИред рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдБ ? рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИред C # async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдЗрд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБрдУрдВ рдФрд░ рдЗрддрдиреЗ рдкрд░ рдлреЗрдВрдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЬрдВрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк C # рдореЗрдВ await рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛

var response = (await client.GetAsync("www.google.com")).HandleException();
var json =  (await response.ReadAsStreamAsync()).HandleException();
var somethingElse = (await DoMoreAsyncStuff(json)).HandleException();
...

рдЗрди рд╕рднреА рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдердХрд╛рдК рд╣реИред

OTOH рдЖрдкрдХреЗ рдкрд╛рд╕ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╣реИ

var response = client.GetAsync("www.google.com") await.HandleException();
var json =  response.ReadAsStreamAsync() await.HandleException();
var somethingElse = DoMoreAsyncStuff(json) await.HandleException();
...

рдпрд╛ рдЬрдВрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ

let response = client.get_async("www.google.com") await?;
let json =  response.read_as_Stream_async() await?;
let somethingElse = do_more_async_stuff(json) await?;
...

рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЕрдиреНрдп рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдорд░ рд╣реЛрдВрдЧреЗ, рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд ? рдФрд░ await , рдЖрдЗрдП рдЗрд╕реЗ @ рдирд╛рдо рджреЗрдВред рдпрджрд┐ рд╣рдо await? рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реБрд╕рдВрдЧрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП await@ , @? , await@? ... рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред


рдореБрдЭреЗ рдЙрдкрд╕рд░реНрдЧ await рднреА рдкрд╕рдВрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд░реБрд╕реНрдд рдЗрд╕рдХреЗ рд╕рд╛рде рдареАрдХ рд╣реИред рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рдпрдо рдареАрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдРрд╕рд╛ рдмреЛрдЭ рд╣реИ рдЬреЛ рд╢рд╛рдпрдж рдЖрд╕рд╛рди рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджрд╛ рдзрд╛рдЧрд╛ (рдЗрд╕ рдкрд░ рд▓рдЧрднрдЧ 3 рдШрдВрдЯреЗ рдмрд┐рддрд╛рдП) рд╕рд╣рд┐рдд рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝реЗрдВред рдФрд░ рдореЗрд░рд╛ рд╕рд╛рд░рд╛рдВрд╢ рдпрд╣ рд╣реИ: рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ @ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЕрд╡рд┐рдХрд╕рд┐рдд рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ (рдкрдХреНрд╖рдкрд╛рддреА) рд░рд╛рдп рд╣реИрдВ, рдФрд░ рдиреАрдЪреЗ рдЙрдирдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рд╣реИ:


async-await рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ @ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реЛрдЧрд╛

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдЖрдзрд╛ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рди async fn рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ await рд╕рд╛рде рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред

рдЬрдВрдЧ рдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рд┐рдЧрд▓реНрд╕ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдЕрднреА рддрдХ рдПрдХ рдФрд░ рд╕реБрдкрд░рдЧрд┐рд▓ рдХрд╛ рдкрд░рд┐рдЪрдп рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП

рд▓реЗрдХрд┐рди рд╕рд┐рдЧрд▓реНрд╕ рддрдм рддрдХ рдареАрдХ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд╡реЗ рдкрдардиреАрдп рдФрд░ рдЕрдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдФрд░ рдПрдХ рдирдП рд╕рддрд░реНрдХ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЪреАрдЬреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдмрджрддрд░ рдмрдирд╛ рджреЗрдЧрд╛ред рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореЗрдВ рдЙрдкрд╕рд░реНрдЧ @ рдХрд┐рд╕реА рднреА рдЙрдкрд╕рд░реНрдЧ / рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИред

?!@# рдЬреИрд╕реЗ рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдореБрдЭреЗ рдкрд░реНрд▓ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо @? рдЕрд▓рд╛рд╡рд╛ рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ рдЕрдиреНрдп рд╕рдВрдпреЛрдЬрди рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ IMO рдмрд╣реБрдд рд╕реАрдзрд╛ рдФрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ impl Try<impl Future<T>> , impl Future<impl Try<impl Try<T>>> , рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ impl Future<T> рд░реВрдк рдореЗрдВ, рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдг ITT рдкрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ 10% usages рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрди 10% рдореЗрдВ рд╕реЗ 90% рдореЗрдВ рд╕рддрд░реНрдХрддрд╛ рд╕рдореВрд╣ рдПрдХ рдХреЛрдб рдЧрдВрдз рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрдм рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдЕрдкрдирд╛ рдПрдкреАрдЖрдИ рдареАрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд╛рдзреНрдпрдХрд╛рд░реА рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ @ рдЗрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдиреЛрдЯрд┐рд╕!

рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ async-await рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реИред рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХ рдШреБрд╕рдкреИрда await рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдореВрд▓ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддрд╛ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдЬ рдмрд┐рдВрджреБрдУрдВ рдХреА рдШрдЯрдирд╛ рдХреЛрдб рдХреЛ рдмреНрд▓реЛрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рд╡реЗ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛрдВред рдмреЗрд╢рдХ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рджреГрд╖реНрдЯрд┐ рд╕реЗ рджреЗрдЦрддреЗ рд╣реЛрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ @ sigil рдЙрд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд╣реЛрдЧрд╛ рдФрд░ рд╕рд╛рде рд╣реА await рдмрд┐рдирд╛ рдХреЛрдб рдХреЛ рдмреНрд▓реЛрдЯ рдХрд┐рдПред

рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдЗрддрдиреА рдмрд╛рд░ рдФрд░ рдЗрддрдиреА рдЬреЛрд░ рд╕реЗ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореНрдпреВрдЯреЗрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: mut рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдЖрдЧреЗ рд╣рдо рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рд╛рджреГрд╢реНрдп рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ unsafe рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдЖрдЧреЗ рд╣рдо рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрджрд┐ рдФрд░ рдлрд┐рд░ рднреА рдПрдХ рдЕрдиреНрдп рд╕рд╛рджреГрд╢реНрдп рдмрдмрд▓ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ impl Try рд░рд┐рдЯрд░реНрди рдпрд╛ рдЖрдЧрд╛рдореА try рдмреНрд▓реЙрдХ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ рдФрд░ рдЖрдЧреЗ рд╣рдо ? рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЧреЛрдкрдиреАрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ, рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ async рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕рдВрднрд╡рдд: рдЯрд┐рдХрд╛рдК рд╕рдВрдЪрд╛рд▓рди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдЧреЗ рд╣рдо @ рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рдЕрдЬреАрдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ await рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЯрд╛рдЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛

рдпрджрд┐ рдЖрдкрдиреЗ & рдХреЛ "Ref" рдФрд░ ! рдХреЛ "рдирд╣реАрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк @ рдкрдврд╝рддреЗ рд╣реИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рддрд░реНрдХ рд╣реИ рдкреНрд░рддреАрдХред рдпрд╣ рднреА рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХрд┐рддрдиреА рддреЗрдЬреА рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдкрдврд╝рдирд╛ рд╣рдореЗрд╢рд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ @ рдХреЛ рдЕрдкрдирд╛рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдореЗрдВ @ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ! рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, & рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдзрд╛рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ && рдСрдкрд░реЗрдЯрд░ рдореЗрдВ, | рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ, рдкреИрдЯрд░реНрди рдореЗрдВ, рдФрд░ || рдСрдкрд░реЗрдЯрд░ рдореЗрдВ, + / - рдЙрдкрд╕рд░реНрдЧ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ . рдХрд╛ рдЕрднреА рддрдХ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдзрд┐рдХ рдЕрд▓рдЧ рд╕рдВрджрд░реНрднреЛрдВред рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рднреА рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдФрд░ рдХреБрдЫ рднреА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИред

рдкрдХрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛

рдпрджрд┐ рдЖрдк рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреИрдЯрд░реНрди рд╣реИрдВ рддреЛ rg async рдЬреНрдпрд╛рджрд╛ рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рднреА рдЙрдкрдЬ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдвреВрдВрдврдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк rg "@\s*[;.?|%^&*-+)}\]]" рддрд░рд╣ рдХреБрдЫ рд▓рд┐рдЦ рдкрд╛рдПрдВрдЧреЗ рдЬреЛ рд╕реАрдзрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдХрд┐рддрдиреА рдмрд╛рд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, IMO рдпрд╣ рд░реЗрдЧреЗрдХреНрд╕ рдмрд┐рд▓реНрдХреБрд▓ рдареАрдХ рд╣реИред

@ рд╢реБрд░реБрдЖрддреА рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ Google рдХреЗ рд▓рд┐рдП рдХрдард┐рди рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ ? рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд▓рдЧрд╛рддрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЙрдкрд╕рд░реНрдЧ / рдЙрдкрд╕рд░реНрдЧ await рдЕрдиреНрдп рдЬрдВрдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рд╣рд╛рдиреБрднреВрддрд┐ / рд╕реНрд╡рд░реВрдкрдг / рдЕрд░реНрде рдХреЗ рд╕рд╛рде рд╕рд┐рд░рджрд░реНрдж рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ await рдХреБрдЫ рд╕реНрд╡-рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдПрдХрд▓ рдХреАрд╡рд░реНрдб рд╕рдВрдкреВрд░реНрдг рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдХрд┐рддрд╛рдм рд╕реЗ рд╕реАрдЦреЗрдВрдЧреЗред рдФрд░ рдЬрдВрдЧ рдХрднреА рднреА рдПрдХ рднрд╛рд╖рд╛ рдирд╣реАрдВ рдереА, рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рджрд╛ рдкрд╛рда рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИред рдЕрдЧрд░ рдХреЛрдИ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ @ рдкреНрд░рддреАрдХ рдХрд╛ рдорддрд▓рдм рд╣реИ (рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕рдВрдШ рднреА рд╣реИрдВ) - рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП googling рд╕рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ rust @ symbol рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдореЗрдВ @ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА await рдХреАрд╡рд░реНрдб рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рд╡реИрд╕реЗ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдХреНрдпреЛрдВ? рдЕрдкреНрд░рдпреБрдХреНрдд рдЖрд░рдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдХрд╛ рд╣реЛрдирд╛ рдареАрдХ рд╣реИ рдЬрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рд╕реБрд╡рд┐рдзрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдИ рд╡рд╛рджрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдмрд┐рд▓рдХреБрд▓ await рдХреАрд╡рд░реНрдб рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдпрд╣ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд╢реНрд╡ рдХреЛрдб рдореЗрдВ рдмрд╣реБрдд рдЖрдо рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рддрдХ рдЖрд░рдХреНрд╖рд┐рдд рд░рд╣рдиреЗ рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЦреЛрдПрдВрдЧреЗред

? рдПрдХ рдЧрд▓рддреА рдереА рдФрд░ @ рдПрдХ рджреВрд╕рд░реА рдЧрд▓рддреА рд╣реЛрдЧреА

рд╕рдВрднрд╡рддрдГ рдЖрдк рдЕрдзрд┐рдХ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдЖрдк рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдЖрдкрдХреЛ рдерд┐рдирд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЕрдзрд┐рдХ рд▓реЛрдЧ рдЕрдзрд┐рдХ рдиреЗрддреНрд░рд╣реАрди рд╕реЛрдЪрддреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдШреБрд╕рдкреИрда рд╢рдмреНрдж рдХрдард┐рди рд╣реИрдВ рдмрдЬрд╛рдп рдХрд╛рдо рдХрд░рдирд╛ред рд╕рдВрднрд╡рдд: рдпрд╣рд╛рдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ await!() рдореИрдХреНрд░реЛ рд╕рд╛рде рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ try!() ? рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЖрдк @ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ @ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╕рд╣рдЬ рд╣реИрдВред

^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ рдХреНрдпрд╛ рдЖрдкрдиреЗ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ?

рдореЗрд░реЗ рдкрд╛рд╕ @ I60R рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд░рд╣рд╕реНрдпреЛрджреНрдШрд╛рдЯрди рдерд╛, рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕

рд╣рдорд╛рд░рд╛ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдСрдкрд░реЗрд╢рди await ред рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд┐ await C # рдФрд░ JavaScript рдореЗрдВ, async / await рдкрд░рд┐рдЪрд┐рдд рдХреЗ рджреЛ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, Task (C #) / Promise (JS) рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп рдХреЛ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред C # рдореЗрдВ рдпрд╣ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╕рдВрджрд░реНрдн рд╣реИ, JS рдореЗрдВ рдпрд╣ рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдбреЗрдб рд╣реИред

рд▓реЗрдХрд┐рди рдЗрди рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, await foo рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкрд╛рд░реНрдХ рдХрд░реЗрдВ рдФрд░ рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ foo , рдФрд░ рдЗрд╕ рдмреАрдЪ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд╛рд░реНрдп "ред

рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдк рдЕрд▓рдЧ рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░рд╡рд╛рдж рдорд┐рд▓ await рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рд░реЛрдВ рдХрдИ Task / Promise s (рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдПрдХ рдзрд╛рдЧрд╛ рдирд┐рд╖реНрдкрд╛рджрдХреЛрдВ рдкрд░): рдХреЗ рд╢рдмреНрджреЛрдВ await Aren "t" рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдЪрд▓рд╛рдПрдВ, рдмрд▓реНрдХрд┐ "рдХреБрдЫ рдХрд╛рд░реНрдп рдХреЛ рдЪрд▓рд╛рдПрдВ" рдЬрдм рддрдХ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдорд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдП рдФрд░ рд╣рдо рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВред

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд▓рд╕реА рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдпрд╛ рдЙрддреНрд╕реБрдХ рдЬрдм рддрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рднрд╛рд░реА рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╕рдордХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд▓рд╕реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдпрджрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рднреНрд░рдо рд╣реИред рдореИрдВ await рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рджреЗрддрд╛ рд╣реВрдБ рдЬреЛ рд╣рдореЗрдВ рдпрд╣рд╛рдБ рдХреЛрдИ рдПрд╣рд╕рд╛рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╣рдорд╛рд░рд╛ await!(foo) рдЗрд╕ рдкреНрд░рдХрд╛рд░ await foo "рдкрд╛рд░рдВрдкрд░рд┐рдХ" C # рдпрд╛ JS рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рд╣реИред рддреЛ рдХреНрдпрд╛ рднрд╛рд╖рд╛ рд╣рдорд╛рд░реЗ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ? рдореБрдЭреЗ рдЕрдм рджреГрдврд╝рддрд╛ рд╕реЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ ( @matklad рд╕рд╣реА рд╣реИ рдЕрдЧрд░ рдореБрдЭреЗ рд╡рд┐рд╡рд░рдг рдЧрд▓рдд рдорд┐рд▓рд╛ рд╣реИ) рдХреЛрдЯрд▓рд┐рди рдХреЗ suspend fun ред рдпрд╛ рдЬреИрд╕рд╛ рдХрд┐ рд░реБрд╕реНрдЯ-рдЖрд╕рдиреНрди рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, "рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрд╕рд┐рдВрдХреНрд╢, рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛"ред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдореАрдХреНрд╖рд╛: рдХреЛрдЯрд▓рд┐рди рдореЗрдВ, рдЖрдк рдХреЗрд╡рд▓ suspend рд╕рдВрджрд░реНрдн рдореЗрдВ suspend fun рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рддреБрд░рдВрдд рдлрдВрдХреНрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдмрд╛рд▓ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреИрдХреНрдб рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдмрдЪреНрдЪреЗ рдХреЛ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ suspend fun рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рдЖрдк async рдмрдВрдж рдХреЗ рдмрд░рд╛рдмрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рд╕рд╛рде рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рдЧрдардмрдВрдзрди suspend fun рдХрдИ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Combinator suspend рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдмрдВрджред (рдпрд╣ рдЙрд╕ рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╢рд╛рдорд┐рд▓ рд╣реИред) рдпрджрд┐ рдЖрдк рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ suspend fun рдХрд╛ рдПрдХ рдмрдЪреНрдЪрд╛ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЙрд╕ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рд╖реНрдкрд╛рджрдХ рдкрд░ рдбрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдПрдХ .await() suspend fun рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП

рдпрд╣ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд░рд╕реНрдЯ рдХреЗ Future рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╡рд░реНрдгрд┐рдд рд╣реИ, рдмрд╣реБрдд рдкрд░рд┐рдЪрд┐рдд рд▓рдЧрддреА рд╣реИред

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдмрддрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреНрдпреЛрдВ рд░реБрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдФрд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЦрдбрд╝реА рд╣реЛрддреА рд╣реИред рд╣рдореЗрдВ рдЖрд▓рд╕реА рд╡рд╛рдпрджрд╛ рдХреЗ рд╕рд╛рде async fn() -> T рдФрд░ fn() -> Future<T> рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╕рдорддреБрд▓реНрдп рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ "рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдп рдХрд░реЗрдВ" рдкреИрдЯрд░реНрди рд╕рдВрднрд╡ рд╣реЛ (рдЖрдЬреАрд╡рди рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрд╢реНрдХрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ)ред рд╣рдореЗрдВ рдЖрд▓рд╕реА рд╡рд╛рдпрджрд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╣рдо рдкрд┐рдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣рд░ рдПрдХ рдХреЗ рдмреАрдЪ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреА рдПрдХ рдкрд░рдд рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рдпрджрд╛ рдвреЗрд░ рдХрд░ рд╕рдХреЗрдВред

рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ foo@ (рдпрд╛ рдХреБрдЫ рдФрд░ рд╕рддрд░реНрдХ) рдХреЗ "рд╕реНрдкрд╖реНрдЯ рд▓реЗрдХрд┐рди рд╢рд╛рдВрдд" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЬрд┐рддрдирд╛ рдореИрдВ рдпрд╣рд╛рдБ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдШреГрдгрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, @ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ async рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, ? try рдореЗрдВ рдореЛрдиреИрдбрд┐рдХ рдСрдкрд░реЗрд╢рди рд╣реИ

рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ ? рдЫрд┐рдбрд╝рдХрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд░рд╛рдп рд╣реИ, рдЬрдм рдЖрдк Result рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╢рд┐рдХрд╛рдпрдд рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рдФрд░ рдПрдХ рдЕрд░реНрде рдореЗрдВ, рддреБрдо рдпрд╣ рдХрд░ рд░рд╣реЗ рд╣реЛред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рдХреА рд╕реНрдерд╛рдиреАрдп рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд╣рдорд╛рд░реЗ рдЖрджрд░реНрд╢ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдСрдкрд░реЗрд╢рди рдореЛрдирдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

(рдпрджрд┐ рдореБрдЭреЗ рдЧрд▓рдд рд╡рд┐рд╡рд░рдг рдорд┐рд▓рд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХреЛрдИ рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдореЗрд░реА рдмрд╛рдд рдЕрднреА рднреА рдХрд╛рдпрдо рд╣реИред)

рдпрджрд┐ @ рдПрдХ рд╣реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдпрд╣ рдХреБрдЫ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ await рдЙрдирдХреЗ рдЦрддреНрдо рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдпрд╣ рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрд┐рд╕реЗ рдХрд┐рд╕реА рдФрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдВрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░рд╛рдЬреНрдп рдорд╢реАрди рдореЗрдВ рдмрдирд╛рдиреЗ рд╕реЗ рд╣реЛ рдпрд╛ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рдЦрдирд╛ред

TL; DR: рдпрджрд┐ рдЖрдк рдЗрд╕ рдорд┐рдиреА рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд╕реЗ рдПрдХ рдЪреАрдЬрд╝ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓реЗрдВ: Rust рдХрд╛ await!() await рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╣реИред рдкрд░рд┐рдгрд╛рдо _similar_ рд╣реИрдВ рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реИрдВред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рд╕реЗ рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдХрдореА рд╣реЛрддреА рд╣реИред

(рдкрд┐рдЫрд▓реА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдПрдХ рднрд╛рд╖рд╛ рдЬреЛ рдЖрд▓рд╕реА рд╕реЗ рдЙрддреНрд╕реБрдХ рд╡рд╛рдпрджрд╛ рдореЗрдВ рдмрджрд▓ рдЧрдИ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ await foo рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ foo рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд╣рдо рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдкрд░рд┐рдгрд╛рдоред)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╕рдордиреНрд╡рд┐рдд рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ @ CAD рдХреЛ рд░рд╕реНрдЯ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдбрд┐рд╕реЙрд░реНрдбрд░ (рд▓рд┐рдВрдХ 24h) рдпрд╛ рдЗрдВрдЯрд░реНрдирд▓ рдпрд╛ рдпреВрдЬрд╝рд░реНрд╕ (@ CAD97) рдкрд░ рдкрд┐рдВрдЧ рдХрд░реЗрдВред рдореИрдВ рдХреБрдЫ рдкреНрд░рддреНрдпрдХреНрд╖ рдЬрд╛рдВрдЪ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рд░рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

EDIT 2: рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЧреАрдерд╣рдм @ рдЖрдХрд╕реНрдорд┐рдХ рджреБрд░реНрдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдХреИрдб; рдореИрдВрдиреЗ @ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдорддрд▓рдм рдирд╣реАрдВ рдерд╛ред

@ I60R

?!@# рдЬреИрд╕реЗ рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рдореБрдЭреЗ рдкрд░реНрд▓ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддреЗ рд╣реИрдВ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо @? рдЕрд▓рд╛рд╡рд╛ рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ рдЕрдиреНрдп рд╕рдВрдпреЛрдЬрди рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ IMO рдмрд╣реБрдд рд╕реАрдзрд╛ рдФрд░ рд╕реБрдВрджрд░ рджрд┐рдЦрддрд╛ рд╣реИ

рдпрд╣ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рддрдХ рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддреЗред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдПрдХ рдФрд░ рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдорд░ рд╣реИ - yield sigil, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░реНрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реЛрдЧреАред

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ @ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ!

рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ async-await рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реИред

await рдЕрдВрдХ рдиреЛрдЯ рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рдПрдХ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред

рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдЗрддрдиреА рдмрд╛рд░ рдФрд░ рдЗрддрдиреА рдЬреЛрд░ рд╕реЗ рдХрд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреГрдкрдпрд╛ рд╕реА # рдЕрдиреБрднрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реЗ рд▓рд┐рдВрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЛрд░ рд╕реЗ рдФрд░ рдЗрд╕ рдмрд╛рд░ рдпрд╣ рдпрд╣ рдХрд╣рдиреЗ рдХреЛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред


рдЕрдиреНрдп рдмрд┐рдВрджреБ рдХрд╛рдлреА рдорд╛рдиреНрдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛ рд╣реИ рд╡реЗ рдЕрдпреЛрдЧреНрдп рдЕрдВрддрд░рд╛рд▓ рд╣реИрдВред

@ CAD97 рдПрдХ C # рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Rust рдореЗрдВ async рдЕрд▓рдЧ рдХреИрд╕реЗ рд╣реИрдВ .. рдЦреИрд░, рдпрд╣ рдЙрддрдирд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдЖрдк рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред IMHO рдЖрдкрдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдПрдХ рдЭреВрдареЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ

рд╣рдорд╛рд░реЗ await!(foo) рдЗрд╕ рдкреНрд░рдХрд╛рд░ "рдкрд╛рд░рдВрдкрд░рд┐рдХ" C # рдпрд╛ JS рддрд░реАрдХреЗ рд╕реЗ await foo рд╣реИред

рдпрд╣ рд╕реА # рджреЗрд╡ рдорди рдореЗрдВ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИред рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╛рдпрджрд╛ рдорддрджрд╛рди рддрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ await рдЕрд░реНрде рд╣реИ "рдореИрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ F рдЪрд░ x рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ"ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрдм рддрдХ рдорддрджрд╛рди рди рд╣реЛ, рддрдм рддрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ C # рджреБрдирд┐рдпрд╛ рдХреЗ рдмрд╛рдж рдПрдХ рд░рд╛рд╣рдд рд╣реИ рддрд╛рдХрд┐ рд▓реЛрдЧ рд╢реБрдХреНрд░ рдордирд╛рдПрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, C # рдореЗрдВ Iterators / Genatos рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ рд╣реИрдВ, рдЬреЛ рдЖрд▓рд╕реА рднреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП C # рднреАрдбрд╝ рдкреВрд░реА рдЪреАрдЬрд╝ рд╕реЗ рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, await рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдХреЗ await younameit% рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреБрд░реНрд▓рдн рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдХреА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

@Pzixel рдпрд╣ рд╕реА # рджреЗрд╡ рдорди рдореЗрдВ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИред рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд╛рдпрджрд╛ рдорддрджрд╛рди рддрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред

рдЬрдм рдЙрддреНрд╕реБрдХ / рдЖрд▓рд╕реА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдЧрдВрднреАрд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ: "рдХреБрдЫ рдкреНрд░реЙрдорд┐рд╕ рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ await рдЙрдиреНрд╣реЗрдВ" рдХрд╛ рдкреИрдЯрд░реНрди рд░рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред

рдпрд╣ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдЖрд╢реНрдЪрд░реНрдп рд╕реЗ рдХреБрдЫ рдЬрдВрдЧ рд╕рджрд╕реНрдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рд╛!

рд░реВрд╕реНрдЯ рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд░рд╛рдХреНрд╖рд╕реА рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХрд░реАрдм рд╣реИ, рдЗрд╕рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ / рд╕реА # рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ:

  • рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ (рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЯрд╛рд╕реНрдХ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛, рдЬреЛ рдХрд┐ рдореЛрдирд╛рдбреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ)ред

  • рдПрдкреАрдЖрдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ (рдкреБрд▓ рдмрдирд╛рдо рдкреБрд╢)ред

  • рдЖрд▓рд╕реА рд╣реЛрдиреЗ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ (рдЬреЛ рдХрд┐ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ)ред

  • рдХрдИ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рд╕рд╛рдзреБрдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ)ред

  • рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП ? рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ (рдЬреЛ рдХрд┐ рдореЛрдирдб рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ)ред

  • рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬреЛ рд░рд╕реНрдЯ рдлреНрдпреВрдЪрд░реНрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рднреА рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреНрдпреВрдЪрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдо рдмрд╛рдд рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдмрд╕ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЖрдо рдирд╣реАрдВ рд╣реИред

рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ C # рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИред

рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ C # рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛ред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЙрди рднрд╛рд╖рд╛рдУрдВ рдиреЗ рд╡реЗ рдирд┐рд░реНрдгрдп рдХреНрдпреЛрдВ рд▓рд┐рдПред

C # рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЯреАрдо рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдиреЗ рд╣рдорд╕реЗ рдмрд╛рдд рдХреА рд╣реИ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдпрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЙрди рдлреИрд╕рд▓реЛрдВ рдХреЛ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдХреНрдпреЛрдВ рдмрдирд╛рдпрд╛ред

рдХреЛрдИ рднреА рдЙрди рднрд╛рд╖рд╛рдУрдВ, рдпрд╛ рдЙрди рдбреЗрдЯрд╛ рдмрд┐рдВрджреБрдУрдВ, рдпрд╛ рдЙрди рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд╕рдВрдЬреНрдЮрд╛рди рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЬрдВрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реА # рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛) рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд▓реЗрдХрд┐рди рдЗрди рджреЛрдиреЛрдВ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, foo foo рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЕрд░реНрде рд╣реИ "рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкрд╛рд░реНрдХ рдХрд░реЗрдВ рдФрд░ рдХрд╛рд░реНрдп foo рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ

рдпрд╣ рд░рд╕реНрдЯ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИред Async рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рд╕рдорд╛рди рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ async fn (рдЬреЛ рднрд╡рд┐рд╖реНрдп рдмрдирд╛рддрд╛ рд╣реИ) рдХрд╣рддреЗ рд╣реИрдВ, рдпрд╣ рдЕрднреА рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреЗрдПрд╕ рдФрд░ рд╕реА # рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реИред

рдЗрд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рднрд╡рд┐рд╖реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛, рдЬреЛ рд╣рд░ рдЬрдЧрд╣ рдХреЗ рд╕рдорд╛рди рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИ: "рдХреБрдЫ рдкреНрд░реЙрдорд┐рд╕ рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ await рдЙрдиреНрд╣реЗрдВ" рдХрд╛ рдкреИрдЯрд░реНрди рд░рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред

рдХреНрдпрд╛ рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВрдиреЗ рдкреЛрд╕реНрдЯ рдкрдврд╝ рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ

let foos = (1..10).map(|x| some_future(x)); // create futures, unlike C#/JS don't actually run anything
let results = await foos.join(); // awaits them

рдмреЗрд╢рдХ, рд╡реЗ рд▓рд╛рдЗрди 2 рддрдХ рдлрд╛рдпрд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдПрдХ рд╡рд╛рдВрдЫрдиреАрдп рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдФрд░ рдореИрдВ рдЕрднреА рднреА рдЖрд╢реНрд╡рд╕реНрдд рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИ рдЬреЛ рдЕрдм await рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рд╡рд┐рд╖рдп рдирд╛рдо рд╣реА рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ await рд╢рдмреНрдж рдпрд╣рд╛рдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдХреЛрдИ рднреА рдЙрди рднрд╛рд╖рд╛рдУрдВ, рдпрд╛ рдЙрди рдбреЗрдЯрд╛ рдмрд┐рдВрджреБрдУрдВ, рдпрд╛ рдЙрди рдорд╛рдорд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд╕рдВрдЬреНрдЮрд╛рди рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдореИрдВ рдмрд╛рд░-рдмрд╛рд░ рдПрдХ рд╣реА рддрд░реНрдХ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реБрдП рдЧреБрд╕реНрд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╣реА рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдЪрд╛рд╣рд┐рдП рдерд╛, рдЗрд╕рд▓рд┐рдП рдЕрдм рдореИрдВ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред


рдкреА.рдПрд╕.

  • рдПрдкреАрдЖрдИ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ (рдкреБрд▓ рдмрдирд╛рдо рдкреБрд╢)ред

рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд╛рдпрджрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рд╕реЗ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди 99 (100?)% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдк рд╕рд┐рд░реНрдл рдХреЙрдореНрдмреАрдиреЗрдЯрд░ рдкреАрдПрдл рд╡рд╛рдпрджрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИред

  • рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬреЛ рд░рд╕реНрдЯ рдлреНрдпреВрдЪрд░реНрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рднреА рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлреНрдпреВрдЪрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ? рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рд╣рд╛рдЗрдкрд░ рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрддреЗ рд╕рдордп async рдХреЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓ рдЪреБрдХрд╛ рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдХреЛрдИ рдЕрдВрддрд░ рдирдЬрд░ рдирд╣реАрдВ рдЖрдпрд╛ред async рдпрд╣рд╛рдБ рд░рдЦреЗрдВ, await рд╡рд╣рд╛рдБ рдХрд┐рдпрд╛ рдЧрдпрд╛ ред

рдпрд╣ рддрд░реНрдХ рдХрд┐ рд░рд╕реНрдЯ рдХреЗ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдмрд╣реБрдд рд╣реА рдЕрд╕рдВрдмрджреНрдз рд╣реИред рд╕реА

for (int i = 0; i < n; i++)

рдФрд░ рдкрд╛рдпрдерди рдХрд╛

for i in range(n)

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рдХреЛ рд╕рд╛рдЭрд╛ рди рдХрд░реЗрдВ рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди for рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ? рдпрд╣ i in range(n) @ рдпрд╛ i in range(n) --->> рдпрд╛ рдЬреЛ рднреА рдЗрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП!

рдпрд╣рд╛рдБ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЕрдВрддрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рджреИрдирд┐рдХ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ!

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬрдВрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рджреИрдирд┐рдХ рдЬреАрд╡рди рд▓рдЧрднрдЧ рд╣реИ:

  1. рдХреБрдЫ HTTP рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд
  2. рдХреБрдЫ рдиреЗрдЯрд╡рд░реНрдХ рдХреЛрдб рд▓рд┐рдЦреЗрдВ

рдФрд░ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ

  1. рд╡рд╣ рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдлреИрд╢рди рдореЗрдВ рдиреМрдХрд░реА рдЦрддреНрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  2. рд░рд╕реНрдЯ рдЕрдкрдиреА рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИред
  3. рд╡рд╣ рдЪрд╛рд╣реЗ рддреЛ рдирд┐рдореНрди рд╕реНрддрд░ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдирд╣реАрдВ рдЬрдВрдЧ рдореЗрдВ рдПрдХ рдорд┐рд▓рд┐рдпрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╣реИрдВ рдЬреЛ C #, JS рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВ ред рдпрд╣ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдорддрднреЗрджреЛрдВ рдХреЛ рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрдирд░ рдХрд╛ рдХрд╛рдо рд╣реИ, рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдИ рднреА рд╡рд░реНрддрдорд╛рди рдореЗрдВ "рдореИрдВ рдЕрдкрдиреА рд░рд╛рдЬреНрдп рдорд╢реАрди рдирд╣реАрдВ рдЬрд╛рдирддрд╛" рдЬреИрд╕реЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП await!() рд╢рд┐рдХрд╛рдпрдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, "рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдкреБрд▓ рдЖрдзрд╛рд░рд┐рдд рд╣реИ"ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрди рдЕрдВрддрд░реЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рди рд╣реА рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рднрд╡рд┐рд╖реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧрд╛, рдЬреЛ рд╣рд░ рдЬрдЧрд╣ рдХреЗ рд╕рдорд╛рди рд╣реИред

рдареАрдХ рд╣реИ, рдХрд╛рдлреА рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛? рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл let result = await!(future) async fn рд▓рд┐рдЦреВрдВ рдФрд░ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реВрдВ, рддрдм рддрдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрдХ рдкрд░ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдорддрджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@ ben0x539 рд╣рд╛рдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рд╣реИ ... рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред

@ CAD97 рджреЗрдЦрдХрд░ рдЦреБрд╢реА val lazy = async(start=LAZY) { deferred_operation() }; )ред рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ IMO рдирд┐рдХрдЯрддрдо рд╢рдмреНрджрд╛рд░реНрде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╡реЗрдзрд╢рд╛рд▓рд╛рдПрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдардВрдбреА (рдЖрд▓рд╕реА) рд╣реЛрддреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг val lazy = Observable.fromCallable { deferred_operation() }; )ред рдЙрдирдХреЗ рд▓рд┐рдП рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдирд╛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рдо рдХрд╛ рд╢реЗрдбреНрдпреВрд▓ рд╣реИ, рдЬреИрд╕реЗ await!() Rust рдореЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рдирд╛ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рд╣реИ рдФрд░ рдЧрдгрдирд╛ рдХреА рдЧрдИ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкрд░рд┐рдгрд╛рдо рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рд╡рд░реНрддрдорд╛рди рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдЕрд▓рдЧ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╡рд╣рд╛рдБ рдПрдХ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд░рджреНрджрдХрд░рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддреЛ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ async рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИ, рдФрд░ рдореИрдВ рдЖрдкрдХреЗ рддрд░реНрдХ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ await рднреНрд░рд╛рдордХ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗрд╡рд▓ рдпрд╣рд╛рдБ рд▓рд╛рдн рд╣реИ!

@Pixix рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдХреЛрдИ рдирдпрд╛ yield рдХреЛ sigil рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ if / match / loop / return рдЬреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд┐рд░реНрдорд╛рдг рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдореЗрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, @ рд╕рд╛рде-рд╕рд╛рде ? рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВ рдФрд░ рдЕрдкрд╡рд╛рдж рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реВрдХреНрд╖реНрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдХреЛрдИ рдордЬрдмреВрдд рддрд░реНрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдбрд╝рд╛ await рдХреАрд╡рд░реНрдб рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ (рдкрд╛рда рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрдирдХреА рдпрд╛рдж рдЖрддреА рд╣реИ) рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдпрд╛ рдЕрдиреБрднрд╡ рдХреЗ рд▓рд┐рдП рдЕрдкреАрд▓ рдХрд░рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдпрд╛ рдЕрдиреБрднрд╡ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░рдирд╛ - рдпрд╣ рд╕рд┐рд░реНрдл рдкреВрд░реНрдг рдордиреЗрд░ рдореЗрдВ рдпрд╣рд╛рдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

@ рдкрд╛рдпрдЬрд┐рдорд╛ рдиреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкрд╛рдпрдерди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ "рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг" рд╣реИрдВред рд╣рдо for async , (int i = 0; i < n; i++) await , рдФрд░ i in range(n) @ рдФрд░ рдпрд╣рд╛рдБ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдиреЗ рдирдпрд╛ рдХреАрд╡рд░реНрдб - in (рдЬрд╛рд╡рд╛ рдореЗрдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рддрд░реНрдХ рд╣реИ - : ) рдкреЗрд╢ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЗрд╕рдиреЗ рдПрдХ рдирдИ рд░реЗрдВрдЬ рд╕рд┐рдВрдЯреИрдХреНрд╕ рднреА рдкреЗрд╢ рдХрд┐рдпрд╛ред рдпрд╣ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (i=0, n=0; i<n; i++) рдЬреИрд╕реЗ рдХреБрдЫ рдФрд░ рдкрд░рд┐рдЪрд┐рдд рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдкрд░ рдкреНрд░рднрд╛рд╡ рдХреЗрд╡рд▓ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реИ, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд░рд▓ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВред

@Pixix рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдХреЛрдИ рдирдпрд╛ yield рдХреЛ рд╕рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ if / match / loop / return рдЬреИрд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд┐рд░реНрдорд╛рдг рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдореЗрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, @ рд╕рд╛рде-рд╕рд╛рде ? рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВ рдФрд░ рдЕрдкрд╡рд╛рдж рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реВрдХреНрд╖реНрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

await рдПрдХ "рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдирд┐рд░реНрдорд╛рдг" рдирд╣реАрдВ рд╣реИред
рдЕрдорд╛рдиреНрдп рдЖрдзрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдкрдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдЭреВрдареЗ рднреА рд╣реИрдВред

рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ ? рдПрдХ рдмреБрд░реА рдЪреАрдЬ рд╣реИред

рдореБрдЭреЗ рдХреЛрдИ рдордЬрдмреВрдд рддрд░реНрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрдбрд╝рд╛ await рдХреАрд╡рд░реНрдб рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ (рдкрд╛рда рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрдирдХреА рдпрд╛рдж рдЖрддреА рд╣реИ) рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рднреА рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдпрд╛ рдЕрдиреБрднрд╡ рдХреЗ рд▓рд┐рдП рдЕрдкреАрд▓ рдХрд░рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕реА рдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдпрд╛ рдЕрдиреБрднрд╡ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░рдирд╛ - рдпрд╣ рд╕рд┐рд░реНрдл рдкреВрд░реНрдг рдХреНрд╖реЗрддреНрд░ рдореЗрдВ _here_ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛)ред

рдХреНрдпреЛрдВрдХрд┐ рд░рд╕реНрдЯ рдХрд╛ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреА рд╣реИрдВ, рдЕрдиреНрдп рдЯреАрдо рдЕрдиреБрднрд╡ рдФрд░ рдЗрддрдиреЗ рдкрд░ред рдЖрдк рд╕рддрд░реНрдХрддрд╛ рдореЗрдВ рдмрд╣реБрдд рдЖрд╢реНрд╡рд╕реНрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред

рдореИрдВ рдЬрдВрдЧ рдореЗрдВ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рддрд░реНрдХ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХрдИ рдЙрдкрд╕рд░реНрдЧ рдмрдирд╛рдо рдЙрдкрд╕рд░реНрдЧ рддрд░реНрдХ рджреЗрдЦреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рд╣рдо рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдХрд┐рд╕реА рдФрд░ рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА C ++ рдореЗрдВ рдЗрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред C ++ рдФрд░ Coroutine TS рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдпрд╣рд╛рдВ рдХрдИ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ Core Coroutines рдирд╛рдо рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рдХреЛрд░ рдХреЛрд░рдЯрд╛рдЗрдиреНрд╕ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдирдП рдСрдкрд░реЗрдЯрд░ рдЬреИрд╕реЗ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде co_await рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджрд┐рдпрд╛ред
рдЬрд┐рд╕реЗ рд╡реЗ рдЕрдирдкреНрд░реЗрдк рдСрдкрд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╣рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд╕рд╛рде, рдЙрдкрд╕рд░реНрдЧ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди (рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдмрд┐рдирд╛) рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ:

futureтАЛ<string>тАЛ gтАЛ();
stringтАЛ s тАЛ=тАЛтАЛ [<-]тАЛ fтАЛ();

optional_structтАЛ[->].тАЛoptional_sub_structтАЛ[->].тАЛfield

рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдЪрд░реНрдЪрд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдмрдирд╛ рджреЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдЬрдВрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реА # рдпрд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛) рд╕реЗ рдЕрд▓рдЧ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдЖрдБрдЦ рдмрдВрдж рдХрд░рдХреЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдЕрдкрд░рдВрдкрд░рд╛рдЧрдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдкреНрд░рддрд┐ рдЕрдкрдиреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЭреБрдХрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХреГрдкрдпрд╛ "рдЕрдВрддрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред

рдХрд┐рддрдиреЗ рдЕрдВрддрд░ рд╣реИрдВ? рдХрд┐рд╕реА рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛, рдЬрд╛рд╡рд╛, рд╕реА, рдкрд╛рдпрдерди, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд╕реА #, рдкреАрдПрдЪрдкреА, рд░реВрдмреА, рдЧреЛ, рд╕реНрд╡рд┐рдлреНрдЯ, рдЖрджрд┐ рдХреЛ рд▓реЗрдВ, рд╕реНрдерд┐рд░, рдЧрддрд┐рд╢реАрд▓, рд╕рдВрдХрд▓рд┐рдд, рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИред рд╡реЗ рдлрд╝реАрдЪрд░ рд╕реЗрдЯ рдореЗрдВ рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╡реЗ рдЕрднреА рднреА рдмрд╣реБрдд рдЖрдо рд╣реИрдВред рдХреНрдпрд╛ рдХреЛрдИ рдХреНрд╖рдг рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рднрд╛рд╖рд╛ 'рдмреНрд░реЗрдирдл * рд╕реАрдХреЗ' рдЬреИрд╕реА рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧреА рдлреАрдЪрд░ рджреЗрдиреЗ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдЕрдЬреАрдм рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ред

рдзрд╛рдЧрд╛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣рд╕ рдХрд╛рдлреА рд╣рдж рддрдХ рдЦрддреНрдо рд╣реЛ рдЪреБрдХреА рд╣реИ рдЬрдм рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬрдВрдЬреАрд░ рдХреА рддрддреНрдХрд╛рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рдпрд╣ рджрд╛рд╡рд╛ рдЕрдорд╛рдиреНрдп рдХрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдмрд╣реБрдд рд╕реЗ рдЕрд╕реНрдерд╛рдпреА рдЪрд░реЛрдВ рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реИрдВред

IMO, рдЖрдкрдиреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣рд╕ рдЦреЛ рджреА рд╣реИред рдЖрдк рдХреЗрд╡рд▓ "рдЕрдВрддрд░" рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдФрд░ рд╣рддрд╛рд╢ рдХреЛрд╢рд┐рд╢ рд╣реИред

@tensorduruk рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╢рдмреНрдж рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рддреНрд░реБрддрд╛рдкреВрд░реНрдг рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЬрд╛рдВрдЪ рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред


рдФрд░ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЕрдЧрд░ рдРрд╕реЗ рдХрдИ рд▓реЛрдЧ рд╣реИрдВ рдЬреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдХрд┐ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдХреЛрдб рдХрд┐рддрдирд╛ рд▓рд┐рдЦрд╛ рд╣реИ рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рд▓рд╛рдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╣рдо рд╣рд░ рдХрд┐рд╕реА рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдирдП рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рдирд╣реАрдВ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ, рдЬрдмрдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рд╣реЛрдиреЗ рдпрд╛ рди рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рддрд░реНрдХ рднреА рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред

рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рд╡рд╣ рд╕рдм рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдкреНрд░реАрдлрд╝рд┐рдЯ рдХрд┐рдП рдЧрдП рдлреЙрд░реНрдореЗрдЯ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдмреЗрд╣рддрд░ рд╣реИред рдЕрдЧрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмреЗрд╣рддрд░ рд░реВрдк рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЬрд╣рдордд рдЙрдард╛рдиреА рдкрдбрд╝реЗрдЧреА, рддреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдордВрдерди рд╣реЛрдВрдЧреЗред

рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪрд░реНрдЪрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдиреАрдЪреЗ рдХреА рдУрд░ рдЖрддреА рд╣реИред рдпрджрд┐ рдЪреЗрдирд┐рдВрдЧ рдПрдХ рдЪреАрдЬ рдирд╣реАрдВ рдереА, рддреЛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд┐рдбрд╝рдХреА рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдмрд╕ рдкреНрд░реАрдлрд┐рдХреНрд╕ рд╡реЗрдЯ рдкрд░ рдмреИрдардирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдВрдЬреАрд░ рд░рд╕реНрдЯ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИ:

if we should have only postfix await:
    what's the best syntax for it that:
         benefits chaining?
         is also ok in non-chaining scenarios
         is readable in both chainable and non-chainable contexts?
else if we should have only prefix await:
    what's the best syntax for it that:
         isn't ambiguous in the sense of order of operation (useful vs obvious)
else if we should have both prefix and postfix await:
    what's the best syntax for it that:
         benefits chaining?
         is also ok in non-chaining scenarios
         is readable in both chainable and non-chainable contexts?
         isn't ambiguous in the sense of order of operation (useful vs obvious)
    should it be a single unified syntax that somehow works for both prefix and postfix?
    would there be clear situations where prefix syntax is favored over postfix?
    would there be a situation where postfix syntax isn't allowed, but prefix is, and vice-versa?

рдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ред рдпрджрд┐ рдХреЛрдИ рдмреЗрд╣рддрд░ рдирд┐рд░реНрдгрдп рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдЕрдВрдХ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдРрд╕рд╛ рдХрд░реЗрдВ! рдПрдХреНрд╕рдбреА

рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдпрд╣ рддрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕, рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдпрд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдФрд░ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рджреЛрдиреЛрдВ рдЙрдкрд╕рд░реНрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдХреНрдпреЛрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЬрд┐рд╕ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЖрдП рд╣реИрдВред рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдмрд╕ рдЧрдП, рддреЛ рд╣рдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╕рдВрдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЫреЛрдЯреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

@tensorduruk

IMO, рдЖрдкрдиреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣рд╕ рдЦреЛ рджреА рд╣реИред рдЖрдк рдХреЗрд╡рд▓ "рдЕрдВрддрд░" рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдФрд░ рд╣рддрд╛рд╢ рдХреЛрд╢рд┐рд╢ рд╣реИред

рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдХреНрдпреЛрдВ рди рд╕рд┐рд░реНрдл рдпрд╣рд╛рдБ рдкрд░ рд╢рддреНрд░реБрддрд╛ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреА рдЙрдХреНрдд рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП?
рдЕрдкрдиреЗ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬрдВрдЧ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рдкрд╛рд░рдВрдкрд░рд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рдпрд╣ рд╣реИред рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдзрд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИред

рдЬрдВрдЬреАрд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рдПрдХ рдпрд╛рдж рдХрд┐рдпрд╛ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛ред рдореИрдВ, рдИ рдореИрдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛, рдЕрдЧрд░ chaining рдЗрд╕реЗ рджреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд░рд╛рдд рдХреЗ рд╕рдорд╛рди рд╣реА рд╡рд░реНрддрдорд╛рди рдореИрдХреНрд░реЛ рдХреАрд╡рд░реНрдб рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рд░рд╛рдд рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рд░рдЦреЗрдВ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦрд┐рд▓реМрдирд╛ рджреЗрдВред рд╣рд╛рдВ, рдПрдХ рдмрд╛рд░ рд╣рдо рдирд┐рдкрдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдордВрдерди рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрдВрдЧ рд╕реЗ рдЙрдкрдЬреА рд╣реИред

@tensorduruk

IMO, рдЖрдкрдиреЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣рд╕ рдЦреЛ рджреА рд╣реИред рдЖрдк рдХреЗрд╡рд▓ "рдЕрдВрддрд░" рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдФрд░ рд╣рддрд╛рд╢ рдХреЛрд╢рд┐рд╢ рд╣реИред

рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдХреНрдпреЛрдВ рди рд╕рд┐рд░реНрдл рдпрд╣рд╛рдБ рдкрд░ рд╢рддреНрд░реБрддрд╛ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреА рдЙрдХреНрдд рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП?
рдЕрдкрдиреЗ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЬрдВрдЧ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рдкрд╛рд░рдВрдкрд░рд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рдпрд╣ рд╣реИред рдЬрдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдзрд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИред

рдЬрдВрдЬреАрд░ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рдПрдХ рдпрд╛рдж рдХрд┐рдпрд╛ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛ред рдореИрдВ, рдИ рдореИрдВ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛, рдЕрдЧрд░ chaining рдЗрд╕реЗ рджреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд░рд╛рдд рдХреЗ рд╕рдорд╛рди рд╣реА рд╡рд░реНрддрдорд╛рди рдореИрдХреНрд░реЛ рдХреАрд╡рд░реНрдб рд╕реЗ рдЪрд┐рдкрдХреЗ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред рд░рд╛рдд рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рд░рдЦреЗрдВ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦрд┐рд▓реМрдирд╛ рджреЗрдВред рд╣рд╛рдВ, рдПрдХ рдмрд╛рд░ рд╣рдо рдирд┐рдкрдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдордВрдерди рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрдВрдЧ рд╕реЗ рдЙрдкрдЬреА рд╣реИред

рдзреНрдпрд╛рдирдкреВрд░реНрд╡рдХ рдкрдврд╝реЗрдВред рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рд╣рдореЗрдВ рдЕрдЬреАрдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред struct? borrowck? рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ!

рдХреГрдкрдпрд╛ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рднреА рд╣рд▓ рдХрд░реЗрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВред рд▓реЛрдЧреЛрдВ рдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдпрд╛ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдХреНрдпрд╛ рдЖрдк рд▓реЛрдЧ f await f.await рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реБрдП рдХрднреА рднреА рд╕рдмреВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рджреВрд╕рд░реЗ рдкрдХреНрд╖ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдирд╛ рднреА рдмреЗрдХрд╛рд░ рд╣реИред рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рддрд░реНрдХ рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЬрд╣рд╛рдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдЙрдкрдпреЛрдЧреА рд╣реИ (рд╕рдВрднрд╡рдд: рдЪреИрдирд┐рдВрдЧ рддрд░реНрдХ рдХреЛ рди рджреЛрд╣рд░рд╛рдПрдВ, рдпрд╣ рдПрдХ рдорд░рд╛ рд╣реБрдЖ рдЕрдВрдд рд╣реИ; рд╢рд╛рдпрдж рдПрдХ рд▓рдЧрд╛рддрд╛рд░ рд╕рдорд╕реНрдпрд╛ рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рддреА рд╣реИ, рдХреБрдЫ рд╕рдмреВрддреЛрдВ рдХреЗ рд╕рд╛рде, рдПрдХ рдЦрд┐рд▓реМрдирд╛ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ)ред

рдХреНрдпрд╛ рд╣рдореЗрдВ C # рдпрд╛ JS рдЬреИрд╕рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ? рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕реЗ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдВрдЧ рдирдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╛ рдЕрд╕рдВрдЧрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдирдП рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдВрдЧ рднреА рдХрдард┐рди рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдЧрд╛ @ рдЗрдирд╕реАрдб рдХреЗ await


рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрдИ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЕрдиреБрднрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдФрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕реА рдЕрдиреБрднрд╡ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреЛрд╣рд░рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм @ рдЦрд┐рд▓рд╛рдл рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрд╣рд╕ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╡ рдХреА рдЕрдкреАрд▓ рдХрд░рдирд╛ рдЕрдЬреЗрдп рдирд╣реАрдВ рд╣реИ :

рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЬреЗрдиреЗрдЯрд┐рдХ рдЦрд╛рддреЗ рд╕рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЙрди рдХрд╛рд░рдгреЛрдВ рдХреЛ рд░реЛрд╢рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдХрд╛рд░рдг рд╕рдорд╕реНрдпрд╛ рдиреЗ рдЕрдкрдирд╛ рд╡рд░реНрддрдорд╛рди рд╕реНрд╡рд░реВрдк рдЧреНрд░рд╣рдг рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЗрд╕рдХреА рдпреЛрдЧреНрдпрддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдореЗрдВ рдирд┐рд░реНрдгрд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВред

рд╣рдореЗрдВ await рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗ await рдкреНрдпрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ await ред рдЗрди рдХрд╛рд░рдгреЛрдВ рдХрд╛ рдЕрд╕реНрддрд┐рддреНрд╡ рд░реВрд╕реНрдЯ рдореЗрдВ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ @ рдЦрд┐рд▓рд╛рдл рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрд╣рд╕ рдХрд░рдирд╛ рдХрд┐рд╕реА рднреА рдирдП рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдирд╣реАрдВ рд▓рд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЬрдирддрд╛ рд╕реЗ рдЕрдкреАрд▓ рдХрд░рдирд╛ рдЕрдЬреЗрдп рдирд╣реАрдВ рд╣реИ :

рд▓реЙрдЬрд┐рдХ рдПрдб рдкреЙрдкреБрд▓рдо рдЗрдВрдбрдХреНрдЯрд┐рд╡ рд▓реЙрдЬрд┐рдХ рдореЗрдВ рдПрдХ рдорд╛рдиреНрдп рддрд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдбрд╝реА рдЖрдмрд╛рджреА рдХреЗ рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ 100% рджреВрд╕рд░реЗ рдкрд░ рдЙрддреНрдкрд╛рдж рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмреНрд░рд╛рдВрдб рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рддрдм рдПрдХ рдХреЛрдЬреЗрдВрдЯ (рдордЬрдмреВрдд) рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рд╡рд╣ рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рдмреНрд░рд╛рдВрдб рдХреЛ рдкрд╕рдВрдж рдХрд░реЗрдЧрд╛ (рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ 100% рдирд╣реАрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд╡рд╛рдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ), рдФрд░ рдкреЛрд▓ рдЙрд╕ рджрд╛рд╡реЗ рдХрд╛ рд╡реИрдз рд╕рдмреВрдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╕рдмреВрдд рдХреЗ рд░реВрдк рдореЗрдВ рдШрдЯрд╛рдП рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╕рдВрджреАрджрд╛ рдмреНрд░рд╛рдВрдб рдЕрдкрдиреА рд░рдЪрдирд╛ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ рдпрд╛ рдХрд┐ рд╕рднреА рдЙрд╕ рдмреНрд░рд╛рдВрдб рдХреЛ рджреВрд╕рд░реЗ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред

@Pzixel

рд▓реЗрдХрд┐рди рдЬрдВрдЧ рджреВрд╕рд░реА рдмрд╛рдд рд╣реИред рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдБ ? рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИред C # async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдЗрд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБрдУрдВ рдФрд░ рдЗрддрдиреЗ рдкрд░ рдлреЗрдВрдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЬрдВрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк C # рдореЗрдВ await рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛

var response = (await client.GetAsync("www.google.com")).HandleException();
var json =  (await response.ReadAsStreamAsync()).HandleException();
var somethingElse = (await DoMoreAsyncStuff(json)).HandleException();
...

рдЗрди рд╕рднреА рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдердХрд╛рдК рд╣реИред

C # рдореЗрдВ рдЖрдк рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

try
{
  var response = await client.GetAsync("www.google.com");
  var json =  await response.ReadAsStreamAsync();
  var somethingElse = await DoMoreAsyncStuff(json);
}
catch (Exception ex)
{
  // handle exception
}

рдкреНрд░реЛрдкреЗрдЧреЗрдЯ-рдПрд░рд░-рдЪреЗрдирд┐рдВрдЧ рддрд░реНрдХ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, foo().await? , рдЬреИрд╕реЗ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ ? рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдореЗрдВ await рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

let response = await? getProfile();

рдПрдХ рдФрд░ рдмрд╛рдд рдЬреЛ рдЕрднреА рдореЗрд░реЗ рд╕рд╛рде рд╣реБрдИ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдк match Future<Result<...>> рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЗрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ?

// Prefix
let userId = match await response {
  Ok(u) => u.id,
  _ => -1
};
// Postfix
let userId = match response {
  Ok(u) => u.id,
  _ => -1
} await;

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдПрдХ async match рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдПрдХ рдмрд╛рдд рд╣реЛрдЧреА? рдЬреИрд╕рд╛ рдХрд┐, рдХреНрдпрд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдореИрдЪ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╢рд░реАрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╣реЛ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ match await response рдФрд░ await match response рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реЛрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ match рдФрд░ await рджреЛрдиреЛрдВ рд╣реА рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдПрдХрд░реА рд╕рдВрдЪрд╛рд▓рдХ рд╣реИрдВ, рдФрд░ match рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд╕рд░реНрдЧ рд╣реИрдВ, await рдпрджрд┐

let userId = match response {
  Ok(u) => somethingAsync(u),
  _ => -1
} await; // Are we awaiting match or response here?

рдЕрдЧрд░ рдЖрдкрдХреЛ рджреЛрдиреЛрдВ рдЪреАрдЬреЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ

// Prefix - yes, double await is weird and ugly but...
let userId = await match await response {
  Ok(u) => somethingAsync(u),
  _ => -1
} await;
// Postfix - ... this is weirder and uglier
let userId = match response {
  Ok(u) => somethingAsync(u),
  _ => -1
} await await;

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

// Postfix - ... this is weirder and uglier
let userId = match response await {
  Ok(u) => somethingAsync(u),
  _ => -1
} await;

(рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдбрд┐рдЬрд╛рдЗрди рдХрдард┐рди рд╣реИред)

рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореИрдВ рдпрд╣ рджреЛрд╣рд░рд╛рддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд░реБрд╕реНрдЯ рдореЗрдВ match рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рддрд╛ рд╣реИ, рдФрд░ await рдПрдХ рдЕрдкрд░реЗрдВрдЯреНрд░реА рдСрдкрд░реЗрдЯрд░ рд╣реИред

C# // Postfix - ... this is weirder and uglier let userId = match response await { ... } await;

рд╕реБрдВрджрд░рддрд╛ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЗ рдХреА рдирдЬрд░ рдореЗрдВ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореИрдВ рдпрд╣ рдмрд╛рдд рджреЛрд╣рд░рд╛рддрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд░реБрд╕реНрдЯ рдореЗрдВ match рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рддрд╛ рд╣реИ, рдФрд░ await рдПрдХ unary рдСрдкрд░реЗрдЯрд░ рд╣реИред

рджреВрд╕рд░реА рдУрд░ ? рдПрдХрд╛рддреНрдордХ рд▓реЗрдХрд┐рди рдЙрдкрд╕рд░реНрдЧ рд╣реИред

рдмрд╛рд╡рдЬреВрдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд░реНрдЪрд╛ рдЕрдм рдирд╛рд▓реА рдХрд╛ рдЪрдХреНрдХрд░ рд▓рдЧрд╛ рд░рд╣реА рд╣реИред рдХрд┐рд╕реА рднреА рдирдП рдЪрд░реНрдЪрд╛ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд▓рд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдмрд╛рд░-рдмрд╛рд░ рд╕рдорд╛рди рдкрджреЛрдВ рдХреЛ рдкреБрди: рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реИред

рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ, рдореБрдЭреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛ рднреА рд╣реИ, рдореИрдВ await рд╕рдорд░реНрдерди рдкрд╛рдХрд░ рдЦреБрд╢ рд╣реВрдВ - рдЬрдмрдХрд┐ рдореЗрд░реА рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ рд╣реИрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рднреА рдпрдерд╛рд░реНрдерд╡рд╛рджреА рд╕реБрдЭрд╛рд╡ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рднрдпрд╛рдирдХ рд╣реИред

@markrle рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣реЗ рд╣реИрдВ

C # рдореЗрдВ рдЖрдк рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ C # рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдХрд╣рд╛ "рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдереЗ"ред рдХреНрдпреЛрдВрдХрд┐ рдЬрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред

рдкреНрд░реЛрдкреЗрдЧреЗрдЯ-рдПрд░рд░-рдЪреЗрдирд┐рдВрдЧ рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП foo().await? , рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ ? рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдореЗрдВ await рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рджреЛ рдпрд╛ рддреАрди рдмрд╛рд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, рдХреГрдкрдпрд╛, рд╡рд┐рд╖рдп рдХреЛ рдкрдврд╝реЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдпрд╣ рдПрдХ рдХреГрддреНрд░рд┐рдо рдирд┐рд░реНрдорд╛рдг рд╣реИ, рдЬреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ ? рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реЛрдЧрд╛ред рдкреНрд░рддреНрдпрдп рдХреЗ рд░реВрдк рдореЗрдВ await? рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрдм await? рдЙрдкрд╕рд░реНрдЧ рдХреЛ рд╕рдВрдХрд▓рдХ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдпрд╣ рдЕрднреА рднреА рдЬрдВрдЬреАрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдБ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд▓реЛрдЧ рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ), рдЬрдм рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╡реЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдФрд░ рдмрд╛рдд рдЬреЛ рдЕрднреА рдореЗрд░реЗ рд╕рд╛рде рд╣реБрдИ рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк match Future<Result<...>> рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЗрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ?

// Real postfix
let userId = match response await {
  Ok(u) => u.id,
  _ => -1
};
// Real Postfix 2 - looks fine, except it's better to be
let userId = match response await {
  Ok(u) => somethingAsync(u),
  _ => ok(-1)
} await;
// Real Postfix 2
let userId = match response await {
  Ok(u) => somethingAsync(u) await,
  _ => -1
};

C # рдХреЗ рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕рдХреЗ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕: new , await рдФрд░ C- рд╢реИрд▓реА рдХреА рдЬрд╛рддрд┐рдпреЛрдВ рдиреЗ рдореЗрд░реЗ рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЯреНрд░рд┐рдк рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реВрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЛрдИ рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╛рдпрджрд╛ рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЫрджреНрдо-рдореИрдХреНрд░реЛ рднреАред рдореИрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░реВрдВрдЧрд╛ред

@orthoxerox рдЖрдк рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдмрд╛рдд рдЙрдард╛рддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рдбреЗрдЯрдЬреЙрдм рдореЗрдВ рдореИрдВ рдЬреНрдпрд╛рджрд╛рддрд░ рдЬрд╛рд╡рд╛ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдирдП рдСрдкрд░реЗрдЯрд░ рдХреЛ рдПрдХ рд╕реНрддрд░ рдкрд░ рддрд┐рд░рд╕реНрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рджреБрд░реНрд▓рдн рдШрдЯрдирд╛ рдЬрдм рдЖрдк рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ) рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЫрд┐рдкрд╛ рд╕рдХрддрд╛ рд╣реВрдВ ред

@Pzixel

@markrle рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдЬрд╡рд╛рдм рджреЗ рд░рд╣реЗ рд╣реИрдВ

C # рдореЗрдВ рдЖрдк рдЗрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ C # рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдХрд╣рд╛ "рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдереЗ"ред рдХреНрдпреЛрдВрдХрд┐ рдЬрдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ред

рдореИрдВ рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╢рд╛рдпрдж рдПрдХ рднрд╛рд╖рд╛ рдмрд╛рдзрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЬреЛ рдХрд╣рд╛ рд╣реИ, рд╡рд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рдереЗ рд╡рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╡реИрд╕реЗ рднреА, рдЬреИрд╕рд╛ рдХрд┐ @rolandsteiner рдиреЗ рдХрд╣рд╛, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ

@yasammez C # рдкрд░ рдЖрдПрдВред V8.0 рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдирдП () рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ :)

рдореИрдВ рд╕рд┐рд░реНрдл рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВред

foo()~; // the pause operator
foo()^^; // the road bumps operator
foo()>>>; // the fast forward operator

рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рд╕рднреА рд╕рдВрднрд╡ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╢реЛрд░ рдФрд░ рдЕрдЬреАрдм рд▓рдЧрдиреЗ рд╡рд╛рд▓рд╛ @ рдорд┐рд▓рддрд╛ рд╣реИред @ рдлреЙрдХреНрд╕ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ ~ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдФрд░ рдХрдо "рд╡реНрдпрд╕реНрдд" рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдореИрдВ рдХреБрдЫ рднреА рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рд╣рдо рдЕрднреА рддрдХ рд░рд╕реНрдЯ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ @phaux рд╕реЗ рдкрд╣рд▓реЗ ~ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдкреЗрдЯреЗрдВрдЯ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛; рдкреА

рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЧреВрдВрдЬ рдХреА рддрд░рд╣ рд╣реИ:

Hi~~~~~
Where r u~~~~~

Hay~~~~~
I am in another mountain top~~~~~

~ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА-рдХрднреА рдПрдХ рд╡рд╛рдХреНрдп рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЕрдиреБрдЧрд╛рдореА рд╣реЛрдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ!

рдореИрдВ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдзрд╛рдЧреЗ рдиреЗ рдЪрд░рдо рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрджрддрд╛ рдХреЛ рдорд╛рд░рд╛ рд╣реИ рдпрд╛ рд╣рдо рдпрд╣рд╛рдВ рдХреБрдЫ рдкрд░ рд╣реИрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ~ рдХреБрдЫ рдХреАрдмреЛрд░реНрдб рдкрд░ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреБрдЫ рдЫреЛрдЯреЗ рдФрд░ рдирд╛рдЬреБрдХ рдореИрдХреЗрдирд┐рдХрд▓ рдХреАрдмреЛрд░реНрдбред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

let await userId = match response {
  Ok(u) => u.id,
  _ => -1
};
let await userId = match response {
  await Ok(u) => somethingAsync(u),
  _ => ok(-1)
};

рд╣рдо рдХреАрдмреЛрд░реНрдб рд▓реЗрдЖрдЙрдЯ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП ... рдЬреИрд╕реЗ рдЯреНрд░рд┐рдЧреНрд░рд╛рдл рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ ~ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ await(future) рдпрд╛ await{future} рд░реВрдк рдореЗрдВ рдПрдХ рд╕реАрдорд╛рдВрдХрд┐рдд рдЖрд╡рд╢реНрдпрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рдиреЗрддреНрд░рд╣реАрди рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рджреВрд╕рд░реЛрдВ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд░рд╕реНрдЯ рдлреНрдпреВрдЪрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдлреНрдпреВрдЪрд░реНрд╕ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреБрд░рдВрдд рдПрдХ рдирд┐рд╖реНрдкрд╛рджрдХ рдкрд░ рдПрдХ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЛ рдХреНрдпрд╛ рд╣реИ рдореЗрдВ рдмрджрд▓ рджреЗрддреА рд╣реИ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдореЛрдирд╛рдб рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдХред

рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреБрдЫ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдм рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдПрдХ рднреНрд░рдо рд╣реИред рдирд┐рдХрдЯрддрдо рдПрдирд╛рд▓реЙрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдореЛрдирд╛рдб do рд╕рдВрдХреЗрддрди рдпрд╛ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ for рд╕рдордЭ рд╣реИ (рдЬреЛ рдХрд┐ рдХреЗрд╡рд▓ рд╡рд╣реА рд╣реИрдВ рдЬреЛ рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рдКрдкрд░ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ)ред рдЕрдЪрд╛рдирдХ, рдореИрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдбрд░ рд╣реИ рдХрд┐ ? рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдиреЗ рджреЛрдиреЛрдВ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдиреНрдп sigils рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рд╣реИред ? рдмрдЧрд▓ рдореЗрдВ рдХреЛрдИ рднреА рдЕрдиреНрдп рд╕рддрд░реНрдХ рдЖрдзрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░ рдЗрд╕реЗ рд╢реЛрд░ рдФрд░ рднреНрд░рд╛рдордХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ future@? , рд▓реЗрдХрд┐рди рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд░реНрдЬрди рдСрдкрд░реЗрдЯрд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреА рдЧрдИ рдорд┐рд╕рд╛рд▓ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЛрдИ рджреВрд╕рд░рд╛ рдЗрддрдирд╛ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЙрдкрд╕рд░реНрдЧ рд╕рд░реНрдЬрди рдСрдкрд░реЗрдЯрд░ рдХреА рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╢реНрд╡рд╕реНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рддрд░реНрдХ рдХреЛ рдХрднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рд╡рд░реАрдп рдЧрдП рд╣реИрдВ ! рдХреЗ рдмрд╛рдж рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ future!? рдореБрдЭреЗ рд╡реНрдпрдВрдЧреНрдп рдЬрдм рднреА рдореИрдВ рдпрд╣ рд▓рд┐рдЦрд╛ рдерд╛, рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджреГрд╢реНрдп рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ $ рдЖрдЧреЗ рд╣реЛрдЧрд╛, рддрдм рд╕реЗ рдпрд╣ рдиреЗрддреНрд░рд╣реАрди future$? ред ~ рджреЗрдЦрдирд╛ рдЕрднреА рднреА рдореБрдЭреЗ рд░рд╕реНрдЯ рдХреЗ рд╢реБрд░реБрдЖрддреА рджрд┐рдиреЛрдВ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдЬрдм ~ рд╣реАрдк рдЖрд╡рдВрдЯрди рдХреЗ рд▓рд┐рдП рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдерд╛ред рдпрд╣ рд╕рдм рдмрд╣реБрдд рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рд╕реЗ рдИрд░реНрд╖реНрдпрд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдерд╛, рдореИрдВ рд╢рд╛рдпрдж рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╕реАрдорди рдХреЗ рд╕рд╛рде рдЙрдкрд╕рд░реНрдЧ рдСрдкрд░реЗрдЯрд░ рдХреА рдЕрдкреНрд░рднрд╛рд╡реА рдкрд╕рдВрдж рдХреЗ рд╕рд╛рде рдЬрд╛рдКрдВрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рджреВрд╕рд░реЛрдВ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд░рд╕реНрдЯ рдлреНрдпреВрдЪрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдлреНрдпреВрдЪрд░реНрд╕ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреБрд░рдВрдд рдПрдХ рдирд┐рд╖реНрдкрд╛рджрдХ рдкрд░ рдПрдХ рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЛ рдХреНрдпрд╛ рд╣реИ рдореЗрдВ рдмрджрд▓ рджреЗрддреА рд╣реИ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдореЛрдирд╛рдб рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдХред

рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ await рдХреА рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрд╕рдкрд╛рд╕ рдХреЗ async рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рдХреА рд╣реИред рдпрд╣ await рдЬреЛ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╡рд┐рд▓рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдХреЛрдб рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред

рд╕рдВрднрд╡рддрдГ @ рдкреНрд░рддреАрдХ рджреЗрдЦрдиреЗ рдХреА рдЕрдЬреАрдм рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдкрд╣рд▓реЗ рдХрднреА рдирд╣реАрдВ рдХреА рдЧрдИ рдереА, рдЗрд╕рд▓рд┐рдП рдЬреНрдпрд╛рджрд╛рддрд░ рдлреЛрдВрдЯ рдореЗрдВ рдпрд╣ рд╣рдорд╛рд░реЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдлрд┐рд░ рдПрдХ рдмреЗрд╣рддрд░ рдЧреНрд▓рд┐рдлрд╝ рдФрд░ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдлреЛрдВрдЯ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдореЛрдЬрд╝рд┐рд▓рд╛ рдХреЗ Fira Code ) рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд┐рдЧрдореЗрдВрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╕реЗ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЕрдиреНрдп рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдХрд┐ @ рд▓рд┐рдЦрдиреЗ рдпрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЬреАрдм рд╣реИред


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб @ рдкреНрд░рддреАрдХ рд╕реЗ рднрд┐рдиреНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - я╝а :


// A
if db.is_trusted_identity(recipient.clone(), message.key.clone())я╝а? {
    info!("recipient: {}", recipient);
}

// B
match db.load(message.key)я╝а? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .send()я╝а?
    .error_for_status()?;

// D
let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .send()я╝а?
    .error_for_status()?
    .json()я╝а?;

// E
let mut res: Response = client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .send()я╝а?
    .error_for_status()?
    .json()я╝а?;

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.request(url, Method::GET, None, true)я╝а?
        .res.json::<UserResponse>()я╝а?
        .user
        .into();

    Ok(user)
}

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдирд┐рдпрдорд┐рдд ANSI @ рд╕рд╛рде рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ


// A
if db.is_trusted_identity(recipient.clone(), message.key.clone())@? {
    info!("recipient: {}", recipient);
}

// B
match db.load(message.key)@? {
    Some(key) => key,
    None => {
        return Err(/* [...] */);
    }
};

// C
let mut res = client.get(&script_src)
    .header("cookie", self.cookies.read().as_header_value())
    .header("user-agent", USER_AGENT)
    .send()@?
    .error_for_status()?;

// D
let mut res: InboxResponse = client.get(inbox_url)
    .headers(inbox_headers)
    .send()@?
    .error_for_status()?
    .json()@?;

// E
let mut res: Response = client.post(url)
    .multipart(form)
    .headers(headers.clone())
    .send()@?
    .error_for_status()?
    .json()@?;

// F
async fn request_user(self, user_id: String) -> Result<User> {
    let url = format!("users/{}/profile", user_id);
    let user = self.request(url, Method::GET, None, true)@?
        .res.json::<UserResponse>()@?
        .user
        .into();

    Ok(user)
}

@norcalli

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ await(future) рдпрд╛ await{future} рд░реВрдк рдореЗрдВ рдПрдХ рд╕реАрдорд╛рдВрдХрд┐рдд рдЖрд╡рд╢реНрдпрдХ рдЙрдкрд╕рд░реНрдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реЛрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдФрд░ рдиреЗрддреНрд░рд╣реАрди рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реИред

рддреЛ рдлрд┐рд░ рдЖрдк рд╢рд╛рдпрдж if { cond } , while { cond } рдФрд░ match { expr } ...

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рджреВрд╕рд░реЛрдВ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд░рд╕реНрдЯ рдлреНрдпреВрдЪрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдлреНрдпреВрдЪрд░реНрд╕ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ

рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреНрдп рд╡рд╛рдпрджрд╛ рдХреА рддрд░рд╣ рд╣реИред "рд░рди рдХреЗ рдкрд╣рд▓реЗ рдХрд╛ рдЕрдВрддрд░ рдЬрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕реНрдкреЙрдореНрдб" рдмрдирд╛рдо "рд░рди рддрдм рддрдХ рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреЛрд▓" рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ "рдЬрдм рдпрд╣ рдЕрдВрддрд░ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ" рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреЛрдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рдорд┐рд▓реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдкрд╣рд▓реЗ рдкреЛрд▓ рдкрд░ рднрд╡рд┐рд╖реНрдп рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реЗрдЧреАред

рд╡реЗ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрд╛рдлреА рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХреЛрдИ рдЕрдВрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред

@Pzixel

"рд░рди рдХреЗ рдкрд╣рд▓реЗ рдХрд╛ рдЕрдВрддрд░ рдЬрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕реНрдкреЙрдореНрдб" рдмрдирд╛рдо "рд░рди рддрдм рддрдХ рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдкреЛрд▓" рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд╣ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдЖрд▓рд╕реА рдмрдирд╛рдо рдЙрддреНрд╕реБрдХ-рдкреНрд░рдердо-рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рдо рдЬреЛ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ await рдкреНрд░рддреАрдХреНрд╖рд┐рдд Promise (JS) / Task (C #) рдХреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрдХ рдкрд░ рдЬреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрдХ рдкрд░ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ (рдЗрд╕рд▓рд┐рдП "рдкреГрд╖реНрдарднреВрдорд┐" рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓ рд░рд╣рд╛ рдерд╛), рд▓реЗрдХрд┐рди рд░рд╕реНрдЯ рдореЗрдВ, Future s await! -driven рддрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд░рд╛рдЬреНрдп рдорд╢реАрди рд╣реИрдВред

Promise / Task рдЪрд▓ рд░рд╣реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд▓ рд╣реИред Future рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЧрдгрдирд╛ рд╣реИред рд░рд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдирд╛рдореЛрдВ рд╕рд╣рд┐рдд рд▓реЛрдЧреЛрдВ рдиреЗ рдкрд╣рд▓реЗ рдпрд╣ рдЧрд▓рддреА рдХреА рд╣реИ, рдФрд░ рдЗрди 500+ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

рдирд┐рдЬреА рддреМрд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдпрд╣ рдмреЗрдореЗрд▓ рд╣рд┐рд╕реНрд╕рд╛ await рдХреА рдкрд░рд┐рдЪрд┐рддрддрд╛ рдХрд╛ рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд╣рдорд╛рд░реЗ Future s рдиреЗ Promise / Task рдХреЗ рд╕рдорд╛рди рд▓рдХреНрд╖реНрдп рдкреВрд░рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЕрд▓рдЧ рддрдВрддреНрд░ рд╣реИред


рдореЗрд░реЗ рд▓рд┐рдП, рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ async / await JavaScript рдореЗрдВ рд╕реАрдЦрд╛ рдерд╛, рддреЛ async "рдмрд╕" рдХреБрдЫ рдРрд╕рд╛ рдерд╛ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ await рдорд╣рд╛рд╢рдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдерд╛ред рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореБрдЭреЗ рд╕рдорд╛рдирддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ a = fa(); b = fb(); /* later */ await [a, b]; (рдпрд╛ рдЬреЛ рднреА рд╣реЛ, рдпрд╣ рдПрдХ рдЙрдореНрд░ рд╣реЛ рдЧрдИ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЬреЗрдПрд╕ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛ рд╣реИ)ред рдореЗрд░реА рд╕рдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХрд╛ async рд▓рд╛рдЗрди рдХрд╛ рджреГрд╢реНрдп рдореЗрд░реЗ рд╕рд╛рде рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд░рд╕реНрдЯ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде async рдкрд░ рдмреЗрдореЗрд▓ рдирд╣реАрдВ рд╣реИрдВ (рдЖрдкрдХреЛ await рдорд╣рд╛рд╢рдХреНрддрд┐ рджреЗрдВ), рд▓реЗрдХрд┐рди Future рдирд┐рд░реНрдорд╛рдг рдФрд░ await! ред


рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдХреЗ async / Future / await рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рдЕрдВрддрд░ рдкрд░ рдЪрд░реНрдЪрд╛ рдиреЗ рдЕрдкрдирд╛ рдкрд╛рдареНрдпрдХреНрд░рдо рдЪрд▓рд╛ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рдирдИ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдЬрдм рддрдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдирдИ рд╕реНрдерд┐рддрд┐ рдФрд░ / рдпрд╛ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рдВрднрд╡рддрдГ рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдпрд╣рд╛рдВ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред (рдореИрдВ рдЗрд╕реЗ рдЗрдВрдЯрд░реНрдирд▓ рдФрд░ / рдпрд╛ рдбрд┐рд╕реНрдХреЛрд░реНрдб рдореЗрдВ рд▓реЗ рдЬрд╛рдХрд░ рдЦреБрд╢ рд╣реВрдБред)

@ CAD97 рд╣рд╛рдБ, рдореИрдВ рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреЗрджрднрд╛рд╡ рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред

рддреБрдо рдореБрдЭреЗ рдорд┐рд▓реЗ, рдореИрдВ рддреБрдореНрд╣реЗрдВред рддреЛ рдЪрд░реНрдЪрд╛ рдХреЛ рдЕрдкрдиреЗ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЖрдиреЗ рджреЗрдВред

@ CAD97

рд░рд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдирд╛рдореЛрдВ рд╕рд╣рд┐рдд рд▓реЛрдЧреЛрдВ рдиреЗ рдкрд╣рд▓реЗ рдпрд╣ рдЧрд▓рддреА рдХреА рд╣реИ, рдФрд░ рдЗрди 500+ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдореЗрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд▓реЛрдЧ рдЕрдВрддрд░рдВрдЧ рд░реВрдк рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рд╡рд╣ рдЧрд▓рддреА рдХрд░рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рддреА рд╣реИ?

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд░реВрд╕реНрдЯ рдСрд▓ рд╣реИрдВрдбреНрд╕ рдореЗрдВ async-wait рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдЪрд░реНрдЪрд╛рдПрдБ рдХреАрдВред рдЙрди рдЪрд░реНрдЪрд╛рдУрдВ рдХреЗ рджреМрд░рд╛рди, рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдИрдВ:

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдВрдЧ рдЯреАрдо рдореЗрдВ рдХреЛрдИ рд╕рд╣рдорддрд┐ (рдЕрднреА рддрдХ) рдирд╣реАрдВ рд╣реИ ред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрди рд╕рднреА рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рдФрд░ рдордЬрдмреВрдд рддрд░реНрдХ рд╣реИрдВред рд╣рдордиреЗ рд╡рд┐рдХрд▓реНрдк рддрд▓рд╛рд╢рдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рдФрд░ рдХрд╛рдлреА рд░реЛрдЪрдХ рдФрд░ рдЖрдЧреЗ-рдкреАрдЫреЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ред рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЧрд▓рд╛ рдЕрдЧрд▓рд╛ рдХрджрдо, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдиреЛрдЯреНрд╕ (рдЗрд╕ рдереНрд░реЗрдб рд╕реЗ рдЕрдиреНрдп рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде) рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕рд╛рд░рд╛рдВрд╢ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓реЗ рдХреЛ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡рд╣рд╛рдВ рд╕реЗ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдореИрдВ рдЙрд╕ рдкрд░ @withoutboats рдФрд░ @cramertj рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреНрд░рд╢реНрди рд╕реЗ рдкреАрдЫреЗ рд╣рдЯрдирд╛, рдПрдХ рдФрд░ рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рд╕рдордЧреНрд░ рддреНрд░реИрдорд╛рд╕рд┐рдХ рд╣реИред рдХрдИ рд╡рд░реНрддрдорд╛рди рд╕реАрдорд╛рдПрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЯреАрдХреЗрдПрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реВрдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдб рдХреЗ рддрд╣рдд рд╣реЛрддреА рд╣реИ)ред рдпреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реЛрдзрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╡реЗ рдРрд╕реЗ рдореБрджреНрджреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдВрддрддрдГ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдареЛрд╕ рдкреНрд░рдпрд╛рд╕ (рд╕рдВрдХрд▓рдХ рдЯреАрдо рд╕реЗ рднрд╛рдЧ рдореЗрдВ) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдФрд░ рдЕрдЧрд▓рд╛ рдХрджрдо рдЗрд╕ рдЯреНрд░рд╛рдпрдПрдЬ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдФрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рд╣рдо рдЗрд╕ рдЯреНрд░рд╛рдпрдПрдЬ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВрдЧреЗ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддрдм рдЕрдкрдбреЗрдЯ рд╣реЛрдЧрд╛ред

рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдЖрдЧреЗ рдЬрд╛рдКрдВрдЧрд╛ рдФрд░ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рддрдм рддрдХ рдмрдВрдж рдХрд░реВрдВрдЧрд╛

(рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдкрд░ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд▓рдВрдмреА рдЪрд░реНрдЪрд╛ рд╕реВрддреНрд░ рд╕реЗ рдкрд░реЗ рдбрд┐рдЬрд╛рдЗрди рд╕реНрдкреЗрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реВрдВред рдпрд╣ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдореБрдЭреЗ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╡рд┐рд╖рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛ред , рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВ - рдФрд░ рднрд╡рд┐рд╖реНрдп! - (рд╕рд┐рдВрдЯреИрдХреНрд╕)ред

Async-wait рд╕реНрдерд┐рддрд┐ рд░рд┐рдкреЛрд░реНрдЯ:

http://smallcultfollowing.com/babysteps/blog/2019/03/01/async-await-status-report/

рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖, рдЗрд╕рдореЗрдВ рдЯреНрд░рд╛рдЗрдПрдЬ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдФрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдкреВрд░реНрдг рд╕рд┐рдВрдЯреИрдХреНрд╕ рд░рд╛рдЗрдЯ-рдЕрдк рдирд╣реАрдВ рд╣реИ)ред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ async-wait рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛, рдХрдо рд╕реЗ рдХрдо рд╕рдордп рдХреЗ рд▓рд┐рдПред

рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рдирд┐рдХреЛ рдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рд╣рдо рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднрд╛рд╖рд╛ рдЯреАрдо рдФрд░ рд╕рдореБрджрд╛рдп рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рд▓рд┐рдЦреЗрдВрдЧреЗред рд▓рдВрдмреЗ рдЗрдВрддрдЬрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдорд╛рдлреАред рдЪрд░реНрдЪрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рд▓реЗрдЦ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдпрд╣ рднреА рдмрддрд╛ рджреВрдВ рдХрд┐ рдЪрд░реНрдЪрд╛ рдЕрдм рдХрд╣рд╛рдВ рд╣реИ рдФрд░ рд╣рдо рдпрд╣рд╛рдВ рд╕реЗ рдХрд╣рд╛рдВ рдЬрд╛рдПрдВрдЧреЗред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд╛рд░рд╛рдВрд╢ рдЬрд╣рд╛рдВ async-wait рдЕрднреА рдЦрдбрд╝рд╛ рд╣реИ

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо 1.37 рд░рд┐рд▓реАрдЬ , 2014 рдореЗрдВ рд╢рд╛рдЦрд╛рдУрдВ await! рдореИрдХреНрд░реЛ рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рддрдм рд╕реЗ рдкрд╣рд▓реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕рдбрд╝рдХ рдХреЗ рдЕрдВрдд рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдЕрдзрд┐рдХ рд╢реБрд░реБрдЖрддред рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлреАрдЪрд░ рдХрд╛рдо рд░рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓рдХреНрд╖рдг рдореЗрдВ async fn) рдФрд░ рдпрд╣ рднреА рдирд┐рд╣рд┐рдд рдХрд╛рдо (рдирд┐рд░рдВрддрд░ рдЕрдиреБрдХреВрд▓рди, рдмрдЧ рдлрд┐рдХреНрд╕рд┐рдВрдЧ, рдФрд░ рдЗрд╕реА рддрд░рд╣) рд╣реИред рдлрд┐рд░ рднреА, async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдирд╛ рдПрдХ рдкреНрд░рдореБрдЦ рдореАрд▓ рдХрд╛ рдкрддреНрдерд░ рд╣реЛрдЧрд╛!

рдЬрд╣рд╛рдБ рддрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдВрдХрд▓реНрдк рдХреА рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  • рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЕрдм рддрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмрд╣рд╕ рдХрд╛ рдПрдХ рд╣реИрдВ - рдХреГрдкрдпрд╛ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
  • рд╣рдо рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ for рд▓реВрдк рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдЯреНрд░реАрдо (рдЬреИрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ for await рд▓реВрдк)ред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ( рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдпрд╣рд╛рдВ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдзрд┐рдХ рдЖ рд░рд╣реА рд╣реИ)ред
  • 2 рдордИ рдХреЛ рдЖрдЧрд╛рдореА рд▓рдВрдЧ-рдЯреАрдо рдХреА рдмреИрдардХ рдореЗрдВ, рд╣рдо рд▓реВрдкреНрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╛рде рд╣реА 1.37 рдореЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЬрдирд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕ рдЗрдВрдЯрд░реНрдирд╕ рдереНрд░реЗрдб рд╕реЗ рдореАрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдПрдХ рдЕрдкрдбреЗрдЯ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВрдЧреЗред

рдж рд░рд╛рдЗрдЯрдЕрдк

рд░рд╛рдЗрдЯрдЕрдк рдПрдХ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдкреЗрдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╣реИ, рдЬреЛ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ, рдпрд╣ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИ рдФрд░ рдЖрдЧреЗ-рдкреАрдЫреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВрдЧреЗ; рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 500 рд╕реЗ рдЕрдзрд┐рдХ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВ) рдореИрдВрдиреЗ рдЙрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╕реВрддреНрд░ рдмрдирд╛рдпрд╛ рд╣реИ ред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛, рд╣рдо рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдпрд╣ рднреА рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЪрд░реНрдЪрд╛ рдХрд╛рдлреА рд╣рдж рддрдХ рдПрдХ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд╣реБрдВрдЪ рдЧрдИ рд╣реИ: рдЗрд╕ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реЗ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдХреА "рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгреА рдЕрд╡рдзрд┐" рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдмреИрдардХ рдХреЗ рдмрд╛рдж рд╣рдо рдЙрдореНрдореАрдж рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╕рдордпрд░реЗрдЦрд╛ рд╣реЛрдЧреАред

Async / wait рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдВрднрд╡рддрдГ 1.0 рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдлреАрдЪрд░ рд╣реИ, рдЬрд┐рд╕реЗ рд░реБрд╕реНрдЯ рдиреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЙрди рдлреИрд╕рд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓реА рд╣реИред рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдореЗрдВ рдЗрди рдЪрд░реНрдЪрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдПрдХ рдРрд╕рд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреА рджреГрдврд╝рддрд╛ рд╕реЗ рднрд╛рд╡рдирд╛рдУрдВ рдХрд╛ рд╣реНрд░рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ; рд╣рдо рд╕рднреА рдХреЛ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реБрдиреА рдЬрд╛ рд░рд╣реА рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдмрд╣реБрдд рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдФрд░ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╡рд┐рдЪрд╛рд░-рд╡рд┐рдорд░реНрд╢ рдХреЗ рдмрд╛рдж рдкрд╣реБрдВрдЪреЗрдЧрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

cuviper picture cuviper  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zhendongsu picture zhendongsu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dtolnay picture dtolnay  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dwrensha picture dwrensha  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wthrowe picture wthrowe  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ