Rust: async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ (RFC 2394)

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдордИ 2018  ┬╖  308рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: rust-lang/rust

рдпрд╣ RFC 2394 (рд░рд╕реНрдЯ-рд▓реИрдВрдЧ/rfcs#2394) рдХреЗ рд▓рд┐рдП рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬреЛ рднрд╛рд╖рд╛ рдореЗрдВ async рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

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

рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди:

  • [x] await рд▓рд┐рдП рдЕрдВрддрд┐рдо рд╕рд┐рдВрдЯреИрдХреНрд╕ред
  • [x] рд░рд╕реНрдЯ-рд▓реИрдВрдЧ/рдЖрд░рдПрдлрд╕реАрдПрд╕ рдХрд╛ рд╕рдорд╛рдзрд╛рди#2418
  • [рдПрдХреНрд╕] #51719
  • [x] https://github.com/rust-lang/rust/issues/53249
  • [x] https://github.com/rust-lang/rust/issues/53259
  • [x] #53548 (рд╢реБрд░реВ рдореЗрдВ https://github.com/rust-lang-nursery/futures-rs/issues/1199)
  • [x] https://github.com/rust-lang/rust/issues/53447
  • [x] Try рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рджреЛрдмрд╛рд░рд╛ рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИрдВ
A-async-await A-generators AsyncAwait-Triaged B-RFC-approved C-tracking-issue T-lang

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

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ await рдХреЛ рд╕рд╛рдзрд╛рд░рдг рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдмреНрд▓реЙрдЧ рд╕реЗ рдПрдХ рдЪрд┐рдВрддрд╛ рдХреЛ рджреЗрдЦреЗрдВ:

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

рдореИрдВ рдпрд╣рд╛рдВ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдЦрд░рд╛рдм рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ ? рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ await рд╕реЗ рдХрдо рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

let foo = await future?

рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИред

let foo = await!(future)?

рдПрдХ рдЖрджреЗрд╢ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рдкрдардиреАрдп рд╣реИред

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрд╕ await foo? рдХреЛ рдкрд╣рд▓реЗ await рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди await рдмрд╛рдИрдВ рдУрд░ рд╣реИ рдФрд░ ? рджрд╛рдИрдВ рдУрд░ рд╣реИред рддреЛ рдпрд╣ рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рддрд╛рд░реНрдХрд┐рдХ рд╣реИ await рдкрд╣рд▓реЗ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж Result рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВред


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

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

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рд╢реНрди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣рд╛рдВ рд▓рд┐рдВрдХ рдХрд░рдирд╛: https://internals.rust-lang.org/t/explicit-future-construction-implicit-await/ 7344

#50307 рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рд░реЛрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ await рдХреЛ рд╕рд╛рдзрд╛рд░рдг рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдмреНрд▓реЙрдЧ рд╕реЗ рдПрдХ рдЪрд┐рдВрддрд╛ рдХреЛ рджреЗрдЦреЗрдВ:

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

рдореИрдВ рдпрд╣рд╛рдВ рд╕рд╣рдордд рд╣реВрдВ, рд▓реЗрдХрд┐рди рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдЦрд░рд╛рдм рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ ? рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ await рд╕реЗ рдХрдо рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:

let foo = await future?

рдЗрд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИред

let foo = await!(future)?

рдПрдХ рдЖрджреЗрд╢ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рдкрдардиреАрдп рд╣реИред

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рдЙрд╕ await foo? рдХреЛ рдкрд╣рд▓реЗ await рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрд╣ рд╢рд╛рдпрдж рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди await рдмрд╛рдИрдВ рдУрд░ рд╣реИ рдФрд░ ? рджрд╛рдИрдВ рдУрд░ рд╣реИред рддреЛ рдпрд╣ рдЕрднреА рднреА рдкрд░реНрдпрд╛рдкреНрдд рддрд╛рд░реНрдХрд┐рдХ рд╣реИ await рдкрд╣рд▓реЗ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж Result рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВред


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

await рдПрдХ рдХреАрд╡рд░реНрдб рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, @Pzixel рдкрд░ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдорд┐рд╢реНрд░рд┐рдд рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реМрдВрджрд░реНрдп рдЕрдкреАрд▓ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ async рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ, рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдореЗрдВ "рдХреАрд╡рд░реНрдб рдмреНрд▓реЛрдЯ" рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪрд┐рдВрддрд╛ рд╣реИред рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдХреНрдпрд╛ async рдмрд┐рдирд╛ await рд╣реЛрдиреЗ рдХрд╛ рднреА рдХреЛрдИ рдорддрд▓рдм рд╣реИ, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░? рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореИрдВ рдПрдХ рдХреАрд╡рд░реНрдб await рдмрдирд╛рдиреЗ рдХреА рдУрд░ рдЭреБрдХреВрдВрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ ? рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ await рд╕реЗ рдХрдо рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ

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

рдпрд╣ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ Result<impl Future, _> :

let foo = await (foo()?)?;

рдпрд╣рд╛рдВ рдЪрд┐рдВрддрд╛ рдХреЗрд╡рд▓ "рдХреНрдпрд╛ рдЖрдк рдПрдХрд▓ рдкреНрд░рддреАрдХреНрд╖рд╛+ ? рдХреА рдкреВрд░реНрд╡рддрд╛ рдХреЛ рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ" рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рднреА рд╣реИ рдХрд┐ "рдХрдИ рдкреНрд░рддреАрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдХрд░рдирд╛ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред" рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рд╣рдордиреЗ рдЕрднреА-рдЕрднреА рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЪреБрдиреА рд╣реИ, рддрдм рднреА рд╣рдореЗрдВ await (await (await first()?).second()?).third()? рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред

await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢, рдХреБрдЫ RFC рд╕реЗ рдФрд░ рд╢реЗрд╖ RFC рдереНрд░реЗрдб рд╕реЗ:

  • рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реАрдорд╛рдВрдХрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: await { future }? рдпрд╛ await(future)? (рдпрд╣ рд╢реЛрд░ рд╣реИ)ред
  • рдмрд╕ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЪреБрдиреЗрдВ, рддрд╛рдХрд┐ await future? рдпрд╛ (await future)? рд╡рд╣ рдХрд░реЗ рдЬреЛ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ (рдЗрди рджреЛрдиреЛрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ)ред
  • рджреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ await? future рдЬреИрд╕реЗ рдХреБрдЫ рдореЗрдВ рдорд┐рд▓рд╛рдПрдВ (рдпрд╣ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ)ред
  • рдХрд┐рд╕реА рддрд░рд╣ await рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдмрдирд╛рдПрдВ, рдЬреИрд╕реЗ future await? рдпрд╛ future.await? (рдпрд╣ рдЕрднреВрддрдкреВрд░реНрд╡ рд╣реИ)ред
  • ? рддрд░рд╣ рдПрдХ рдирдП рд╕рд┐рдЧрд┐рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ future@? (рдпрд╣ "рд▓рд╛рдЗрди рд╢реЛрд░" рд╣реИ)ред
  • рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреЛ рдирд┐рд╣рд┐рдд рдХрд░рдирд╛ (рдЗрд╕рд╕реЗ рдирд┐рд▓рдВрдмрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рднрд╡рд┐рд╖реНрдп рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдКрдкрд░ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдЖрдВрддрд░рд┐рдХ рдзрд╛рдЧреЗ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдХреНрдпрд╛ async рдмрд┐рдирд╛ await рд╣реЛрдиреЗ рдХрд╛ рднреА рдХреЛрдИ рдорддрд▓рдм рд╣реИ, рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░?

@alexreg рдпрд╣ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдЯрд▓рд┐рди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ "рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рд╡рд┐рдХрд▓реНрдк рд╣реИред

@rpjohnst рджрд┐рд▓рдЪрд╕реНрдкред рдЦреИрд░, рдореИрдВ рдЖрдо рддреМрд░ рдкрд░ рднрд╛рд╖рд╛ рдХреА рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ async рдФрд░ await рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрдВрдЧ рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВред ..

@alexreg async/рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реА # (рдЬреЛ рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХ рднрд╛рд╖рд╛ рд╣реИ) рдореЗрдВ рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред @rpjohnst рдиреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ред рдореИрдВ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВ рджреВрд╕рд░реЛрдВ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ (рд╢реЛрд░/рдЕрд╕рд╛рдорд╛рдиреНрдп/...) рдкрд░ рд╕рд╣рдордд рд╣реВрдВред рдореИрдВ рдкрд┐рдЫрд▓реЗ 5 рд╡рд░реНрд╖реЛрдВ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рд▓рд┐рдП async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдзреНрд╡рдЬ рдХреАрд╡рд░реНрдб рд░рдЦрдирд╛ рд╡рд╛рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

@rpjohnst

рддреЛ рдЕрдЧрд░ рд╣рдордиреЗ рдЕрднреА рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЪреБрдиреА рд╣реИ, рддрдм рднреА рд╣рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА (рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ (рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ (рдкрд╣рд▓реЗ ()?)ред рджреВрд╕рд░рд╛ ()?)ред рддреАрд╕рд░рд╛ ()?ред

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

let first = await first()?;
let second = await first.second()?;
let third = await second.third()?;

рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ рдЕрдЧрд░ рдкреНрд░рд╛рдердорд┐рдХ рдорд╛рдорд▓реЗ рдХреЛ рд╕рд░рд▓ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддреА рд╣реИред

рд╣реАрд░реЛ рджреВрд░ future await? рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕рдХреЗ рдЦрд┐рд▓рд╛рдл рдХреЛрдИ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддрд┐рд╡рд╛рдж рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЖрдк рдХрднреА рднреА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рджреЛ await рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдпрд╛ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ C# рдХрд╛ рдореМрдЬреВрджрд╛ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕реЗ рдмрджрд╕реВрд░рдд рдмрдирд╛рддрд╛ рд╣реИ? рд▓реЛрдЧреЛрдВ рдиреЗ try!() ( ? рдХреЗ рдкреВрд░реНрд╡рд╡рд░реНрддреА) рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЗрд╕реА рддрд░рд╣ рдХреЗ рддрд░реНрдХ рджрд┐рдПред

рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдФрд░ рдирд┐рд╣рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рдХрдо рдмрджрд╕реВрд░рдд рд╣реИрдВ:

first().await?.second().await?.third().await?
first()?.second()?.third()?

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдпрд╛ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ C# рдХрд╛ рдореМрдЬреВрджрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕реЗ рдмрджрд╕реВрд░рдд рдмрдирд╛рддрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдпрд╣ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐ async рдСрдкрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд▓рд╛рдЗрди рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭрдиреЗ рдореЗрдВ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдбреАрдмрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рдмрдпрд╛рди рдореЗрдВ рдЬрдВрдЬреАрд░ рдореЗрдВ рдмрд╛рдВрдзрдирд╛ рдФрд░ рднреА рдмреБрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдЗрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ (рдореИрдВрдиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓рд┐рдпрд╛ рд╣реИ):

[Fact]
public async Task Should_UpdateTrackableStatus()
{
    var web3 = TestHelper.GetWeb3();
    var factory = await SeasonFactory.DeployAsync(web3);
    var season = await factory.CreateSeasonAsync(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddDays(1));
    var request = await season.GetOrCreateRequestAsync("123");

    var trackableStatus = new StatusUpdate(DateTimeOffset.UtcNow, Request.TrackableStatuses.First(), "Trackable status");
    var nonTrackableStatus = new StatusUpdate(DateTimeOffset.UtcNow, 0, "Nontrackable status");

    await request.UpdateStatusAsync(trackableStatus);
    await request.UpdateStatusAsync(nonTrackableStatus);

    var statuses = await request.GetStatusesAsync();

    Assert.Single(statuses);
    Assert.Equal(trackableStatus, statuses.Single());
}

рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ await s рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдардиреАрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ await рд╕рд┐рд░реНрдл рдСрдирд▓рд╛рдЗрдирд░ рдХреЛ рд▓рд┐рдЦрдирд╛ рдФрд░ рдкрдврд╝рдирд╛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдЦрд░рд╛рдм рд╣реЛрдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред

рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдФрд░ рдирд┐рд╣рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рдХрдо рдмрджрд╕реВрд░рдд рд╣реИрдВ

рдХрд╛рд░реНрдп рдкреНрд░рд╛рд░рдВрдн рдФрд░ рдХрд╛рд░реНрдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдХреНрд╕рд░ рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ (рдлрд┐рд░ рд╕реЗ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ):

public async Task<StatusUpdate[]> GetStatusesAsync()
{
    int statusUpdatesCount = await Contract.GetFunction("getStatusUpdatesCount").CallAsync<int>();
    var getStatusUpdate = Contract.GetFunction("getStatusUpdate");
    var tasks = Enumerable.Range(0, statusUpdatesCount).Select(async i =>
    {
        var statusUpdate = await getStatusUpdate.CallDeserializingToObjectAsync<StatusUpdateStruct>(i);
        return new StatusUpdate(XDateTime.UtcOffsetFromTicks(statusUpdate.UpdateDate), statusUpdate.StatusCode, statusUpdate.Note);
    });

    return await Task.WhenAll(tasks);
}

рдпрд╣рд╛рдВ рд╣рдо N async рдЕрдиреБрд░реЛрдз рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрдирдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд▓реВрдк рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╣рдо async рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЙрди рд╕рднреА рдХрд╛ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

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


рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╣рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╕реА # рдЬреИрд╕реА рдФрд░ рднреА рдЕрдзрд┐рдХ рдирд┐рд╣рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЬрдВрдЧ рдореЗрдВ рдЗрд╕рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдЖрдкрдХреЛ u8 рдХреЛ i32 рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛрдЧрд╛ред

@Pzixel рд╣рд╛рдБ, рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕реА # рдореЗрдВ рднреА async/await рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕реА # рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП, await (future?) рдореЗрд░реЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИред

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

рдХрд╛рд░реНрдп рдкреНрд░рд╛рд░рдВрдн рдФрд░ рдХрд╛рд░реНрдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИ, рдирд┐рд╣рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рджреЛрдиреЛрдВ рдЖрд░рдПрдлрд╕реА рд╕реВрддреНрд░ рдореЗрдВ рдФрд░ рдЖрдВрддрд░рд┐рдХ рд╕реВрддреНрд░ рдореЗрдВ рдореМрдд рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ, рддреЛ рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдореЗрдВ рдпрд╣рд╛рдБ рдирд╣реАрдВ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╣реА рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдЗрдВрддрдЬрд╛рд░ рд╕реЗ рдореБрдЦрд░рддрд╛ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╣ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐рд╕реА рднреА рдирдП рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХрд╛ рдкрд░рд┐рдЪрдп рди рджреЗрдВред

рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

pub async fn get_statuses() -> Vec<StatusUpdate> {
    // get_status_updates is also an `async fn`, but calling it works just like any other call:
    let count = get_status_updates();

    let mut tasks = vec![];
    for i in 0..count {
        // Here is where task *construction* becomes explicit, as an async block:
        task.push(async {
            // Again, simply *calling* get_status_update looks just like a sync call:
            let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
            StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
        });
    }

    // And finally, launching the explicitly-constructed futures is also explicit, while awaiting the result is implicit:
    join_all(&tasks[..])
}

рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдпрд╣реА рдорддрд▓рдм рд╣реИ "рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рднрд╡рд┐рд╖реНрдп рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред" рдпрд╣ рд╕рд┐рдВрдХ рдХреЛрдб рдореЗрдВ рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реИ- рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдХреЙрд▓рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдорд╡рд░реНрддреА рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреВрд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд▓реЛрдЬрд░ рдФрд░ thread::spawn / join async рдмреНрд▓реЙрдХ рдФрд░ join_all / select /etc рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред

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

рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреМрди рд╕рд╛ рдкреНрд░рд╡рд╛рд╣ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдмрд┐рдВрджреБ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдХреЗрд╡рд▓ async рдмреНрд▓реЙрдХ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрд╣рддрд╛ рд╣реИ "рдирдорд╕реНрддреЗ, рдпрд╣рд╛рдБ рдХрд╣реАрдВ async рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╣реИрдВ, рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реЛрдВрдЧреЗ!"ред

рдПрдХ рдФрд░ рдмрд┐рдВрджреБ: рдЬрдВрдЧ рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рд╕рдм рдХреБрдЫ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдирдВрдЧреЗ рдзрд╛рддреБ рдХреЗ рдХрд░реАрдм рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдореИрдВ рдХреБрдЫ рдХрд╛рдлреА рдХреГрддреНрд░рд┐рдо рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

var a = await fooAsync(); // awaiting first task
var b = barAsync(); //running second task
var c = await bazAsync(); // awaiting third task
if (c.IsSomeCondition && !b.Status = TaskStatus.RanToCompletion) // if some condition is true and b is still running
{
   var firstFinishedTask = await Task.Any(b, Task.Delay(5000)); // waiting for 5 more seconds;
   if (firstFinishedTask != b) // our task is timeouted
      throw new Exception(); // doing something
   // more logic here
}
else
{
   // more logic here
}

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

  1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЧрдВрджрд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
  2. рдЕрдм рдЖрд░рдПрд▓рдПрд╕ рдФрд░ рдЖрдИрдбреАрдИ рдХреЛ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛ рдореВрд▓реНрдп рдпрд╛ рддреЛ Future<T> рдпрд╛ T рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо T , рдЕрдиреНрдпрдерд╛ рдпрд╣ Future<T>
  3. рдпрд╣ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ get_status_updates рд▓рд╛рдЗрди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ get_status_update ред рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдХрд╛рдлреА рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рд╣реИрдВред рддреЛ рдпрд╣ рдпрд╛ рддреЛ рдореВрд▓ рдХреЛрдб рдХреА рддрд░рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдпрд╣ рдЗрддрдирд╛ рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рддрдм рднреА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдЬрдм рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рдХрд╛рдлреА рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВред рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдиреБрдХреВрд▓ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред

рдореИрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреМрди рд╕рд╛ рдкреНрд░рд╡рд╛рд╣ рд╣реЛрдЧрд╛, рдЬрд╣рд╛рдВ рдмрд┐рдВрджреБ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреВрд░реА рд╣реЛрдиреЗ рддрдХ рдирд┐рд╖реНрдкрд╛рджрди рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рдВ, рдореЗрд░рд╛ рдпрд╣реА рдорддрд▓рдм рд╣реИ "рдЗрд╕рд╕реЗ рдирд┐рд▓рдВрдмрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред" рдпрджрд┐ рдЖрдк рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдЖрдВрддрд░рд┐рдХ рдзрд╛рдЧреЗ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВрдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рдХрд┐ рдпрд╣ рдЗрддрдиреА рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдХреЛрдИ рдирдпрд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдк рдмрд╕ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдПрдХ рдЕрд▓рдЧ рдЬрдЧрд╣ ( await рдПрдб рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдХреЗ рдмрдЬрд╛рдп async рдмреНрд▓реЙрдХ) рдореЗрдВ рдбрд╛рд▓ рджреЗрдВред рдЖрдИрдбреАрдИ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ (рдпрд╣ рд╣рдореЗрд╢рд╛ T рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдФрд░ Future<Output=T> async рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рд╣реИ)ред

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрдкрдХреА рд╕рдордЭ рд╢рд╛рдпрдж рдЧрд▓рдд рд╣реИред рд░рд╕реНрдЯ рдХреЗ async рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рддрдХ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХрд╛ b.Status != TaskStatus.RanToCompletion рдЪреЗрдХ рд╣рдореЗрд╢рд╛ рдкрд╛рд╕ рд╣реЛрдЧрд╛ред рдЖрд░рдПрдлрд╕реА рдереНрд░реЗрдб рдореЗрдВ рдореГрддреНрдпреБ рдХреЗ рд▓рд┐рдП рднреА рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереА, рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ get_status_updates рд▓рд╛рдЗрди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ get_status_update ред рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдХрд╛рдлреА рдорд┐рд▓рддреЗ-рдЬреБрд▓рддреЗ рд╣реИрдВред

рдпрд╣ рджреЛрдиреЛрдВ рдЬрдЧрд╣реЛрдВ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд async рдмреНрд▓реЙрдХ рддрдм рддрдХ рдирд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд╡реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬрдВрдЧ рдореЗрдВ рд╕рднреА рд╡рд╛рдпрджрд╛ рдХреЗ рд▓рд┐рдП рд╕рдЪ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, get_statuses рдХреЙрд▓ (рдФрд░ рдЗрд╕ рддрд░рд╣ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ) get_status_updates , рдлрд┐рд░ рд▓реВрдк рдореЗрдВ рдпрд╣ count рдлреНрдпреВрдЪрд░реНрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), рдлрд┐рд░ рдпрд╣ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдЗрд╕ рддрд░рд╣ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ) ) join_all , рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рд╡реЗ рд╡рд╛рдпрджрд╛ рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ) get_status_update ред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдлреНрдпреВрдЪрд░реНрд╕ рдЪрд▓рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ- рдЖрдк рдореЗрдВ, рдпрд╣ рд▓реВрдк рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ; рдореЗрд░реЗ рдореЗрдВ, рдпрд╣ join_all ред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдореМрд▓рд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдлреНрдпреВрдЪрд░реНрд╕ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ async / await рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдпрд╣ рднреА рдиреЛрдЯ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрдкрдХреА рд╕рдордЭ рд╢рд╛рдпрдж рдЧрд▓рдд рд╣реИред Rust рдХреЗ async рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рддрдХ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХрд╛ b.Status != TaskStatus.RanToCompletion рдЪреЗрдХ рд╣рдореЗрд╢рд╛ рдкрд╛рд╕ рд╣реЛрдЧрд╛ред

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

var a = await fooAsync(); // awaiting first task
var b = Task.Run(() => barAsync()); //running background task somehow
// the rest of the method is the same

рдореБрдЭреЗ рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ async рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдЬрд╛рдирд╡рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рдеред рдореВрд▓ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ async рдХрд╛рд░реНрдп рдХреЛ await рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред async рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЛ рдирд┐рд░реНрдорд╛рдг рдмрд┐рдВрджреБ рдкрд░ async рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рд▓рдЧрднрдЧ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдЬреИрд╕реЗ рдкрд╣рд▓реЗ (1:1 рд╕рдВрдмрдВрдз), рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЕрдзрд┐рдХ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ, рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдХрдард┐рди, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓рд╕рд╛рдЗрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрджрд░реНрдн-рдирд┐рд░реНрднрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдореИрдВ let a = foo() рдпрд╛ let b = await foo() рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдЕрднреА рдирд┐рд░реНрдорд┐рдд рдпрд╛ рдирд┐рд░реНрдорд┐рдд рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╣реИред рдЕрдЧрд░ рдореИрдВ let a = foo() рд╕рд╛рде async рдмреНрд▓реЙрдХ рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдКрдкрд░ рдХреБрдЫ async рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдЖрдкрдХреЛ рд╕рд╣реА рд╕рдордЭреВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ

pub async fn get_statuses() -> Vec<StatusUpdate> {
    // get_status_updates is also an `async fn`, but calling it works just like any other call:
    let count = get_status_updates();

    let mut tasks = vec![];
    for i in 0..count {
        // Here is where task *construction* becomes explicit, as an async block:
        task.push(async {
            // Again, simply *calling* get_status_update looks just like a sync call:
            let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
            StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
        });
    }

    // And finally, launching the explicitly-constructed futures is also explicit, while awaiting the result is implicit:
    join_all(&tasks[..])
}

рд╣рдо рдпрд╣рд╛рдБ рд░рд╣рддреЗ рд╣реБрдП рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

pub async fn get_statuses() -> Vec<StatusUpdate> {
    // get_status_updates is also an `async fn`, but calling it works just like any other call:
    let count = get_status_updates();

    let mut tasks = vec![];
    for i in 0..count {
        // Isn't "just a construction" anymore
        task.push({
            let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
            StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))
        });
    }
    tasks 
}

рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдПрдХ рд╣реЛред

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕ рднрд╛рдЧ рдХрд╛ рд╕рдЯреАрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ:

let status_update: StatusUpdateStruct = get_status_update(i).deserialize();
StatusUpdate::new(utc_from_ticks(status_update.update_date), status_update.status_code, status_update.note))

рдЕрдзрд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ред

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

рдХреЙрд▓рд╕рд╛рдЗрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрджрд░реНрдн-рдирд┐рд░реНрднрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдХ рдХреЛрдб рдФрд░ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдЪ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

// Construct a closure, delaying `do_something_synchronous()`:
task.push(|| {
    let data = do_something_synchronous();
    StatusUpdate { data }
});

рдмрдирд╛рдо

// Execute a block, immediately running `do_something_synchronous()`:
task.push({
    let data = do_something_synchronous();
    StatusUpdate { data }
});

рдПрдХ рдФрд░ рдмрд╛рдд рдЬреЛ рдЖрдкрдХреЛ рдкреВрд░реНрдг рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдзреНрдпрд╛рди рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк async fn s рдХреЛ рдЧреИрд░- async рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ some_function(arg1, arg2, etc) рд╣рдореЗрд╢рд╛ some_function рдХреЗ рдмреЙрдбреА рдХреЛ рдХреЙрд▓рд░ рдХреЗ рдЬрд╛рд░реА рд░рд╣рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА some_function async ред рдЗрд╕рд▓рд┐рдП async рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рд╣реЛрддрд╛ рд╣реИред

рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рд╡рд┐рдзрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╡рд╛рд▓реЗ рдореИрдХреНрд░реЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдореБрдЭреЗ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ RFC рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ reddit рдкрд░ рдХреБрдЫ рдЪрд░реНрдЪрд╛рдПрдБ ( 1 , 2 ) рдорд┐рд▓реА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдЕрднреВрддрдкреВрд░реНрд╡ рдирд╣реАрдВ рд╣реИред рдпрд╣ await рдХреЛ рдмрд┐рдирд╛ рдХреАрд╡рд░реНрдб рдмрдирд╛рдП/рдХреЗрд╡рд▓ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

// Postfix await-as-a-keyword. Looks as if we were accessing a Result<_, _> field,
// unless await is syntax-highlighted
first().await?.second().await?.third().await?
// Macro with method syntax. A few more symbols, but clearly a macro invocation that
// can affect control flow
first().await!()?.second().await!()?.third().await!()?

рд╕реНрдХрд╛рд▓рд╛-рд╡рд░реНрд▓реНрдб рдХреА рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ рдореЛрдиреИрдб рд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИ: http://monadless.io

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдВред

рдбреЙрдХреНрд╕ рд╕реЗ рдЙрджреНрдзрд░рдг:

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

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

рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП M , рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдПрдХ рд╕рдиреНрдпрд╛рд╕реА ( T => M[T] ) рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЙрдард╛рдиреЗ рдФрд░ рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рдЙрджрд╛рд╣рд░рдг ( M[T] => T ) рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред > рдЙрджрд╛рд╣рд░рдг рдЙрдкрдпреЛрдЧ:

lift {
  val a = unlift(callServiceA())
  val b = unlift(callServiceB(a))
  val c = unlift(callServiceC(b))
  (a, c)
}

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓рд┐рдлреНрдЯ async рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдирд▓рд┐рдлреНрдЯ рдХрд░реЗрдВред

рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдХ рдХреЛрдб рдФрд░ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдЪ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХрдИ рдЕрдВрддрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:

  1. рд▓реИрдореНрдмреНрдбрд╛ рд╕рдВрджрд░реНрдн рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ await ред await рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ, async рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреВрд░реНрд╡ рдЬреАрддрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдорд╛рди рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  2. рд▓реИрдореНрдмреНрдбрд╛ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдИ рд░реЗрдЦрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдкреВрд░реЗ рд╢рд░реАрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд░рд▓ред async рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдлреА рдмрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛, рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ) рдФрд░ рдЬрдЯрд┐рд▓ред
  3. рд▓реИрдореНрдмреНрдбрд╛ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдиреЗрд╕реНрдЯреЗрдб рд╣реЛрддреЗ рд╣реИрдВ ( then рдХреЙрд▓ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП await рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ), async рдмреНрд▓реЙрдХ рдЕрдХреНрд╕рд░ рдиреЗрд╕реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

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

рд╣рдореНрдо, рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЖрдк рдЕрдХреНрд╕рд░ рдЧреИрд░-рдПрд╕рд┐рдВрдХ рд╕рдВрджрд░реНрдн рд╕реЗ рдПрд╕рд┐рдВрдХ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред C# рдореЗрдВ async рд╕рд┐рд░реНрдл рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдлрдВрдХреНрд╢рди рдмреЙрдбреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдлрдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП async Task<Foo> рдФрд░ Task<Foo> рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдирд┐рдореЗрдп рд╣реИрдВ, рдФрд░ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдкреАрдЖрдИ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред

рдХрднреА-рдХрднреА рдЖрдк async рдХрд╛рд░реНрдп рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬрдм рдЖрдк main рд╕реЗ рдХреБрдЫ рдиреЗрдЯрд╡рд░реНрдХ API рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдЕрдиреНрдпрдерд╛ рдЖрдк OS рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ) рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ async HTTP рдЕрдиреБрд░реЛрдз рдЪрд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ main рд╣реИрдХрд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣рд╛рдВ рдХреМрди рд╕рд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЗрд╕реЗ рдПрд╕рд┐рдВрдХ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХреЗ рдФрд░ рд╕рд╛рде рд╣реА рд╣рдо Result рдореБрдЦреНрдп рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЖрдк рдЗрд╕реЗ рдЧреИрд░-рдПрд╕рд┐рдВрдХ рдореБрдЦреНрдп рд╕реЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ .

рд╡рд░реНрддрдорд╛рди await рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ @fdietze рджреНрд╡рд╛рд░рд╛ рдиреЛрдЯ рдХрд┐рдпрд╛

рдореБрдЭреЗ рдпрд╣рд╛рдВ рдХрдИ рдЕрдВрддрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ

рдЖрдкрдХреЛ рдпрд╣ рднреА рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореБрдЦреНрдп рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА async рдмреНрд▓реЙрдХ рд╣реИрдВ, рдЙрд╕реА рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдирд┐рд╣рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд┐рд░ред

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

рдпрд╣ рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк рдЕрднреА рднреА рдЧреИрд░- async рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ async рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рдареАрдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ F: Future рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреЗ рд╣реИрдВ), рдФрд░ рдЖрдк рдЕрднреА рднреА рд╡рд╛рдпрджрд╛ рдкрд░ рд╕реНрдкреЙрди рдпрд╛ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

рдЖрдк рдХреЗрд╡рд▓ async fn s рдкрд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХреЛ async рдмреНрд▓реЙрдХ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ- рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╣реИрдВ, рдпрджрд┐ рдЖрдк F: Future ред

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

рд╣рд╛рдБ, рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╡реИрдз рдЕрдВрддрд░ рд╣реИред рдЗрд╕реЗ рдЖрдВрддрд░рд┐рдХ рдзрд╛рдЧреЗ рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрдХреАрдирди, рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛрдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ async fn рд╕рдВрд╕реНрдХрд░рдг рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рд╛рдПрдЧрд╛, рдЬрдмрдХрд┐ -> impl Future рд╕рдВрд╕реНрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрдиреБрд░реЛрдз рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдХ F: Future ред рдпрд╣ async fn s рдХреЛ рд╕рд╛рдорд╛рдиреНрдп fn s рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рдВрдЧрдд рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ -> T рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХреБрдЫ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ T рдорд┐рд▓реЗрдЧрд╛, рднрд▓реЗ рд╣реА рд╡рд╣ async ред

(рдЖрдкрдХреЛ рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рдЕрднреА рднреА async fn рдФрд░ Future -рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмреАрдЪ рдХрд╛рдлреА рдЫрд▓рд╛рдВрдЧ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ RFC рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред async fn рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ Future рдЗрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рдХрд╣реАрдВ рднреА; рдФрд░ рдореИрдиреБрдЕрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП impl Trait рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреАрд╡рди рднрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╡рд╣рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, async fn рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдпрд╣ рдЕрдиреНрдп рднрд╛рд╖рд╛ рдЬреИрд╕реЗ рд╕реА #/рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ/рдЬреЗрдПрд╕/рдкрд╛рдпрдерди рд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ

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

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

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

fn foo(&self) -> Future<T> {
   self.myService.foo()
}

рдФрд░ рдлрд┐рд░ рдЖрдк рдмрд╕ рдХреБрдЫ рд▓реЙрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ

async fn foo(&self) -> T {
   let result = await self.myService.foo();
   self.logger.log("foo executed with result {}.", result);
   result
}

рдФрд░ рдпрд╣ рдПрдХ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рдмрди рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╣?

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

рдпрд╣ рдХрд┐рд╕реА рднреА await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ, await foo / foo await / foo@ / foo.await /... рдПрдХ рд╣реА рдмрд╛рдд, рдлрд░реНрдХ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдкрд╣рд▓реЗ/рдмрд╛рдж рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдпрд╛ рдХреАрд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп рд╕рд┐рдЧрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред

рдЖрдкрдХреЛ рдпрд╣ рднреА рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рдЕрднреА рднреА async fn рдФрд░ рдлреНрдпреВрдЪрд░-рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рд╡рд░реНрдЬрди рдХреЗ рдмреАрдЪ рдХрд╛рдлреА рдЫрд▓рд╛рдВрдЧ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ RFC рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдореБрдЭреЗ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдпрд╣ рдПрдХ рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдмрджрд▓рд╛рд╡ рдмрди рдЬрд╛рддрд╛ рд╣реИред

рдЖрдк async рдмреНрд▓реЙрдХ рд▓реМрдЯрд╛рдХрд░ рдЗрд╕рд╕реЗ рдирд┐рдЬрд╛рдд рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд, рдЖрдкрдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

fn foo(&self) -> impl Future<Output = T> { // Note: you never could return `Future<T>`...
    async { self.my_service.foo() } // ...and under the proposal you couldn't call `foo` outside of `async` either.
}

рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд╕рд╛рде:

fn foo(&self) -> impl Future<Output = T> {
    async {
        let result = self.my_service.foo();
        self.logger.log("foo executed with result {}.", result);
        result
    }
}

рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рдмрдбрд╝рд╛ рдореБрджреНрджрд╛ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рдореИрдиреНрдпреБрдЕрд▓ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рд╕рдВрдпреЛрдЬрдХреЛрдВ (рдЖрдЬ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛) рд╕реЗ рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдкреНрд░рд╕реНрддрд╛рд╡ рдЖрдкрдХреЛ рдкреБрд░рд╛рдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЗрдзрд░-рдЙрдзрд░ рд░рдЦрдиреЗ рдФрд░ рдЙрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ async рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реА # рдЙрд╕ рдкреИрдЯрд░реНрди рд╕реЗ рднрд░рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПред

рдЦреИрд░, рдпрд╣ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдирд┐рд╣рд┐рддрддрд╛ (рд╣рдо рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ foo() рдпрд╣рд╛рдВ рдПрд╕рд┐рдВрдХ рдпрд╛ рд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдпрд╛ рдирд╣реАрдВ) COM+ рдЬреИрд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдФрд░ рдбрдмреНрд▓реНрдпреВрд╕реАрдПрдл рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдерд╛ . рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рдорд╕реНрдпрд╛ рдереА рдЬрдм рдПрд╕рд┐рдВрдХреНрд╕ рд░рд┐рдореЛрдЯ рдЕрдиреБрд░реЛрдз рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдХреА рдХреЙрд▓ рдХреА рддрд░рд╣ рджрд┐рдЦ рд░рд╣реЗ рдереЗред

рдпрд╣ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ рдХрд┐ рдХреБрдЫ рдЕрдиреБрд░реЛрдз async рдпрд╛ рд╕рд┐рдВрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

fn foo(&self) -> impl Future<Output = T> {
    async {
        let result = self.my_service.foo();
        self.logger.log("foo executed with result {}.", result);
        let bars: Vec<Bar> = Vec::new();
        for i in 0..100 {
           bars.push(self.my_other_service.bar(i, result));
        }
        result
    }
}

рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ bar рд╕рд┐рдВрдХ рд╣реИ рдпрд╛ async рдлрд╝рдВрдХреНрд╢рдиред рдореИрдВ рдЕрдХреНрд╕рд░ рд▓реВрдк рдореЗрдВ рдорд╛рд░реНрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ await рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдкреВрд░реЗ рд▓реЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдмреЗрд╣рддрд░ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдХреЛрдб рд╣реИ рдЬрд┐рд╕рдХреА рдореИрдВрдиреЗ рдХрд▓ рд╕рдореАрдХреНрд╖рд╛ рдХреА рдереА (рдХреЛрдб рдЙрдк-рд░реВрдкреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдореАрдХреНрд╖рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ):

image

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

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЧрд░ рд╣рдо рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдФрд░ рдкрд░рд┐рдЪрд┐рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ await ред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, await рдХреЛ C# рджреНрд╡рд╛рд░рд╛ рдореБрдЦреНрдпрдзрд╛рд░рд╛ рдХреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд╢рд╛рдпрдж рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдЕрддреНрдпрдзрд┐рдХ рдорд╣рддреНрд╡ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред рд╕реА # рдореЗрдВ, рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рди рдХреЗрд╡рд▓ await рдХреАрд╡рд░реНрдб рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ Async рдкреНрд░рддреНрдпрдп рджреНрд╡рд╛рд░рд╛ рднреА рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рджреВрд╕рд░реА рднрд╛рд╖рд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛ await , yield return рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдЭрд╛ рдХрд░рддреА рд╣реИ, рдХреЛрдб рдореЗрдВ рднреА рдкреНрд░рдореБрдЦ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ? рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдХреЛрдб рдореЗрдВ рдХрд┐рд╕реА рдХрд╛ рдзреНрдпрд╛рди рдирд╣реАрдВ рдЬрд╛рдиреЗ рджреЗрддреА рд╣реИрдВред рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИ:

  • рдмрдпрд╛рдиреЛрдВ рдХрд╛ рдХреНрд░рдорд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди (рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд)
  • рдлрд╝рдВрдХреНрд╢рди/рд╡рд┐рдзрд┐ рдХреЙрд▓ (рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░реЗрдВред Pascal рдЬрд╣рд╛рдВ рдПрдХ рдирд▓рд░реА рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрдХ рдЪрд░ рдХреЗ рдмреАрдЪ рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдкрд░ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ)
  • goto (рдареАрдХ рд╣реИ, рдпрд╣ рдПрдХ рд╕рдЦреНрдд рдкрджрд╛рдиреБрдХреНрд░рдо рдирд╣реАрдВ рд╣реИ)
  • рдЬрдирд░реЗрдЯрд░ ( yield return рдмрд╛рд╣рд░ рдЦрдбрд╝реЗ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ)
  • await + Async рдкреНрд░рддреНрдпрдп

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡реЗ рдЕрдкрдиреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рд╢рдХреНрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрдо рд╕реЗ рдЕрдзрд┐рдХ рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреИрд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВред

рдмреЗрд╢рдХ, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдЕрдкрдирд╛рдПред рдпреЛрдЬрдирд╛ рдирд┐рд░рдВрддрд░рддрд╛ (рдЬреИрд╕реЗ call/cc , рдЬреЛ await рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ) рдпрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП, рд░рд╕реНрдЯ рдиреЗ рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЕрдкрдирд╛рдпрд╛ред

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

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


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

рддреАрди рдЕрдХреНрд╖рд░ рд╕рд╣реЗрдЬрдирд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

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

(рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ await foo? рдЕрддреНрдпрдзрд┐рдХ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдФрд░ рд╣рдореЗрдВ рдЗрд╕рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЕрдзрд┐рдХ рдЯреЛрдХрди рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛; рдореЗрд░рд╛ рдЕрд╡рд▓реЛрдХрди рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рд╡рд░реНрдг рд╕рдорд╛рди рдирд╣реАрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред)


@rpjohnst рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╕реНрд╡рд╛рдЧрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕реЗ "рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рдХреЗ рдмрдЬрд╛рдп "рд╕реНрдкрд╖реНрдЯ async" рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ :-)

рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ bar рд╕рд┐рдВрдХ рдпрд╛ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдХрд┐ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рд╕рд╕реНрддрд╛ рдпрд╛ рдорд╣рдВрдЧрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдЖрдИрдУ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╛ рдпрд╣ рдХрд┐рд╕реА рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЫреВрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред (рдпрд╣ @lnicola рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛

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

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ await рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрди рдЕрдиреБрдХреВрд▓рди рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫреЗ рд╕реНрдерд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ async fn s рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдХреЗрддрдХ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рд╕рд╕реНрддреЗ IO рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЙрди рдЕрд╡рд╕рд░реЛрдВ рд╕реЗ рдЪреВрдХрддреЗ рд╣реБрдП рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк "рд▓реВрдк рдореЗрдВ async рдХреЙрд▓" рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓реАрдкреА рд▓рд┐рдВрдЯ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдХрднреА-рдХрднреА рдЪрд▓рд╛рддреЗ рд╣реИрдВред рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рднреА рд╕рдорд╛рди рд▓рд┐рдВрдЯ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛!

"рд╕реНрдкрд╖реНрдЯ async" рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдХреЗрд╡рд▓ "рдХрдо рд╕рд┐рдВрдЯреИрдХреНрд╕" рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ @lnicola рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рддрд╛рдХрд┐ foo() рд╣рдореЗрд╢рд╛ foo рдХреЗ рд╢рд░реАрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдПред рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рддрд╣рдд, рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдХрдо-рд╕рдорд╡рд░реНрддреА рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╡рд╕реНрддреБрддрдГ рд╕рднреА рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред "рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдХреНрд╖рд╛" рдХреЗ рдЕрдВрддрд░реНрдЧрдд, рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдЖрдХрд╕реНрдорд┐рдХ рд╕рдорд░реВрдкрддрд╛, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрдХрд╕реНрдорд┐рдХ рдЕрдВрддрдГрдХреНрд╖реЗрдкрдг рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реЛрддрд╛ рд╣реИ ,

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╕реНрд╡рд╛рдЧрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕реЗ "рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рдХреЗ рдмрдЬрд╛рдп "рд╕реНрдкрд╖реНрдЯ рдПрд╕рд┐рдВрдХреНрд╕" рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ :-)

рдзрд╛рдЧреЗ рдХреЛ "рд╕реНрдкрд╖реНрдЯ рднрд╡рд┐рд╖реНрдп рдирд┐рд░реНрдорд╛рдг, рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдж рдХрд╛ рдирд╛рдо рдЕрдЯрдХ рдЧрдпрд╛ рд╣реИред :рдкреА

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдХрд┐ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рд╕рд╕реНрддрд╛ рдпрд╛ рдорд╣рдВрдЧрд╛ рд╣реИ, рдпрд╛ рдпрд╣ рдЖрдИрдУ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╛ рдпрд╣ рдХрд┐рд╕реА рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЫреВрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред (рдпрд╣ @lnicola рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛

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

"рд╕реНрдкрд╖реНрдЯ async" рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рдгрд╛ рдХреЗрд╡рд▓ "рдХрдо рд╕рд┐рдВрдЯреИрдХреНрд╕" рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ @lnicola рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╕рдВрдЧрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рддрд╛рдХрд┐ foo() рд╣рдореЗрд╢рд╛ foo рдХреЗ рд╢рд░реАрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдПред

рдПрдХ рддрд░рдл рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рджреВрд╕рд░реЗ рдкрд░ рдЖрдк рднрд╡рд┐рд╖реНрдп рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд░рди рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдЧрд░ foo рдЖрдкрдХреЛ рдХреБрдЫ рдЕрдореВрд░реНрддрддрд╛ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ run рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ foo рдмреЗрдХрд╛рд░ рдХрдЪрд░рд╛ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ рдЙрдкрдпреЛрдЧреА рдмрд╛рдд: рдпрд╣ рдХреБрдЫ рдРрд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдмрд╛рдж рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рдЬрд┐рд╕ foo рд╡рд┐рдзрд┐ рдХреЛ рд╣рдо рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмреНрд▓реИрдХрдмреЙрдХреНрд╕ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ Future<Output=T> рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднрд╡рд┐рд╖реНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ await рдХрд░рддреЗ рд╣реИрдВред

рдзрд╛рдЧреЗ рдХреЛ "рд╕реНрдкрд╖реНрдЯ рднрд╡рд┐рд╖реНрдп рдирд┐рд░реНрдорд╛рдг, рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдж рдХрд╛ рдирд╛рдо рдЕрдЯрдХ рдЧрдпрд╛ рд╣реИред :рдкреА

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк "рд╕реНрдкрд╖реНрдЯ рдПрд╕рд┐рдВрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдХреНрд╖рд╛" рд╣реИ :)


рдкреА.рдПрд╕.

рдЖрдЬ рд░рд╛рдд рдореБрдЭреЗ рднреА рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛: рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕реА # рдПрд▓рдбреАрдПрдо рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, @HaloFour , @gafter рдпрд╛ @CyrusNajmabadi рдЬреИрд╕реЗ рд▓реЛрдЧред рдЙрдирд╕реЗ рдкреВрдЫрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреНрдпреЛрдВ рд▓рд┐рдпрд╛ред рдореИрдВ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рднреА рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ :) рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рдХрдИ рдмрд╣рд╕реЗрдВ рдереАрдВ рдФрд░ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рдереЗ рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

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

рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк "рд╕реНрдкрд╖реНрдЯ рдПрд╕рд┐рдВрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдХреНрд╖рд╛" рд╣реИ :)

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

рдХреНрдпрд╛ рдпрд╣ рдХреА рдХреАрдордд рдХреЗ рд▓рд┐рдП, рдЖрдВрддрд░рд┐рдХ рдзрд╛рдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рд╕рдВрдЧрдд рдпрд╛ рддреЛ рдореБрдЦреНрдп рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╣реИ, рдПрдХ "рд╕реНрдкрд╖реНрдЯ async рд╕реНрдкрд╖реНрдЯ рдЗрдВрддрдЬрд╛рд░" рд╡рд┐рдХрд▓реНрдк рд╢рд╛рдорд┐рд▓ рд╣реИред (рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧ рджреЗрдЦреЗрдВред)

рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕реА # рдПрд▓рдбреАрдПрдо рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА?

рдореБрдЦреНрдп рдЖрд░рдПрдлрд╕реА рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдХрд┐рдпрд╛ред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдпрд╛рдж рд╣реИ, рдЙрд╕рдореЗрдВ рд╕реЗ рдЬреЛ рдореБрдЦреНрдп рдмрд╛рдд рд╕рд╛рдордиреЗ рдЖрдИ, рд╡рд╣ рдереА Future рдХреЛ async fn s рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдпред C# рдореЗрдВ, рдЖрдк Task рдХреЛ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХреБрдЫ рдирд┐рдпрдВрддреНрд░рдг рд╣реЛ рд╕рдХреЗред рд▓реЗрдХрд┐рди рд░рд╕реНрдЯ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛)- рд╕рднреА рд╡рд╛рдпрджрд╛ рдПрдХ рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдЙрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рд░ рдмрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

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

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

рдЖрдЬ рд░рд╛рдд рдореБрдЭреЗ рднреА рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛: рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕реА # рдПрд▓рдбреАрдПрдо рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, @HaloFour , @gafter рдпрд╛ @CyrusNajmabadi рдЬреИрд╕реЗ рд▓реЛрдЧред рдЙрдирд╕реЗ рдкреВрдЫрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреНрдпреЛрдВ рд▓рд┐рдпрд╛ред

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

await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреЗрд╡рдХреВрдлреА рднрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭ рдкрд░ рдЪрд┐рд▓реНрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ; рдореИрдВ рдПрдХ рдПрд╕рд┐рдВрдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдиреЛрдм рд╣реВрдВ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ):

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рдПрдХ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдерд╛:

let stuff = func()#?;
let chain = blah1()?.blah2()#.blah3()#?;

рдпрд╣ рдмрд╣реБрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдкрдврд╝рддрд╛ рд╣реИ: рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ ( # ), рдлрд┐рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ ( ? )ред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреАрд╡рд░реНрдб рдореЗрдВ рд╣реИ, рдЬрд╣рд╛рдВ .await рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд╕рджрд╕реНрдп рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред # рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдСрдкрд░реЗрдЯрд░ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдРрд╕рд╛ рд▓рдЧрд╛ред рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ:

let stuff = #func()?;

рдпрд╛ рдмрд┐рд▓реНрд▓реА рднреА:

let stuff = func#()?; // :-D :-D

рдХреНрдпрд╛ рдЗрд╕ рдкрд░ рдХрднреА рдЪрд░реНрдЪрд╛ рд╣реБрдИ рд╣реИ?

(рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ "рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреАрдмреЛрд░реНрдб рдореИрд╢" рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд░реНрд▓ рдХреБрдЦреНрдпрд╛рдд рд╣реИ ... :- рдбреА)

@rayvector https://github.com/rust-lang/rust/issues/50547#issuecomment -388108875, 5рд╡рд╛рдВ рд╡рд┐рдХрд▓реНрдкред

@CyrusNajmabadi рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЦреНрдп рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рд╕реВрдЪреАрдмрджреНрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рд╡рд┐рдХрд▓реНрдк рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд░рд╕реНрдЯ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИ, рдпрд╛ рд╢рд╛рдпрдж рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИ? рдпрд╣ рд╡рд┐рд╖рдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдВрдмрд╛ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рд░рд╕реНрдЯ рдХреЛ рд╡рд░реНрддрдорд╛рди C#/TS/... await рддрд░реАрдХреЗ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА "рд╡рд┐рд░рд╛рд╕рдд" рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдпрд╣ рд╕реА # рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдирдИ рдЖрдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ?

рд╕реА # рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЦрд┐рд▓рд╛рдл рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдСрдкрд░реЗрдЯрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ await foo? рдкрд╣рд▓реЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ ? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╕рд╛рде рд╣реА рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕реА # рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЙрд▓рд░ рдереНрд░реЗрдб рдореЗрдВ рдкрд╣рд▓реЗ await рддрдХ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ GetEnumerator рдкрд╣рд▓реА рдмрд╛рд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

IEnumerable<int> GetInts(int n)
{
   if (n < 0)
      throw new InvalidArgumentException(nameof(n));
   for (int i = 0; i <= n; i++)
      yield return i;
}

рдореЗрд░реА рдкрд╣рд▓реА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рдмрд╛рдж рдХреА рдЪрд░реНрдЪрд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрддред

@Pzixel рдУрд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд╣ рдпрд╛рдж рдЖрдпрд╛ рдЬрдм рдореИрдВ рдкрд╣рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХрд┐рдорд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ ...

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВрдиреЗ рдЙрд╕ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рджреЗрдЦреА рд╣реИред

рдХреНрдпрд╛ рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ/рд╡рд┐рд░реБрджреНрдз рдХреЛрдИ рддрд░реНрдХ рд╣реИрдВ?

@rayvector рдореИрдВрдиреЗ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдпрд╣рд╛рдБ рдереЛрдбрд╝рд╛ рддрд░реНрдХ рджрд┐рдпрд╛ред рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд╣ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ:

"рд░реИрдВрдбрдо рдХреАрдмреЛрд░реНрдб рдореИрд╢ рдСрдлрд╝ рд╕рд┐рдВрдмрд▓" рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрд░реНрд▓ рдмрджрдирд╛рдо рд╣реИ

рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ await!(f)? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдВрддрд┐рдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрджреНрдз рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдареЛрд╕ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИрдВ ( ? рдСрдкрд░реЗрдЯрд░ рд╕рд╣рд┐рдд) рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА "рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ":

  • await f?
  • await? f
  • await { f }?
  • await(f)?
  • (await f)?
  • f.await?

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

рдореИрдВ рдпрд╛ рддреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдСрдкрд░реЗрдЯрд░ (рдЬреИрд╕реЗ ~ ) рдпрд╛ рдмрд┐рдирд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдЙрдЪреНрдЪрддрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

  • await f? рдкрд╣рд▓реЗ ? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореА рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред
  • (await f)? рдкрд╣рд▓реЗ рднрд╡рд┐рд╖реНрдп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╡рд┐рд░реБрджреНрдз ? рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ (рд╕рд╛рдорд╛рдиреНрдп рдЬрдВрдЧ рдСрдкрд░реЗрдЯрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдХрд╛рд░рдг)
  • await? f `(рдкреНрд░рддреАрдХреНрд╖рд╛ f)? рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ "рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдирд╛" рдПрдХ рд╕реБрдкрд░ рдЖрдо рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмрд╣реБрдд рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

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

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

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

рдПрдХ рд╕реА # рдбрд┐рдЬрд╛рдЗрдирд░ рд╕реЗ рдкреВрдЫрдирд╛ рдХрд┐ рдЬрдВрдЧ рдХреА рднрд╛рд╖рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдлрд┐рдЯ рдмреИрдарддреА рд╣реИ ... рджрд┐рд▓рдЪрд╕реНрдк :)

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

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

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

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

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

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

--

рд╕рд╛рде рд╣реА рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕реА # рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЙрд▓рд░ рдереНрд░реЗрдб рдореЗрдВ рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рддрдХ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЙрд╕реА рддрд░рд╣ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдирдХрд╛рд░рд╛рддреНрдордХрддрд╛ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ GetEnumerator рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

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

```рд╕реА#
рд╢реВрдиреНрдп рдХреБрдЫ рдЧрдгрдирд╛рдХрд░реНрддрд╛ (рдПрдХреНрд╕ рддрд░реНрдХ)
{
// рдорд╛рдиреНрдп Args, рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдХрд░реЗрдВред
рдХреБрдЫ EnumeratorImpl (рддрд░реНрдХ) рд╡рд╛рдкрд╕ рдХрд░реЗрдВ;
}

рд╢реВрдиреНрдп SomeEnumeratorImpl(X args)
{
//...
рдЙрдкрдЬ
//...
}

People have to write this *all the time* because of the unexpected behavior that the iterator pattern has.  I think we were worried about expensive work happening initially.  However, in practice, that doesn't seem to happen, and people def think about the work as happening when the call happens, and the yields themselves happening when you actually finally start streaming the elements.

Linq (which is the poster child for this feature) needs to do this *everywhere*, this highly diminishing this choice.

For ```await``` i think things are *much* better.  We use 'async/await' a ton ourselves, and i don't think i've ever once said "man... i wish that it wasn't running the code synchronously up to the first 'await'".  It simply makes sense given what the feature is.  The feature is literally "run the code up to await points, then 'yield', then resume once the work you're yielding on completes".  it would be super weird to not have these semantics to me since it is precisely the 'awaits' that are dictating flow, so why would anything be different prior to hitting the first await.

Also... how do things then work if you have something like this:

```c#
async Task FooAsync()
{
    if (cond)
    {
        // only await in method
        await ...
    }
} 

рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрднреА рднреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЕрдЧрд░ "рдирд┐рд╖реНрдкрд╛рджрди рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рддрдХ рдХреЙрд▓рд░ рдереНрд░реЗрдб рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ? f рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреЗ рд░реВрдк рдореЗрдВ `(рдкреНрд░рддреАрдХреНрд╖рд╛ f)? рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ "рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдирд╛" рдПрдХ рд╕реБрдкрд░ рдЖрдо рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдмрд╣реБрдд рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдпрд╣ рдореЗрд░реЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдзреНрд╡рдирд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ 'рдкреНрд░рддреАрдХреНрд╖рд╛' рдХреЛ рд╕рд░реНрд╡реЛрдЪреНрдЪ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд░рд▓ рд╕рдВрдЪрд╛рд▓рди рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╕реА # рд╕реЗ рд╣рдо рдПрдХ рдмрд╛рдд рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд▓реЛрдЧреЛрдВ рдХреА рдЕрдВрддрд░реНрдЬреНрдЮрд╛рди рд╕рдлреЗрдж рдЬрдЧрд╣ рд╕реЗ рдмрдВрдзреА рд╣реБрдИ рд╣реИред рддреЛ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ "рдПрдХреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рд╣реИ?" рддреЛ рдпрд╣ рддреБрд░рдВрдд рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ await рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ ? рд╕реЗ рдХрдо рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ? рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (await x)? рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛ред

рдЗрд╕реЗ await (x?) рд░реВрдк рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧреЗрдЧрд╛, рдФрд░ рднрд╡рд┐рд╖реНрдп/рдХрд╛рд░реНрдп рдХрд╛ 'рдкрд░рд┐рдгрд╛рдо' рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдЧрд╛, рдФрд░ 'рдкреНрд░рддреАрдХреНрд╖рд╛' рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ . рдпрджрд┐ рд╡рд╣ рдлрд┐рд░ рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП 'рдкреНрд░рддреАрдХреНрд╖рд╛' рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реЛрдирд╛ рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╛рдж рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП await? x? рдкреНрд░рддреНрдпреЗрдХ ? рдХреЛрдб рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдХрд╕рдХрд░ рдмрд╛рдВрдзрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╕рдмрд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдкрд╣рд▓рд╛ ? await (рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ x ред

рдЕрдЧрд░ "рдирд┐рд╖реНрдкрд╛рджрди рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рддрдХ рдХреЙрд▓рд░ рдереНрд░реЗрдб рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

рдЬрдм рддрдХ рдлреЛрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреА рд╡рд╛рдкрд╕реА рдорд╛рди рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ FooAsync , рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реЗ FooAsync рдХреЗ рд╢рд░реАрд░ рд░рди рддрдХ рдпрд╛ рддреЛ рдПрдХ await рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИред

рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Rust Future s рдкреЛрд▓-рдЪрд╛рд▓рд┐рдд, рд╕реНрдЯреИрдХ-рдЖрд╡рдВрдЯрд┐рдд, рдФрд░ poll рдкрд╣рд▓реА рдХреЙрд▓ рдХреЗ рдмрд╛рдж рдЕрдЪрд▓ рд╣реИрдВред рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдкрд╛рд╕ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдвреЗрд░ рдкрд░ Future s, рдпрд╛ рдлрд┐рд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдЕрдВрджрд░ рдЙрдк-рдореВрд▓реНрдп Future , рдЕрдХреНрд╕рд░ "рд╕реНрдЯреИрдХ рдлреНрд░реЗрдо" рдкрд░ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ async fn рдХреЙрд▓ рдХрд░рдирд╛ред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдпрд╛ рддреЛ a) C# рдЬрдирд░реЗрдЯрд░-рдЬреИрд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдП рд╣реИрдВ, рдЬрд╣рд╛рдВ рдХреЛрдИ рдХреЛрдб рдЖрд╣реНрд╡рд╛рди рдкрд░ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╛ b) рдХреЛрдЯрд▓рд┐рди рдХреЛрд░рдЖрдЙрдЯрд┐рди-рдЬреИрд╕реЗ рд╢рдмреНрджрд╛рд░реНрде, рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рднреА рддреБрд░рдВрдд рдФрд░ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ (рдХреНрд▓реЛрдЬрд░-рдЬреИрд╕реЗ async { .. } рдмреНрд▓реЙрдХ рдЬрдм рдЖрдкрдХреЛ рд╕рдорд╡рд░реНрддреА рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред

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

@CyrusNajmabadi Rust рдореЗрдВ, Future рдЖрдорддреМрд░ рдкрд░ рддрдм рддрдХ рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдЬрдм рддрдХ рдХрд┐ рдЗрд╕реЗ Task рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ F# Async ):

let bar = foo();

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ foo() рд░рд┐рдЯрд░реНрди рдПрдХ Future , рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдкреЙрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдЬреЛ рдХрд┐ F# Async ):

tokio::run(bar);

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

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реА # рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдЕрд▓рдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реА # рдореЗрдВ рдЬрдм рдЖрдк foo() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рддреБрд░рдВрдд Task рдЪрд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ await рддрдХ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реА # рдореЗрдВ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред .

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ ... рдЪреАрдЬреЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ [...] рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрднреА рднреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд░ "рдирд┐рд╖реНрдкрд╛рджрди рдкрд╣рд▓реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рддрдХ рдХреЙрд▓рд░ рдереНрд░реЗрдб рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

рдпрджрд┐ рдЖрдк FooAsync() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рд╕реНрдкреЙрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреЛрдб рдХреЛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдПрдЧрд╛, await рдХрднреА рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ рддреБрд░рдВрдд () рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рд░рд╕реНрдЯ рдХрд╛ void рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ)

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ "рдирд┐рд╖реНрдкрд╛рджрди рдХреЙрд▓рд░ рдереНрд░реЗрдб рдореЗрдВ рдкрд╣рд▓реА рдкреНрд░рддреАрдХреНрд╖рд╛ рддрдХ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ", рдпрд╣ "рдирд┐рд╖реНрдкрд╛рджрди рддрдм рддрдХ рдирд╣реАрдВ рдЪрд▓рддрд╛ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рди рд╣реЛ (рдЬреИрд╕реЗ tokio::run )"

рддрдм рддрдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬрдм рддрдХ рдХреЙрд▓рд░ FooAsync рдХреЗ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛, рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ FooAsync рдХрд╛ рд╢рд░реАрд░ рддрдм рддрдХ рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдпрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖ рдЬрд╛рддреАред

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

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдпрд╛ рддреЛ a) C# рдЬрдирд░реЗрдЯрд░-рдЬреИрд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд╕рд╛рде рдлрдВрд╕ рдЧрдП рд╣реИрдВ, рдЬрд╣рд╛рдВ рдХреЛрдИ рдХреЛрдб рдЖрд╣реНрд╡рд╛рди рдкрд░ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╛ b) рдХреЛрдЯрд▓рд┐рди рдХреЛрд░рдЖрдЙрдЯрд┐рди-рдЬреИрд╕реЗ рд╢рдмреНрджрд╛рд░реНрде, рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рднреА рддреБрд░рдВрдд рдФрд░ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ (рдХреНрд▓реЛрдЬрд░-рдЬреИрд╕реЗ async { рдХреЗ рд╕рд╛рдеред . } рдмреНрд▓реЙрдХ рдЬрдм рдЖрдкрдХреЛ рд╕рдорд╡рд░реНрддреА рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)ред

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

@CyrusNajmabadi Ickред рдпрд╣ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред рдХрдИ рдмрд╛рд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХрднреА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЗрдВрддрдЬрд╝рд╛рд░ рдирд╣реАрдВ рдХрд░ рдкрд╛рддрд╛ (рдЕрдХреНрд╕рд░ рд░рджреНрдж рдХрд░рдиреЗ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рдХрд╛рд░рдг)ред рдПрдХ рджреЗрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдЕрднреА рднреА рдЙрди рд╢реБрд░реБрдЖрддреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ (рдЬреЛ рд╕рдмрд╕реЗ рдЖрдо рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рд▓реЛрдЧ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред

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

рдЬрдВрдЧ/рд╣рд╛рд╕реНрдХреЗрд▓/рдПрдл# рд╢реИрд▓реА рдХреЗ рд╕рд╛рде, рдпрд╛ рддреЛ Future рдЪрд▓рддрд╛ рд╣реИ (рд╕рд╣реА рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рд╛рде), рдпрд╛ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдХреЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред

@Pauan @rpjohnst рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд╡реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдереЗ рдЬрд┐рди рдкрд░ рд╣рдордиреЗ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрддрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ред

рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдереЗ рдХрд┐ рдпрд╣ "рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдХрд░реЗрдВред рдЖрдкрдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдкреЙрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛", рд╣рдордиреЗ рдЗрд╕реЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХреНрд▓реАрдирд░ рдкрд╛рдпрд╛ рдХрд┐ рдорд╛рдВрдЧ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВред рдпрд╛рдиреА Func<Task> рдЬрд┐рддрдирд╛ рдЖрд╕рд╛рди рдХреБрдЫред

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

рд╕реА # рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдпрд╛ рддреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рд╣реИ, рдпрд╛ рдЕрдиреНрдпрдерд╛ рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд┐рдЧрд▓ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

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

рдлрд┐рд░ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред

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

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

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

рдореИрдВ рд╢реБрд░реБрдЖрддреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ: рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рдХрднреА рднреА " Future рдХреЛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдзрд░-рдЙрдзрд░ рдирд╣реАрдВ рд╣реЛ рдкрд╛рдПрдВрдЧреЗ"?

рд░рд╕реНрдЯ рдореЗрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ Future s рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк Future s рдХреЛ рдПрдХ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ (async/wait рд╕рд╣рд┐рдд, рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рд╕рд╣рд┐рдд, рдЖрджрд┐) рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдПрдХ рдмрдирд╛рддрд╛ рд╣реИ рд╕рд┐рдВрдЧрд▓ рдлреНрдпреВрдЬреНрдб Future рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЙрдк- Future s рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдФрд░ рдлрд┐рд░ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░ рдкрд░ ( main ) рдлрд┐рд░ рдЖрдк рдЗрд╕реЗ рд╕реНрдкреЙрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tokio::run (рдпрд╛ рд╕рдорд╛рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЙрд╕ рдПрдХрд▓ tokio::run рдХреЙрд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛ main , рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ Future s рдирд╣реАрдВ рдкреИрджрд╛ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЖрдк рдмрд╕ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦреЗрдВред рдФрд░ рд░рдЪрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдкреЙрдирд┐рдВрдЧ/рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди/рд░рджреНрджреАрдХрд░рдг/рдЖрджрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИред рд╕рд╣реА рдврдВрдЧ рд╕реЗред

рдореИрдВ рднреА рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред рдЬрдм рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд╣рддрд╛ рд╣реВрдВ:

рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрддрдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ред

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

рдореИрдВ рд╢реБрд░реБрдЖрддреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ: рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рдХрднреА рднреА "рднрд╡рд┐рд╖реНрдп рдХреЛ рдЬрдиреНрдо рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдзрд░-рдЙрдзрд░ рдирд╣реАрдВ рд╣реЛ рдкрд╛рдПрдВрдЧреЗ"?

рд╕рднреА рд╕рдордп :)

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

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

рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рд░рджреНрджреАрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрджреНрдпрдкрд┐?

рдФрд░ рд░рдЪрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╕реНрдкреЙрдирд┐рдВрдЧ/рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди/рд░рджреНрджреАрдХрд░рдг/рдЖрджрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рддреА рд╣реИред рд╕рд╣реА рдврдВрдЧ рд╕реЗред

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

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

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

рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рд░рджреНрджреАрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрджреНрдпрдкрд┐?

рд░рджреНрджреАрдХрд░рдг рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ (рд╣рдорд╛рд░реЗ рд▓рд┐рдП) рдХреЗ рд▓рд┐рдП рдПрдХ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рди рддреЛ рджреВрд╕рд░реЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

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

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

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

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

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

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп if/then/else рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ:

async fn foo() {
    if some_condition {
        await!(bar());
    }
}

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдпрд╣ рд╕реА # рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╣реИред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░/рдлрд┐рд░/рдЕрдиреНрдп рддрд░реНрдХ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ:

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

рд╣рдорд╛рд░реЗ рдбреЛрдореЗрди рдореЗрдВ 'рдкреНрд░рддреАрдХреНрд╖рд╛' рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╡реНрдпрдХреНрддрд┐ рдХреЛ "рдореВрд▓реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ", рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдирд┐рд░реНрдзрд╛рд░рдг/рдШрдЯрдХ/рдЖрджрд┐ рд╣реИред "рдХреНрдпрд╛ рдореБрдЭреЗ рдореВрд▓реНрдп рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?"

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

рд╡реИрд╕реЗ рднреА, рдореИрдВ рд╕рд┐рдВрдХ/рдПрд╕рд┐рдВрдХреНрд╕ рд░рд╛рдп рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдКрдВрдЧрд╛ред рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрд▓рдЧ рдореЙрдбрд▓ рд╣реИрдВред :)

рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдореИрдВрдиреЗ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рджреА рд╣реИ рдХрд┐ рд╕реА # рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рд╕реЛрдЪрддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрджрдЧрд╛рд░ рд╣реИред рдЕрдЧрд░ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдХреЛрдИ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдП рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред

@CyrusNajmabadi рд╣рд╛рдВ, рдЖрдкрдХреА рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХрд╛рдлреА рдорджрджрдЧрд╛рд░ рдереАред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ await? foo рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ "рд╕реНрдкрд╖реНрдЯ async " рдкреНрд░рд╕реНрддрд╛рд╡ рднреА рдкрд╕рдВрдж рд╣реИ)ред

BTW, рдпрджрд┐ рдЖрдк рдореЙрдбрд▓рд┐рдВрдЧ async/рд╕рд┐рдВрдХ рдХрд╛рд░реНрдп рдХреЗ рдЖрд╕рдкрд╛рд╕ .net рдореЙрдбрд▓ рдХреА рд╕рднреА рдкреЗрдЪреАрджрдЧрд┐рдпреЛрдВ рдФрд░ рдЙрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рднреА рдкреЗрд╢реЗрд╡рд░реЛрдВ/рд╡рд┐рдкрдХреНрд╖реЛрдВ рдкрд░ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд░рд╛рдп рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ @stephentoub рдмрд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдЧрд╛ред рд╡рд╣ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ, рдкреЗрд╢реЗрд╡рд░реЛрдВ/рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ, рдФрд░ рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдХреЗ рдореЙрдбрд▓ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдореБрдЭрд╕реЗ рд▓рдЧрднрдЧ 100 рдЧреБрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рд╡рд╣ рдпрд╣рд╛рдВ .net рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ (рдЗрд╕рдореЗрдВ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдк рдФрд░ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдк рд╢рд╛рдорд┐рд▓ рд╣реИрдВ), рдФрд░ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдЗрд╕реЗ рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ рд╣реИред рд╡рд╣ рдЙрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рдкреВрд░реНрдг рд▓рд╛рдЧрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рджрд░реНрджрдирд╛рдХ рд░реВрдк рд╕реЗ рдЕрд╡рдЧрдд рд╣реИ рдЬреЛ рдиреЗрдЯ рдиреЗ рд▓рд┐рдпрд╛ рд╣реИ (рдЬреЛ рдПрдЪрдЯреАрдИ рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬреЛ рдЕрдм рд╡реИрд▓реНрдпреВ рдЯрд╛рд╕реНрдХ рдореМрдЬреВрдж рд╣реИ), рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдРрд╕рд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдк рд▓реЛрдЧ рд╢реВрдиреНрдп/рдХрдо рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ -рдХреЙрд╕реНрдЯ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рдиред

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

рдореИрдВ рдЕрднреА рднреА await? future рдкрдХреНрд╖ рдореЗрдВ рд╡реЛрдЯ рдХрд░реВрдВрдЧрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдкрд░рд┐рдЪрд┐рдд рд▓рдЧ рд░рд╣рд╛ рд╣реЛред рдХреНрдпрд╛ рдЗрдирдХреА рд░рдЪрдирд╛ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрдореА рд╣реИ?

рдпрд╣рд╛рдБ рдардВрдб (F#) рдмрдирд╛рдо рдЧрд░реНрдо (C#,JS) asyncs рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХрд╛ рдПрдХ рдФрд░ рдЧрд╣рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╣реИ: http://tomasp.net/blog/async-csharp-differences.aspx

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЕрдм рдПрдХ рдирдпрд╛ RFC рд╣реИ рдЬреЛ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд┐рдирд╛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ await рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛: https://github.com/rust-lang/rfcs/pull/2442

await {} рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдкрд╕рдВрджреАрджрд╛ рд╣реИ, unsafe {} рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкреВрд░реНрд╡рддрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред

let value = await { future }?;

@seunlanlege
рд╣рд╛рдБ, рдпрд╣ рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд▓реЛрдЧреЛрдВ рдХреА рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕ рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

let value = await {
   let val1 = future1;
   future2(val1)
}

рд▓реЗрдХрд┐рди рд╡реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

@Pzixel
рдЕрдЧрд░ рдореИрдВ рдЖрдкрдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдЖрдк рдорд╛рди рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд▓реЛрдЧ рдорд╛рди рд▓реЗрдВрдЧреЗ рдХрд┐ рдлреНрдпреВрдЪрд░реНрд╕ рдХреЛ await {} рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдореИрдВ рдЗрд╕рд╕реЗ рдЕрд╕рд╣рдордд рд╣реВрдВред await {} рдХреЗрд╡рд▓ рдЙрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдХрд╛ рдмреНрд▓реЙрдХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИред

let value = await {
    let future = create_future();
    future
};

рдФрд░ рдпрд╣ рдПрдХ рдРрд╕рд╛ рдкреИрдЯрд░реНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП

рд╕рд░рд▓реАрдХреГрдд

let value = await { create_future() };

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

рдХреНрдпрд╛ await рдПрдХ рдкреИрдЯрд░реНрди ( ref рдЖрджрд┐ рдХреЗ рдЕрд▓рд╛рд╡рд╛) рдмрдирд╛рдирд╛ рдЕрдиреБрдХреВрд▓ рд╣реИ?
рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

let await n = bar();

рдореИрдВ рдЙрд╕ async рдкреИрдЯрд░реНрди рдХреЛ await рддреБрд▓рдирд╛ рдореЗрдВ рдХреЙрд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЗрд╕реЗ рдкреИрдЯрд░реНрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрдзрд┐рдХ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдкреИрдЯрд░реНрди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЖрдо рддреМрд░ рдкрд░ рдЙрдирдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рджреЛрд╣рд░реА рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

https://doc.rust-lang.org/nightly/std/task/index.html рдХреЗ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХрд╛рд░реНрдп рдореЛрдб рдореЗрдВ libcore рд╕реЗ reexports рдФрд░ liballoc рдХреЗ рд▓рд┐рдП reexports рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрдирд╛рддрд╛ рд╣реИ ... рдЙрдк-рдЗрд╖реНрдЯрддрдоред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВрдиреЗ рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реАред рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рд╣реИрдВ:

  • [x] UnsafePoll рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ Poll рдПрдирдо рдХреЗ рдмрд╣реБрдд рд╕рдорд╛рди рдирд╛рдо рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдореИрдВ UnsafePoll рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП UnsafeTask ред
  • [x] рдлреНрдпреВрдЪрд░реНрд╕ рдХреНрд░реЗрдЯ рдореЗрдВ рдХреЛрдб рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдмрдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм, рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб task.rs рдореЗрдВ рдПрдХ рд╕рд╛рде рдмрдВрдЪ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВред
  • [x] TaskObj#from_poll_task() рдХрд╛ рдПрдХ рдЕрдЬреАрдм рдирд╛рдо рд╣реИред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдирд╛рдордХрд░рдг new()
  • [x] TaskObj#poll_task рдмрд╕ poll() ред рдХреНрд╖реЗрддреНрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ poll рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ poll_fn рдЬреЛ рднреА рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╕реВрдЪрдХ рд╣реИ
  • Waker TaskObj рдХреЗ рд╕рдорд╛рди рд░рдгрдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯреИрдХ рдкрд░ vtable рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ рдПрдХ рд╡рд┐рдЪрд╛рд░, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдХреНрдпрд╛ рдпрд╣ рддреЗрдЬрд╝ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдо рд╕рдВрдХреЗрдд рд╣реИ?
  • [ ] dyn рдЕрдм рдмреАрдЯрд╛ рдореЗрдВ рд╕реНрдерд┐рд░ рд╣реИред рдХреЛрдб рдХреЛ рд╕рдВрднрд╡рддрдГ dyn рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ

рдореИрдВ рдЗрд╕ рд╕рд╛рдорд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рднреА рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред @cramertj @aturon рд╡рд┐рд╡рд░рдг рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рд╕реНрдХреЙрд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЭрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред

рд╕рднреА Future рд▓рд┐рдП рдмрд╕ рдПрдХ рд╡рд┐рдзрд┐ await() рдХреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ?

    /// just like and_then method
    let x = f.and_then(....);
    let x = f.await();

    await f?     =>   f()?.await()
    await? f     =>   f().await()?

/// with chain invoke.
let x = first().await().second().await()?.third().await()?
let x = first().await()?.second().await()?.third().await()?
let x = first()?.await()?.second().await()?.third().await()?

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

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

@elszben рд╕рдВрдХрд▓рдХ рдЬреЛ рдХреБрдЫ рднреА рдпрд╣ рдЪрд╛рд╣рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдпрд╣ рдЪрд╛рд╣рддрд╛ рд╣реИ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ред

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдкреЛрд╕реНрдЯ рд╣рдЯрд╛ рджреА рдЧрдИ

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

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ async fn рдФрд░ #[must_use] рдХреЗ рдмреАрдЪ рдХреА рдмрд╛рддрдЪреАрдд рдХреЛ рджреЗрдЦрд╛ рд╣реИ?

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ async fn , рддреЛ рдЗрд╕реЗ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдХреЛрдб рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ Future рд▓реМрдЯрд╛рддрд╛ рд╣реИ; рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА async fn рдореЗрдВ "рдмрд╛рд╣рд░реА" impl Future рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд #[must_use] async fn рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЖрдк Future рд╕рд╛рде рдХреБрдЫ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рд╢реАрд░реНрд╖ рдкрд░, рдпрджрд┐ рдЖрдк #[must_use] рдХреЛ async fn рд╕реНрд╡рдпрдВ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╡рд╛рдкрд╕реА рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк #[must_use] async fn foo() -> T { ... } рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд┐рдП рдмрд┐рдирд╛ await!(foo()) рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ async fn рдФрд░ #[must_use] рдХреЗ рдмреАрдЪ рдХреА рдмрд╛рддрдЪреАрдд рдХреЛ рджреЗрдЦрд╛ рд╣реИ?

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, https://github.com/rust-lang/rust/issues/51560 рджреЗрдЦреЗрдВред

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

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

@warlord500 рдЖрдк рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд▓рд╛рдЦреЛрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рд╕рдВрдкреВрд░реНрдг await рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ : рдпрджрд┐ рдЖрдкрдХреА рд░рд╛рдп рдореЗрдВ рдорддрднреЗрдж рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ! рдореИрдВ рдЙрддреНрд╕реБрдХ рд╣реВрдВ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд╣рддреЗ рд╣реИрдВ
рд╣рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреИрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП?

@warlord500 рдХреНрдпреЛрдВрдХрд┐ MS рдЯреАрдо рдиреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╣рдЬрд╝рд╛рд░реЛрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдФрд░ рд▓рд╛рдЦреЛрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ред рдореИрдВ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдФрд░ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХрднреА рднреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдмрджреНрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╕рдЯреАрдХ рдЙрджреНрдзрд░рдг рд╣реИ, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ:

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

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

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХреГрдкрдпрд╛ рдЙрд╕ рд▓рд┐рдВрдХ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЙрджреНрдзрд░рдг рдорд┐рд▓рд╛ рд╣реИ,
рд╢реБрдХреНрд░рд┐рдпрд╛ред

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

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХреГрдкрдпрд╛ рдЙрд╕ рд▓рд┐рдВрдХ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЙрджреНрдзрд░рдг рдорд┐рд▓рд╛ рд╣реИ,
рд╢реБрдХреНрд░рд┐рдпрд╛ред

рд▓реЗрдХрд┐рди... рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдХрд╣рд╛ рдХрд┐ рдЖрдкрдиреЗ рдкреВрд░рд╛ рд╕реВрддреНрд░ рдкрдврд╝ рд▓рд┐рдпрд╛...

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ: https://github.com/rust-lang/rust/issues/50547#issuecomment -388939886ред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рд╕рд╛рдЗрд░рд╕ рдкреЛрд╕реНрдЯ рдкрдврд╝реЗрдВ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реЗ C#/.Net рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ, рдпрд╣ рдПрдХ рдЕрдореВрд▓реНрдп рдЕрдиреБрднрд╡ рд╣реИ рдЬрд┐рд╕реЗ рд░рд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрднреА-рдХрднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднрд╛рдЧ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ

рдЙрджреНрдзрд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдкрд░реАрдд рдХрд╣рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдЦреБрдж рднреА рдРрд╕рд╛ рд╣реА рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рджрд┐рди-рдкреНрд░рддрд┐рджрд┐рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреГрдкрдпрд╛?

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

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

рдореЙрдбрд░реЗрдЯрд░ рдиреЛрдЯ: @Pzixel рд╕рдореБрджрд╛рдп рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдкрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣рдорд▓реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдРрд╕рд╛ рдлрд┐рд░ рд╕реЗ рдордд рдХрд░рдирд╛ред рдпрджрд┐ рд╣рдорд╛рд░реА рдореЙрдбрд░реЗрд╢рди рдиреАрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рд╕рд╛рде [email protected] рдкрд░

@crabtw рдореИрдВрдиреЗ рдХрд┐рд╕реА рдХреА рднреА рдЖрд▓реЛрдЪрдирд╛ рдирд╣реАрдВ рдХреАред рдпрд╣рд╛рдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдЦреЗрдж рд╣реИред

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

рд╕рдореБрджрд╛рдп рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдкрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╣рдорд▓реЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рд╣реИред

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

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

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

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ x.y().await!().z() рдЬреИрд╕реЗ рдЪреЗрдирд┐рдВрдЧ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдЙрддреНрддрд░ рд╕реБрдЭрд╛рддрд╛ рд╣реИред

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

@withboats рд╣рд╛рдБ, рдпрд╣ рд╕рд╣реА рд╣реИред рдореИрдВ рдЗрд╕ рднрд╛рдЧ рдХреЛ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдЙрджреНрдзреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЕрдкрд╡рд╛рдж рд╣реИ ?

рдпрджрд┐ рдХреЗрд╡рд▓ рдЕрдкрд╡рд╛рдж рд╣реИ рддреЛ await? foo рдХреЛ (await foo)? рд╢реЙрд░реНрдЯрдХрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдирд╛ рдФрд░ рджреЛрдиреЛрдВ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред

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

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

Matching lines: 139 Matching files: 10 Total files searched: 77

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

рдореИрдВрдиреЗ рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдмрдирд╛рдпрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдЙрдирдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдорди рд▓рдЧрд╛рдХрд░ рдкрдврд╝рд╛рдИ рдХрд░реЛ!

https://github.com/MajorBreakfast/rust-blog/blob/master/posts/2018-06-19-outer-return-type-approach.md

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

рдЖрдВрддрд░рд┐рдХ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд┐рдВрддрд╛ рд╣реИ: Stream s рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрдм рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ async fn foo() -> impl Stream<Item = T> рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдФрд░ async fn foo() -> impl Future<Output = T> рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдо рдПрдХ async_stream рдХреАрд╡рд░реНрдб рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред

@Ekleog Stream рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ async рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ impl Trait рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд▓рдХреНрд╖рдг рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓рдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдмрд╛рд╣рд░реА рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧрд╛ рдпрджрд┐ рд╣рдо рдПрдХ рджрд┐рди async рдЬрдирд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

async_gen fn foo() -> impl AsyncGenerator<Yield = i32, Return = ()> { yield 1; ... }

Stream Return = () рд╕рд╛рде рд╕рднреА async рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕реЗ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ:

async_gen fn foo() -> impl Stream<Item = i32> { yield 1;  ... }

рдиреЛрдЯ: рдЬреЗрдирд░реЗрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд╛рдд рдореЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдлреНрдпреВрдЪрд░реНрд╕ 0.3 рдореЗрдВ Stream рд╡рд┐рдкрд░реАрдд рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд┐рдирд┐рдВрдЧ-рдЕрд╡реЗрдпрд░ рдирд╣реАрдВ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕ рдХреЛрдб рдиреЗ рдкрд╣рд▓реЗ Generator ред рдореБрдЭреЗ Stream рдФрд░ Generator рдмреАрдЪ рдЕрдВрддрд░ рдпрд╛рдж рдЖрдпрд╛ред рдзрд╛рд░рд╛рдПрдБ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рджреЗрдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рдпрд╛ рддреЛ Poll::Ready рдпрд╛ Poll::Pending рд╕рд╛рде рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░реА рдУрд░ Generator рдХреЛ рд╣рдореЗрд╢рд╛ рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдЬ рдпрд╛ рдкреВрд░реНрдг рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдм рдЗрд╕реЗ AsyncGenerator рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред

Edit2: @Ekleog рдЬрдирд░реЗрдЯрд░ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рд░реНрдХрд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ yield рддрд▓рд╛рд╢ рдХрд░рдХреЗ рдПрдХ рдЬрдирд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдпрд╣ рдХрд╣рдиреЗ рдореЗрдВ рд╕рд╣реА рд╣реЛрдВрдЧреЗ рдХрд┐ async рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╡рд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдордЭрджрд╛рд░ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд┐рд╖рдп рдХреЗ рд▓рд┐рдП рд╣реИ ^^'

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ async рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ async рдЗрд╕ RFC рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХреЗрд╡рд▓ Future s рдХреЗ рд╕рд╛рде рдЕрдиреБрдордд рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦрдХрд░ Stream рдЙрддреНрдкрдиреНрди рдХрд░ рд░рд╣рд╛ рд╣реИ (рдЬреЛ рдпрд╛ рддреЛ Future рдпрд╛ Stream )ред

рдЕрдм рдореИрдВ рдЗрд╕реЗ рдХреНрдпреЛрдВ рдЙрдард╛ рд░рд╣рд╛ рд╣реВрдВ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо Future s рдФрд░ Stream s рджреЛрдиреЛрдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди async рдХреАрд╡рд░реНрдб рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рд╣рд░реА рд░рд┐рдЯрд░реНрди рдЯрд╛рдЗрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рд╕рд╛рдл рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХреЛрдИ рднреА рдЙрдореНрдореАрдж рдХрд░реЗрдЧрд╛ рдХрд┐ async fn foo() -> i32 i32 рдХреА рдПрдХ рдзрд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ (рдЬреЛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╢рд░реАрд░ рдирд┐рд╣рд┐рдд рд╣реЛ рдПрдХ yield рдФрд░ рдЖрдВрддрд░рд┐рдХ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛)ред

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

@rpjohnst рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рд╣рд░реА рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрд╕рд╛рдиреА рд╕реЗ рджреЛ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред

рд╣рдо рджреЛ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдПрдХ рд╕реНрдЯреНрд░реАрдо рдЕрднреА рднреА рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИ, impl Iterator<Item=impl Future>> рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рднреА рдирд╣реАрдВред

@rpjohnst рдореЗрд░рд╛ рдорддрд▓рдм рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ Yield рдФрд░ Return (async) рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдерд╛

gen fn foo() -> impl Generator<Yield = i32, Return = ()> { ... }

рдпрд╣ рдореЗрд░рд╛ рдореВрд▓ рд╕реНрдХреЗрдЪ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЦреБрдж рд╕реЗ рдмрд╣реБрдд рдЖрдЧреЗ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдЯреНрд░реИрдХрд┐рдВрдЧ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП:

// generator
fn foo() -> T yields Y

// generator that implements Iterator
fn foo() yields Y

// async generator
async fn foo() -> T yields Y

// async generator that implements Stream
async fn foo() yields Y

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

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

рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЬрдВрдЧ 2018 рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЙрдореНрдореАрдж рдереА рдФрд░ рддрдм рддрдХ рдПрд╕рд┐рдВрдХ рдЬреЗрдирд░реЗрдЯрд░ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди ...?

(рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗрд╡рд▓ @MajorBreakfast рдХреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдереА, рдлрд┐рд░ рднреА рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд┐рдЯрд╛ рджреА рдЧрдИ рд╣реИ тАж рдпрд╣ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ?)

рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдХреАрд╡рд░реНрдб рдХрд╛ рд╕рдВрдХреАрд░реНрдг рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЕрднреА рднреА рдореБрдЭреЗ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред (Espред рдлреНрдпреВрдЪрд░ рдмрдирд╛рдо рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдо рдЬреЗрдирд░реЗрдЯрд░)

рдХреНрдпрд╛ рдПрдХ рдЙрдкрдЬ рдХреАрд╡рд░реНрдб рд╕рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрдЧрд╛? рдХреЗ рд░реВрдк рдореЗрдВ

{ let a = yield future; println(a) } -> Future

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

(рд╣рдордиреЗ рдЗрд╕реЗ рдорд┐рдЯреНрдЯреА рдХреА рднрд╛рд╖рд╛ рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛)

@aep await рдПрдХ рднрд╡рд┐рд╖реНрдп рдЙрдкрдЬ рдирд╣реАрдВ рд╣реИ generator-- рд╕реЗ рдпрд╣ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИ Future рдФрд░ рд░рд┐рдЯрд░реНрди рдХреЙрд▓рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

@cramerj рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╣ рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ (рдПрдХ рднрд╡рд┐рд╖реНрдп рд▓реМрдЯрд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдЬ рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рдж рдирд┐рд░рдВрддрд░рддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ), рдЬреЛ рдХрд┐ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ рд╣реИред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЙрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрдЯреА рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рд╣реЛ рдЧрдИ рд╣реИ? :)

@aep рдПрдХ await -рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЬрдирд░реЗрдЯрд░-рд╡рд┐рд╢рд┐рд╖реНрдЯ yield рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдХрдВрдкреЛрдЬрд╝рд┐рдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рдо рдПрд╕рд┐рдВрдХ рдЬреЗрдирд░реЗрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдирд┐рд░рдВрддрд░рддрд╛ "рд╕реНрдХреЛрдк"ред

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

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

@sackery рдпрд╣ рднрд╛рд╖рд╛ рдХреЗ рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рдмрд╕ рдЗрд╕реЗ рдирд┐рдо рдХреА рддрд░рд╣ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдПрдВ, рд╕реА # рдХрд░рддрд╛ рд╣реИ!

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

trait AsyncFnMut {
    type Output<'a>: Future;
    fn call(&'a mut self, args: ...) -> Self::Output<'a>;
}

@cramertj рдПрдХ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдХрдмреНрдЬреЗ рд╡рд╛рд▓реЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╕рдВрднрд╡рддрдГ рд╕рдорд╛рдзрд╛рди рдХреЛ async fn рд╕реЗ рдмрдВрдзреЗ рд░рд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?

@ рдмрд┐рдирд╛ рдирд╛рд╡ рдХреЗ рд╕рд╣реА, рдпрд╣ async рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╢рд╛рдпрдж рдпрд╣ рдХрд╣реАрдВ рдФрд░ рд╣реЛрдЧрд╛ред

рдХреИрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ fn async рдХреЗ рдмрдЬрд╛рдп async fn ?
рдореБрдЭреЗ let mut mut let рд╕реЗ рдмреЗрд╣рддрд░ рдкрд╕рдВрдж рд╣реИред

fn foo1() {
}
fn async foo2() {
}
pub fn foo3() {
}
pub fn async foo4() {
}

рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк pub fn рдЦреЛрдЬ рд▓реЗрддреЗ рд╣реИрдВ, рддрдм рднреА рдЖрдк рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВредрд▓реЗрдХрд┐рди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред

fn foo1() {
}
async fn foo2() {
}
pub fn foo3() {
}
pub async fn foo4() {
}

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

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╕рднреА рд╕рдВрд╢реЛрдзрдХреЛрдВ рдХреЛ fn рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдФрд░ рдпрд╣ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди рд╣реИред

@Pzixel рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдПрдХреНрд╕реЗрд╕ рд╕рдВрд╢реЛрдзрдХ fn рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ async рд╢рд╛рдпрдж рдирд╣реАрдВ рд╣реИред

@xmeta рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рд╣рдо рд╢рд╛рдпрдж async рдХреЛ fn рд╕рд╛рдордиреЗ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╢реБрдХреНрд░рд┐рдпрд╛!

// Status quo:
pub unsafe async fn foo() {} // #![feature(async_await, futures_api)]
pub const unsafe fn foo2() {} // #![feature(const_fn)]

@MajorBreakfast рдЖрдкрдХреЗ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ рдРрд╕рд╛ рд╕реЛрдЪрд╛ред

{ Public, Private } тКЗ Function  тЖТ put `pub` in front of `fn`
{ Public, Private } тКЗ Struct    тЖТ put `pub` in front of `struct`
{ Public, Private } тКЗ Trait     тЖТ put `pub` in front of `trait`
{ Public, Private } тКЗ Enum      тЖТ put `pub` in front of `enum`
Function тКЗ {Async, Sync}        тЖТ put `async` in back of `fn`
Variable тКЗ {Mutable, Imutable}  тЖТ put `mut` in back of `let`

@xmeta @MajorBreakfast

async fn рдЕрд╡рд┐рднрд╛рдЬреНрдп рд╣реИ, рдпрд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИуАВ

async fn рдПрдХ рд╕рдВрдкреВрд░реНрдг рд╣реИред

рдЖрдк pub fn рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЙрд╕реА рддрд░рд╣, рдЖрдк pub async fn рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@ZhangHanDong

  • async fn рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рднрд╡рд┐рд╖реНрдп рд▓реМрдЯрд╛рддрд╛ рд╣реИред рднрд╡рд┐рд╖реНрдп рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ "рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕" рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред async fn s рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рднрд╡рд┐рд╖реНрдп рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рди ┬░ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рдЦреЗрд▓ рдХрд╛
  • pub fn рдХреА рдЦреЛрдЬ рдореЗрдВ unsafe рдпрд╛ const рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдорд┐рд▓реЗрдВрдЧреЗред

┬░ async fn рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЬреНрдЮрд╛рдд рд╣реИред рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реЗ рджреЛрдиреЛрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬреЛ Future

@xmeta рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ mut "рджреЗрдиреЗ рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рдЬрд╛рддрд╛", рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ рдХрд┐ mut let рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред let рдПрдХ рдкреИрдЯрд░реНрди рд▓реЗрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ

let PATTERN = EXPRESSION;

mut рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ PATTERN , рдХреА рдирд╣реАрдВ let рд╣реАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

// one is mutable one is not
let (mut a, b) = (1, 2);

@steveklabnik рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдБред рдореИрдВ рд╕рд┐рд░реНрдл рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╢рдмреНрдж рдХреНрд░рдо рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж

async рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ return рдФрд░ break рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рд▓реЛрдЧреЛрдВ рдХреЗ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ? рд╡рд░реНрддрдорд╛рди рдореЗрдВ return async рдмреНрд▓реЙрдХ рд╕реЗ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ-- рдпрджрд┐ рд╣рдо return рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╕рдВрднрд╡ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд╣рдо return рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ async рдмреНрд▓реЙрдХ рд╕реЗ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП 'label: async { .... break 'label x; } рдЬреИрд╕реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рдмрд╛рддрдЪреАрдд рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рдмреНрд░реЗрдХ-рдЯреВ-рдмреНрд▓реЙрдХ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб break рдпрд╛ return рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ (https://github.com/rust-lang/rust/issues/ 48594)ред

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

@cramertj return рд╣рдореЗрд╢рд╛ рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрднреА рднреА рдЖрдВрддрд░рд┐рдХ рдмреНрд▓реЙрдХ рдирд╣реАрдВ; рдЕрдЧрд░ рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рдЬреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдпрд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ return рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рдХреЗ рд▓рд┐рдП break рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓реЗрдмрд▓-рдмреНрд░реЗрдХ-рд╡реИрд▓реНрдпреВ рд╣реИ, рддреЛ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдЙрд╕рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред

рдХреНрдпрд╛ рдПрд╕рд┐рдВрдХреНрд╕ рдореВрд╡реНрд╕ рдФрд░ рдХреНрд▓реЛрдЬрд░ рдЕрднреА рднреА рдпреЛрдЬрдирд╛рдмрджреНрдз рд╣реИрдВ? рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд░рдПрдлрд╕реА рд╕реЗ рд╣реИ:

// closure which is evaluated immediately
async move {
     // asynchronous portion of the function
}

рдФрд░ рдЖрдЧреЗ рдкреГрд╖реНрда рдХреЗ рдиреАрдЪреЗ

async { /* body */ }

// is equivalent to

(async || { /* body */ })()

рдЬреЛ return рдХреЛ рдХреНрд▓реЛрдЬрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд┐рдХ-рдЕрдк рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред

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

@memoryruins async || { ... return x; ... } рдмрд┐рд▓реНрдХреБрд▓ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ async { ... return x; ... } рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдареАрдХ рдЗрд╕рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ async рдмрдВрдж рдирд╣реАрдВ рд╣реИред return рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрд░реНрде рд╣реИ: "рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕реА"ред рдХреНрд▓реЛрдЬрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред async рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реИрдВред

@memoryruins рд╡реЗ рджреЛрдиреЛрдВ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВред

@joshtriplett

async рдмреНрд▓реЙрдХ рдирд╣реАрдВ рд╣реИрдВред

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, @cramertj "рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕" рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЛред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ (рдпрд╛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рддрд░рд╣, рдФрд░ рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдВрдж рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ), рдФрд░ рдЖрдкрдХреЛ return , рддреЛ рдЖрдкрдХрд╛ рдорд╛рдирд╕рд┐рдХ рдкрд╛рд░реНрд╕рд░ рдХрд╣рд╛рдВ рдЬрд╛рддрд╛ рд╣реИ?

return рдХреЛ рд╣рд╛рдИрдЬреИрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА рдЪреАрдЬрд╝ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рднреНрд░рдорд┐рдд рдХрд░рддреА рд╣реИред рд▓реЛрдЧ рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрднреНрдпрд╕реНрдд рд╣реИрдВ рдХрд┐ break рдХреБрдЫ рдореВрд▓ рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рдмреНрд▓реЙрдХ рд╣реИред return рд╣рдореЗрд╢рд╛ рдмрдбрд╝рд╛ рд╣рдереМрдбрд╝рд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдкреВрд░реЗ рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рд▓реМрдЯрддрд╛ рд╣реИред

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

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

RFC рдкрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХреБрдЫ break _without_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд▓реЗрдмрд▓ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП async рдмреНрд▓реЙрдХ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ (рдПрд╕рд┐рдВрдХ рдмреНрд▓реЙрдХ рд╕реЗ рдмрд╛рд╣рд░реА рд▓реВрдк рдХреЛ рддреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдХреЛрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рди рдЦреЛрдПрдВ)ред

@withboats рдПрдХ рдмрдВрдж рдХрд░рдирд╛ рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ; рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ "рдПрдХ рдХреНрд▓реЛрдЬрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ" рддреЛ рдЖрдк рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдХреБрдЫ рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдЙрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ " return рд╣рдореЗрд╢рд╛ рдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ" рд╢рд╛рдорд┐рд▓ рд╣реИред

@ Nemo157 рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдкрдиреЗ break рдХреЛ async рдмреНрд▓реЙрдХ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдПрд╕рд┐рдВрдХ рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рд▓реВрдк рд╕реЗ рдЬрд▓реНрджреА рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ (рдЬреИрд╕реЗ 'label: async ) рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред .

@joshtriplett

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ async рдмреНрд▓реЙрдХ рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рдлрд╝рдВрдХреНрд╢рди" рд╣реИ - рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рдЬрд┐рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ async рдХреНрд▓реЛрдЬрд░ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдкреВрд░реНрд╡-рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

рдХреБрдЫ рднреА рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ return рдЕрд░реНрде рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рдХреЛ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рджрдмрд╛рд╡ рдбрд╛рд▓рддрд╛ рд╣реИред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХ рдмреНрд▓реЙрдХ рднреА рдПрдХ рддрд░рд╣ рдХрд╛ "рдлрд╝рдВрдХреНрд╢рди" рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдВрддрд░рд┐рдХ рдЬреНрдЮрд╛рди рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдпрд╣ рдПрдХ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╣реИред

рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред

рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред

@joshtriplett

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

@cramertj рдореИрдВ рдирд╣реАрдВ, рдирд╣реАрдВ; рд▓реИрдореНрдмреНрдбрд╛ рдФрд░/рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВред (рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд╛рдпрдерди, рдПрдлрдбрдмреНрд▓реНрдпреВрдЖрдИрдбрдмреНрд▓реНрдпреВ рдореЗрдВ рдерд╛, рдЬрд╣рд╛рдВ рд▓реИрдореНрдмреНрдбрд╛ return рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ return return рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд░рд┐рдЯрд░реНрдиред)

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

рдпрд╣ RFC рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ ? -рдСрдкрд░реЗрдЯрд░ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг-рдкреНрд░рд╡рд╛рд╣ рдирд┐рд░реНрдорд╛рдг return , break рдФрд░ continue async рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдЕрдВрджрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

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

рдЖрдк рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ async fn рдХреЗ рдЕрдВрджрд░ рд╕реЗ рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╢рд╛рдпрдж core::task::context() рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ? рдЕрдЧрд░ рдПрд╕рд┐рдВрдХ рдПрдлрдПрди рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╕ рдШрдмрд░рд╛рдПрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЛ рдХреБрдЫ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

@MajorBreakfast рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ lazy рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ

async fn foo() -> i32 {
    await!(lazy(|ctx| {
        // do something with ctx
        42
    }))
}

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

async fn foo() -> i32 {
    let some_task = lazy(|_| 5);
    let spawned_task = await!(spawn_with_handle(some_task));
    await!(spawned_task)
}

@ Nemo157 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ spawn_with_handle рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред рдХреЛрдб рдХреЛ 0.3 рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рддреЗ рд╕рдордп рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ spawn_with_handle рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рднрд╡рд┐рд╖реНрдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕рдВрджрд░реНрдн рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ( рдХреЛрдб рджреЗрдЦреЗрдВ )ред рдореИрдВ рдЬреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ spawn_with_handle рд╡рд┐рдзрд┐ рдХреЛ ContextExt рдЬреЛрдбрд╝рдирд╛ рд╣реИ рдФрд░ spawn_with_handle рдПрдХ рдирд┐рдГрд╢реБрд▓реНрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

fn poll(self: PinMut<Self>, cx: &mut Context) -> Poll<Self::Output> {
     let join_handle = ctx.spawn_with_handle(future);
     ...
}
async fn foo() {
   let join_handle = spawn_with_handle(future); // This would use this function internally
   await!(join_handle);
}

рдпрд╣ рд╕рднреА рджреЛрд╣рд░реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдмрдХрд╡рд╛рд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдУ, рд╡рд┐рдзрд┐ рдХреЛ core::task::with_current_context() рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдлрд╝рдВрдХреНрд╢рди get_task_cx рдирд╛рдо рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ ред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рддрдХрдиреАрдХреА рдХрд╛рд░рдгреЛрдВ рд╕реЗ libstd рдореЗрдВ рд╣реИред рдПрдХ рдмрд╛рд░ рдЗрд╕реЗ рд▓рд┐рдмрдХреЛрд░ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВред

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

рддреЛ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдкрд╕рдВрдж рд╣реИ

fn spawn_with_handle(executor: &mut Executor, future: impl Future) { ... }

async fn foo() {
    let join_handle = spawn_with_handle(async_context!().executor(), future);
    await!(join_handle);
}

@ Nemo157 рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд╣реА рд╣реИрдВ: рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдЕрдЧрд░ рдЗрд╕реЗ рд╕реАрдзреЗ async fn рдХреЗ рднреАрддрд░ рд╕реЗ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ spawn_with_handle рдПрдХ рдореИрдХреНрд░реЛ рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ await рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ select! рдФрд░ join! ):

async fn foo() {
    let join_handle = spawn_with_handle!(future);
    await!(join_handle);
}

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореИрдХреНрд░реЛ рдХреЗ рдЕрдВрджрд░ await!(lazy(|ctx| { ... })) рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

async_context!() рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЭреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╕рдВрджрд░реНрдн рд╕рдВрджрд░реНрдн рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред

async_context!() рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрдЭреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд╕рдВрджрд░реНрдн рд╕рдВрджрд░реНрдн рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред

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

@ Nemo157 рдЖрдкрдХрд╛ рдорддрд▓рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ?

let my_arg = yield; // my_arg lives until next yield

@Pzixel рдПрдХ _рд╕рдВрднрд╡рддрдГ_ рдкреБрд░рд╛рдиреА рдЪрд░реНрдЪрд╛ рдХреЛ рдЬрдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

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

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

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╕рдВрдж рддрд╛рд░реНрдХрд┐рдХ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ try!() рд╕рд╛рде рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдЦреБрд╢реА рд╣реБрдИ рдЬреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░рддреНрдпрдп ? рдмрди рдЧрдпрд╛ (рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд, рдпрд╛рдж рд░рдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдФрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рдмрдврд╝рд┐рдпрд╛ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ ? рдкреНрд░рддреАрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдЧрд╛)ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

// Await, then unwrap a Result from the future
awaiting_a_result()@?;

// Unwrap a future from a result, then await
result_with_future()?@;

// The real crazy can make it as funky as they want
magic()?@@?@??@; 
// - I'm joking, of course

рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ await future? рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдкрд╣рд▓реА рдирдЬрд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдЖрдк рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗред рдФрд░ рдлрд┐рд░ рднреА рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ? рдЕрдиреБрд░реВрдк рд╣реИред

рдЕрдм, рдмрд╕ рдХреБрдЫ _minor_ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░реЗрдВрдЧреА:

  • рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ await рд╕рд╛рде рдХреБрдЫ рдХреЗ рд╡рд┐рдкрд░реАрдд _too_ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдХрдо рджреГрд╢реНрдпрдорд╛рди/рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рд▓рдВрдмрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдкреЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _hard_ рдмрдирд╛рддрд╛ рд╣реИред
  • рд╢рд╛рдпрдж рдпрд╣ async рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рд╡рд┐рд╖рдо рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдкреНрд░рддреАрдХ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, await!() рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИ рдЬреЛ рдПрдХ рдореИрдХреНрд░реЛ рдмрдирд╛рдо рдХреАрд╡рд░ рд╣реИред
  • рдПрдХ рдкреНрд░рддреАрдХ рдЪреБрдирдиреЗ рд╕реЗ рдПрдХ рдФрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рддрддреНрд╡ рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕реАрдЦрдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИред рд▓реЗрдХрд┐рди, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред

@phaux рдиреЗ ~ рдкреНрд░рддреАрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЪрд░рд┐рддреНрд░ рдХреБрдЫ рдХреАрдмреЛрд░реНрдб рд▓реЗрдЖрдЙрдЯ рдкрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдпрд░рддрд╛рдкреВрд░реНрдг рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ред

рдЖрдкрдХреЗ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рджреЛрд╕реНрддреЛрдВ? рдХреНрдпрд╛ рдЖрдк рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ try!() _became_ ? ? рдХреНрдпрд╛ рдЖрдк await рдпрд╛ рдПрдХ рдкреНрд░рддреАрдХ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреНрдпреЛрдВ? рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЧрд▓ рд╣реВрдБ, рдпрд╛ рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ?

рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдХрд┐рд╕реА рднреА рдЧрд▓рдд рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рд╕рд┐рдЧрд┐рд▓-рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреНрд▓рд┐рдлрд╝ рд╕реВрдк рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдХреГрдкрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ред рдкрд░реНрд▓ (рдкреВрд░реНрд╡ -6) рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рд╕рдордЭ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╣рд╛рдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рд▓рд╛рдЗрди рд╢реЛрд░ рд╕реЗ рдмрдЪрдирд╛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЬрд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗ рд╕рд╛рде рдХреА рддрд░рд╣ рд╣реИ try! ? рдпрд╣реА рд╣реИ, рдПрдХ рд╕реНрдкрд╖реНрдЯ async!(foo) рдореИрдХреНрд░реЛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рддреЛ рдХреБрдЫ рд╕рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪреАрдиреА рд╣реЛрдЧреАред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдмрд╛рдж рдореЗрдВ рд╕реНрдердЧрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди async!(foo) рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реЛрдиреЗ рдХреЗ рд▓рд╛рдн рдХреЗ рд╕рд╛рде, async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред (рдФрд░ try! / ? рдХреА рдорд┐рд╕рд╛рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рддрд░реНрдХ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП)

@withboats рдореИрдВрдиреЗ рдЗрд╕ рдкреВрд░реЗ рд╕реВрддреНрд░ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХреЛрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдорджрдж рдХрд░ рд░рд╣рд╛ рд╣реИ? рдЖрдкрдХреА рд╡рд┐рдХрд╛рд╕ рд╢рд╛рдЦрд╛ рдХрд╣рд╛рдБ рд╣реИ?

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

@BatmanAoD рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди https://github.com/rust-lang/rust/pull/51580 рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛

рдореВрд▓ RFC рдереНрд░реЗрдб рдореЗрдВ PLT рд╕реНрдкреЗрд╕ рдХреЗ рдХрдИ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдереАрдВ, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рд░рд╕реНрдЯ рдХреЗ рдмрд╛рд╣рд░ рднреА :)

рдореИрдВ рдлреНрдпреВрдЪрд░реНрд╕ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП '$' рдкреНрд░рддреАрдХ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдордп рдкреИрд╕рд╛ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

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

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

@steveklabnik рдЖрд╣, рдареАрдХ рд╣реИ, рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рд╣рдо (/ рдЪрд╛рд╣рд┐рдП рдореБрдЭреЗ) рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╢рд╛рдпрдж рдмреБрд▓реЗрдЯ рдЖрдЗрдЯрдо "рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдХреЛ " move рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдФрд░ "рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди" рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдХреНрдпрд╛ рдЕрдЧрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдХреБрдЫ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд╛рдВрдЯрд╛/рд╢рд╛рдЦрд╛ рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ? рдпрд╛ рдХреНрдпрд╛ рд╡рд╣ рддрдм рддрдХ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝ рд╕рдХрддрд╛ рдЬрдм рддрдХ RFC 2418 рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛?

рдЖрд░рдПрдлрд╕реА рдХреА рдмрдЬрд╛рдп рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдореБрджреНрджреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреНрдпреЛрдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ?

@ c-edw рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ async рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдХреМрди рд╕рд╛ рд░рдВрдЧ рд╣реИ?

@parasyte рдореБрдЭреЗ рдпрд╣ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдкреЛрд╕реНрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рд╣рд░реЗ-рдереНрд░реЗрдб рд╢реИрд▓реА

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

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ async / await рд╢рдмреНрджрд╛рд░реНрде рдареАрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рдирд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

рдореИрдВ рд╡рд╣рд╛рдВ рднреА рдЖрдкрдХреА рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдореИрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ async рдХреАрд╡рд░реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рд▓реЗрдЦ рдЗрд╕рдХреЗ рдкреАрдЫреЗ рддрд░реНрдХ рдмрддрд╛рддрд╛ рд╣реИред рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдирд┐рд╖реНрдХрд░реНрд╖ рдПрдХ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛ рд╣реИред

@parasyte рдЖрд╣, рдареАрдХ рд╣реИред рдЦреБрд╢реА рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкреВрдЫрд╛ - рд▓реЗрдЦрдХ рдХреЗ рд▓рд╛рд▓/рдиреАрд▓реЗ рджреНрд╡рд┐рднрд╛рдЬрди рдХреЗ рдкреНрд░рддрд┐ рдШреГрдгрд╛ рдХреЗ рдХрд╛рд░рдг, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд╣ рд░рд╣реЗ рд╣реИрдВ!

рдореИрдВ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдиреНрдпрд╛рдп рдирд╣реАрдВ рдХрд┐рдпрд╛ред

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

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

  • рдорд┐рдбреЛрд░реА рдиреЗ рди рдХреЗрд╡рд▓ await рдХреАрд╡рд░реНрдб рдкреЗрд╢ рдХрд┐рдпрд╛, рдмрд▓реНрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ async рдХреАрд╡рд░реНрдб рднреА рдкреЗрд╢ рдХрд┐рдпрд╛ ред
  • gevent рд╕рд╛рдорд╛рдиреНрдп рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓реНрд╕ рдХреЗ рдирд┐рд╣рд┐рдд-рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛ gevent.spawn рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдпрд╣реА рдХрд╛рд░рдг рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд▓рд░-рдП-рдлрд╝рдВрдХреНрд╢рди рдЖрд▓реЗрдЦ рд▓рд╛рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИ, "рдПрд╕рд┐рдВрдХ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд╛рдпрдХ рдХреНрдпреЛрдВ рд╣реИ?"

рдареАрдХ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдереНрд░реЗрдб-рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб "рдПрдХ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ" (рдЬреБрдбрд╝реЗрдВ) рдФрд░ "рдПрдХ рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░рдирд╛" (рд╕реНрдкреЙрди) рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдПрдХ рдРрд╕реА рднрд╛рд╖рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рдм рдХреБрдЫ async (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ) рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдВ рдкрд░ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рд╣реИ await (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ), рдФрд░ рдорд┐рдбреЛрд░реА рдХреЗ async рдмрдЬрд╛рдп рдПрдХ рдмрдВрдж рдПрдХ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ spawn рдПрдкреАрдЖрдИред рдпрд╣ рдСрд▓-рдПрд╕рд┐рдВрдХреНрд╕ рдХреЛ рдареАрдХ рдЙрд╕реА рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ/рдлрд╝рдВрдХреНрд╢рди-рдХрд▓рд░ рдлрд╝реБрдЯрд┐рдВрдЧ рдкрд░ рдСрд▓-рд╕рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред

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

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

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

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

рдЧреБрд░реБ, рдЬреБрд▓рд╛рдИ 12, 2018 рдЕрдкрд░рд╛рд╣реНрди 3:01 рдмрдЬреЗ, рд░рд╕реЗрд▓ рдЬреЙрдиреНрд╕рдЯрди рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

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

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

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

/рд╡рд┐рд╖рдп рд╕реЗ рдкрд░реЗ

@Pzixel рдХреЛрдИ рдЬреАрд╡рд┐рдд рдкреНрд░рд╛рдгреА рдЕрднреА рднреА рдЗрд╕ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдВрдж рд╣реЛ рдЧрдИ рдереАред рд▓реЗрдХрд┐рди рдЬреЛ рдбрдлреА рдХреЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг рд╣реИрдВред рдКрдкрд░ рдореЗрд░реЗ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВред

рд╣рдо рдпрд╣рд╛рдВ рдкрдЯрд░реА рд╕реЗ рдЙрддрд░ рдЧрдП рд╣реИрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЦреБрдж рдХреЛ рджреЛрд╣рд░рд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ "рдХреАрд╡рд░реНрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐" рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ - await рдХреАрд╡рд░реНрдбред рдпрджрд┐ рдЖрдк рдХреАрд╡рд░реНрдб рдХреЛ spawn рдФрд░ join рдЬреИрд╕реЗ API рд╕реЗ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ async (рдорд┐рдбреЛрд░реА рдХреА рддрд░рд╣) рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдХрд┐рд╕реА рджреНрд╡рд┐рднрд╛рдЬрди рдХреЗ (рдорд┐рдбреЛрд░реА рдХреЗ рд╡рд┐рдкрд░реАрдд)ред

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

@CyrusNajmabadi рдЖрдкрдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рджреА рдЧрдИ рд╣реИред

рдпрджрд┐ рдЖрдк рджреЛрдмрд╛рд░рд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдпрд╣ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдЖрдкрдХреА рд░реБрдЪрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред

#wg-net рдбрд┐рд╕реНрдХреЙрд░реНрдб рдЪреИрдирд▓ рд╕реЗ :

@cramertj
рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рднреЛрдЬрди: рдореИрдВ рдЕрдХреНрд╕рд░ async { ... } рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрдд рдореЗрдВ Ok::<(), MyErrorType>(()) рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред рд╢рд╛рдпрдж рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@ рдирд╛рд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛
[...] рд╕рдВрднрд╡рддрдГ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ [ try ] рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ?

(рдореБрдЭреЗ рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╣рд╛рд▓рд┐рдпрд╛ рдЪрд░реНрдЪрд╛ рдпрд╛рдж рд╣реИ рдХрд┐ рдХреИрд╕реЗ try рдмреНрд▓реЙрдХ рдЕрдкрдиреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрднреА рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрддрд╛ ...)

рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд░рдВрдЧ:

async -> io::Result<()> {
    ...
}

async: io::Result<()> {
    ...
}

async as io::Result<()> {
    ...
}

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

let _: io::Result<()> = try { ... };
let _: impl Future<Output = io::Result<()>> = async { ... };

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ Future рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП fn- рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЙрдЫрд╛рд▓рд╛ рдерд╛, рдЬреИрд╕реЗ Future -> io::Result<()> ред рдЗрд╕рд╕реЗ рдореИрдиреНрдпреБрдЕрд▓-рдкреНрд░рдХрд╛рд░-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд░реНрдг рд╣реИрдВ:

let _: impl Future -> io::Result<()> = async {
}
async -> impl Future<Output = io::Result<()>> {
    ...
}

рдореЗрд░реА рдкрд╕рдВрдж рд╣реЛрдЧреАред

рдпрд╣ рдореМрдЬреВрджрд╛ рдХреНрд▓реЛрдЬрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ:

|x: i32| -> i32 { x + 1 };

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдФрд░ рдЕрдВрддрддрдГ рдЬрдм TryFuture рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рддреЛ Future :

async -> impl TryFuture<Ok = i32, Error = ()> {
    ...
}

рд╕рдВрдкрд╛рджрд┐рдд 2: рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдЖрдЬ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдПрдХ TryFuture рдкреНрд░рдХрд╛рд░ рдЖрдЬ рдЙрддрдирд╛ рдЙрдкрдпреЛрдЧреА рд╡рд░реНрддрдорд╛рди рдореЗрдВ Future рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ

@MajorBreakfast рдХреНрдпреЛрдВ -> impl Future<Output = io::Result<()>> рдмрдЬрд╛рдп -> io::Result<()> ? рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА async fn foo() -> io::Result<()> рд▓рд┐рдП рд░рд┐рдЯрд░реНрди-рдЯрд╛рдЗрдк-рдбрд┐рд╕реБрдЧрд░рд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдИрдПрдордУ рдпрджрд┐ рд╣рдо -> -рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рд╡рд╣реА рдЪреАрдиреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред

@cramertj рд╣рд╛рдБ рдпрд╣ рд╕реБрд╕рдВрдЧрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдереЛрдбрд╝реЗ рд╕реЗ рдКрдкрд░ рдХреА рдореЗрд░реА рдкреЛрд╕реНрдЯ рдорд╛рдирддреА рд╣реИ рдХрд┐ рдореИрдВ рдЖрдк рд╕рднреА рдХреЛ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╛рд╣рд░реА рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмреЗрд╣рддрд░ рд╣реИ

рдпрджрд┐ рд╣рдо async -> R { .. } рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд╕рдВрднрд╡рддрдГ рд╣рдореЗрдВ try -> R { .. } рд╕рд╛рде-рд╕рд╛рде рдЯрд╛рдЗрдк рдПрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ expr -> TheType рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдо рдЬрд┐рд╕ рдЯрд╛рдЗрдк рдПрд╕рдХреНрд░рд┐рдкреНрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЙрд╕реЗ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╣рд░ рдЬрдЧрд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

@MajorBreakfast рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд╣рдордд рд╣реВрдБ; рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЯрд╛рдЗрдк рдПрд╕рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП : рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП async : Type { .. } , try : Type { .. } , рдФрд░ expr : Type ред рд╣рдордиреЗ рдбрд┐рд╕реНрдХреЙрд░реНрдб рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ : рд╕рд╛рде рдЖрдЧреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ ...

рдПрдХ рдФрд░ рд╕рд╡рд╛рд▓ Either рдПрдирдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА Either рдореЗрдВ futures рдЯреЛрдХрд░рд╛ рд╣реИред рдпрд╣ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рднреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ either рдХреНрд░реЗрдЯ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ Either рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпреЛрдВрдХрд┐ Futures рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрд╕рдЯреАрдбреА рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХреЗ рдмрд╣реБрдд рдмреБрдирд┐рдпрд╛рджреА рд╣рд┐рд╕реНрд╕реЗ) рдХреНрдпрд╛ рд╣рдо рд╡рд╣рд╛рдВ Either рднреА рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдлрд╝рдВрдХреНрд╢рди рд╕реЗ impl Future рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рд╣реЛрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдХреНрд╕рд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рддрд░рд╣ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ:

fn handler() -> impl Future<Item = (), Error = Bar> + Send {
    someFuture()
        .and_then(|x| {
            if condition(&x) {
                Either::A(anotherFuture(x))
            } else {
                Either::B(future::ok(()))
            }
        })
}

рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

async fn handler() -> Result<(), Bar> {
    let x = await someFuture();
    if condition(&x) {
        await anotherFuture(x);
    }
}

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм async рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП Either рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдпрд╛ рддреЛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рд╣рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред

_рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

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

@Pzixel рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ (рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ) рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ Either рдХреЛ рдЗрд╕ RFC рдХреЗ рд╕рд╛рде рдкреЗрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ https://github.com/rust-lang/rfcs/issues рдХрд╛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдкреЗрд╢ рдХрд░реЗрдЧрд╛ред Future s рдХреЗ рд╕рд╛рде), рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдкреАрдЖрдИ рдХреНрд░реЙрдлреНрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдпрджрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХрднреА рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ @ рдирд┐рдореЛ157 рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЖрдкрд╛рдд рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИ рдЕрднреА Either :)

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

рдмреЗрд╢рдХ, рдпрд╣ рдХреЗрд╡рд▓ async/await рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ RFC рдХреЗ рдпреЛрдЧреНрдп рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдпрд╛ рддреЛ futures рдХреЛ either рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд ( IntoFuture рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)ред

@Pzixel рдлреНрдпреВрдЪрд░реНрд╕ рдХреНрд░реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ Either either рдХреНрд░реЗрдЯ рд╕реЗ рдПрдХ рдкреБрдирдГ рдирд┐рд░реНрдпрд╛рдд рд╣реИред рдЕрдирд╛рде рдирд┐рдпрдореЛрдВ рдХреЗ рдХрд╛рд░рдг futures рдЯреЛрдХрд░рд╛ 0.3 Future рд▓рд┐рдП Either рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдмрд╛рдд рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╣рдо рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП Either Stream рдФрд░ Sink рд▓рд┐рдП Either рдЗрдореНрдкреНрд▓рд╛рдВрдЯреНрд╕ рдХреЛ рднреА рд╣рдЯрд╛ рджреЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ ( рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ either рдЯреЛрдХрд░рд╛ рддрдм Future , Stream рдФрд░ Sink рдХреЛ рдПрдХ рдлреАрдЪрд░ рдлреНрд▓реИрдЧ рдХреЗ рддрд╣рдд рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЬреИрд╕рд╛ рдХрд┐ @ Nemo157 рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╛рдпрджрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, Either рдмрдЬрд╛рдп рдХреЗрд╡рд▓ async рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред

async : Type { .. } рд╕рд╛рдордЧреНрд░реА рдЕрдм https://github.com/rust-lang/rfcs/pull/2522 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ

рдХреНрдпрд╛ Send рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдлрд╝рдВрдХреНрд╢рди рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрди async рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ (рдЕрднреА рддрдХ?) Send :

pub async fn __receive() -> ()
{
    let mut chan: futures::channel::mpsc::Receiver<Box<Send + 'static>> = None.unwrap();

    await!(chan.next());
}

рдкреВрд░реНрдг рдкреБрдирд░реБрддреНрдкрд╛рджрдХ рд╕реЗ рд▓рд┐рдВрдХ (рдЬреЛ futures-0.3 рдХрдореА рдХреЗ рд▓рд┐рдП рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдпрд╣рд╛рдВ рд╣реИ ред

рд╕рд╛рде рд╣реА, рдЗрд╕ рдореБрджреНрджреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп рдореИрдВ https://github.com/rust-lang/rust/issues/53249 рдкрд░ рдЖрдпрд╛, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкрдж рдХреА рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП :)

рдпрд╣рд╛рдВ рдПрдХ рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ Send _рдЪрд╛рд╣рд┐рдП_ рдХрд╛рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред Rc рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрд╕рдВрдмрджреНрдз рдХрд░рдиреЗ рд╕реЗ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЧреИрд░- Send рд░реВрдк рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ (рдЗрд╕ рдорд╢реАрди рдкрд░ рдХреЛрдИ рдЬрдВрдЧ рд╕рдВрдХрд▓рдХ рдирд╣реАрдВ: рдереЛрдбрд╝рд╛_рдлреНрд░рд╛рдЗрдВрдЧ_рдлреЗрд╕ :) рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

@Ekleog std::mpsc::Receiver Sync , рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ async fn рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрдн рд░рдЦрддрд╛ рд╣реИред !Sync рдЖрдЗрдЯрдо рдХреЗ рд╕рдВрджрд░реНрдн рд╣реИрдВ !Send ред

@cramertj рд╣рдореНрдо ... рд▓реЗрдХрд┐рди, рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓рд╛ mpsc::Receiver , рдЬреЛ Send рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЗрд╕рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ Send ? (рд╕рд╛рде рд╣реА, рдпрд╣ std::mpsc::Receiver рдмрд▓реНрдХрд┐ рдПрдХ futures::channel::mpsc::Receiver , рдЬреЛ рдХрд┐ Sync рднреА рд╣реИ, рдпрджрд┐ рдкреНрд░рдХрд╛рд░ Send , рддреЛ mpsc::Receiver рдзреНрдпрд╛рди рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ

@ рдирд┐рдореЛ157 рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢реЛрд░ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/issues/53259 рдЦреЛрд▓рд╛ рд╣реИ :)

рдХреА рдХреНрдпрд╛ рдФрд░ рдХрд┐рддрдиреА рд╕рд╡рд╛рд▓ async рдмреНрд▓реЙрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ ? рдФрд░ рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдмрд╛рддрдЪреАрдд рд╡рд╛рд░рдВрдЯ рд╕рдХрддрд╛ рд╣реИ try (рдмреНрд▓реЙрдХ рдЬреИрд╕реЗ try async { .. } рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП ? рд╕рдорд╛рди рднреНрд░рдо рдХреЗ рдмрд┐рдирд╛ return ?)

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ async рдмреНрд▓реЙрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЛ try рдмреНрд▓реЙрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореИрдВрдиреЗ рдПрд╕рдХреНрд░рд┐рдкреНрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЖрд░рдПрдлрд╕реА рдкрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝реА: https://github.com/rust-lang/rfcs/pull/2522#issuecomment -412577175

рдмрд╕ рд╡рд╣реА рдорд╛рд░рд╛ рдЬреЛ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдПрдХ futures-rs рдореБрджреНрджрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдореБрджреНрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдпрд╣ рд╣реИ: https://github.com/rust-lang-nursery/ Futures-rs/issues/1199#issuecomment -413089012

рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛: https://github.com/rust-lang/rust/issues/53447

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

рдХреНрдпрд╛ рдлреНрдпреВрдЪрд░/рдЯрд╛рд╕реНрдХ рдПрдкреАрдЖрдИ рдХреЗ рдкрд╛рд╕ рд╕реНрдерд╛рдиреАрдп рдлреНрдпреВрдЪрд░реНрд╕ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛?
рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ SpawnLocalObjError , рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкреНрд░рдпреБрдХреНрдд рд╣реИред

@panicbit рдХрд╛рд░реНрдп рд╕рдореВрд╣ рдореЗрдВ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реНрдкреЙрдирд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред https://github.com/rust-lang-nursery/wg-net/issues/56

( SpawnLocalObjError рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ: LocalPool рдлреНрдпреВрдЪрд░реНрд╕ рдХреНрд░реЗрдЯ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЖрдк рд╕рд╣реА рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, libcore рдореЗрдВ рдХреБрдЫ рднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)

@withboats рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╡рд░рдг рдХреЗ рдХреБрдЫ рд▓рд┐рдВрдХ рдкреБрд░рд╛рдиреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, https://github.com/rust-lang/rfcs/pull/2418 рдмрдВрдж рд╣реИ рдФрд░ https://github.com/rust-lang-nursery/futures-rs/issues/1199 рдХреЛ https:/ рдкрд░ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдирд╛рдпрдмред рдЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд╛рдо async/рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рд░реНрдп API рдХреЛ рднреА рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ! рдХрд╛рд░реНрдп API рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░реАрдХрд░рдг RFC рд▓рдВрдмрд┐рдд рд╣реИ: https://github.com/rust-lang/rfcs/pull/2592

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

@aep oneshot::channel рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрд╢-рдЖрдзрд╛рд░рд┐рдд рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдкреБрд▓-рдЖрдзрд╛рд░рд┐рдд рдлреНрдпреВрдЪрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

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

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

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

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

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

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдПрд╕рд┐рдВрдХреНрд╕ рдХреЛ рдЬреЗрдирд░реЗрдЯрд░ рдХреА рддрд░рд╣ рдХреБрдЫ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ async рд╡рд╕реНрддреБрддрдГ рдПрдХ рдЬрдирд░реЗрдЯрд░ рд╢рд╛рдмреНрджрд┐рдХ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдПрдХ рдиреНрдпреВрдирддрдо рдЖрд╡рд░рдг рд╣реИред рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд░рд╣реА рд╣реИ рдХрд┐ рдЬреЗрдирд░реЗрдЯрд░ рдкреБрд╢ рдЖрдзрд╛рд░рд┐рдд рдПрд╕рд┐рдВрдХреНрд╕ рдЖрдИрдУ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рд╕реАрдкреАрдПрд╕ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рдЖрдкрдХреЛ рдЦреАрдВрдЪреА рдЬрд╛ рд░рд╣реА рдЪреАрдЬрд╝ рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?" рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛрдЧреА, рдпрд╛ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдвреЗрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдЧрд▓реЗ рддреИрдпрд╛рд░ рдореВрд▓реНрдп рдХреЛ рдХреИрд╕реЗ рдЦрд┐рд▓рд╛рдирд╛" poll() рд╕реЗ рдЕрд▓рдЧ рд╣реИред

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

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП CPS рд░реВрдкрд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ?

рд╣рд╛рдБ, рд╡рд░реНрддрдорд╛рди рдЬрдирд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдПрд╕рд┐рдВрдХ рдЗрд╕реЗ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд▓рд╛рдПрдЧрд╛ред

рдЖрдкрдХреЛ рдЦреАрдВрдЪреА рдЬрд╛ рд░рд╣реА рдЪреАрдЬрд╝ рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

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

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

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

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

рдФрд░ рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдХрд╛рд░рдг рд░рджреНрджреАрдХрд░рдг рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ

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

async fn add (a: u32) -> u32 {
    let b = await
    a + b
}

add(3).continue(2) == 5

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

рдореЗрд░реЗ рдореЗрдВ рдирд╣реАрдВ, рдЬрд╣рд╛рдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрд▓ 1MB рдореЗрдореЛрд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП Futures.rs рдлреНрд▓реИрд╢ рдкрд░ рднреА рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдпрджрд╛ рд╕реНрдореГрддрд┐-рд╡рд┐рд╡рд╢ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЪрд▓рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдиреА рдЬрдЧрд╣ рдХреНрдпрд╛ рд▓реЗ рд░рд╣рд╛ рд╣реИ?

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореЗрд░реА рдореИрдХрдмреБрдХ рдкрд░ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо 295KB рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рд▓реЗрддрд╛ рд╣реИ (рдореВрд▓ рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб 273KB рд▓реЗрддрд╛ рд╣реИ):

use futures::{executor::LocalPool, future};

fn main() {
    let mut pool = LocalPool::new();
    let hello = pool.run_until(future::ready("Hello, world!"));
    println!("{}", hello);
}

рдореЗрд░реЗ рдореЗрдВ рдирд╣реАрдВ, рдЬрд╣рд╛рдВ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрд▓ 1MB рдореЗрдореЛрд░реА рд╣реИ, рдЗрд╕рд▓рд┐рдП Futures.rs рдлреНрд▓реИрд╢ рдкрд░ рднреА рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ

рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдпрджрд╛ рд╕реНрдореГрддрд┐-рд╡рд┐рд╡рд╢ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЪрд▓рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрддрдиреА рдЬрдЧрд╣ рдХреНрдпрд╛ рд▓реЗ рд░рд╣рд╛ рд╣реИ?

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрдореГрддрд┐ рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдореИрдВрдиреЗ 128 рдХреЗрдмреА рдлреНрд▓реИрд╢/16 рдХреЗрдмреА рд░реИрдо рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╡рд░реНрддрдорд╛рди рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдЖрдзрд╛рд░рд┐рдд рдХреЛрдб рдЪрд▓рд╛рдпрд╛ рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рдореБрджреНрджреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдореБрджреНрджреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреВрд▓рди рдЬреЛрдбрд╝рдХрд░ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/rust-lang/rust/issues/52924)ред

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

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

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрдореГрддрд┐ рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

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

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

рдЖрдк рдкреЛрд▓ рдХреЛ рдЙрддрдиреА рд╣реА рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рддрдирд╛ рдХрд┐ рдЖрдк рдкреБрд╢-рдЖрдзрд╛рд░рд┐рдд рддрдВрддреНрд░ рдХреЛ рдХрд╣рддреЗ рд╣реИрдВред

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

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

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

@aep рд╣рдо рдХреАрд╡рд░реНрдб ( async рдФрд░ await ) рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рд╕рдВрднрд╡ рдХрд░реЗрдВрдЧреЗ?

@Centril рдореЗрд░рд╛ рднреЛрд▓рд╛ рддреНрд╡рд░рд┐рдд рд╕реБрдзрд╛рд░ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдПрдХ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдПрдХ async рдХреЛ рдХрдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд╕реЗ рдЬрдирд░реЗрдЯрд░ рдХреЛ рд╡рд╛рдпрджрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмреИрдХрдПрдВрдб рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЙрдЪрд┐рдд рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдордп рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдПрдХ 10 рд▓рд╛рдЗрди рдкреАрдЖрд░ рдХреА рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рдордзреБрдордХреНрдЦреА рдХреЗ рдЫрддреНрддреЗ рд╕реЗ рд▓рдбрд╝рдиреЗ рдХрд╛ рдзреИрд░реНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдХреАрд╡рд░реНрдб рдХреЛ рдбрд┐рд╕реБрдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдкреНрд░реАрдкреНрд░реЛрдХ рдмрдирд╛рдКрдВрдЧрд╛ред

рдореИрдВ рдПрд╕рд┐рдВрдХреНрд╕ рд╕рд╛рдорд╛рди рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЗрд╕рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЕрдЧрд░ рдЗрд╕ рдкрд░ рдкрд╣рд▓реЗ/рдЕрдиреНрдп рдЬрдЧрд╣реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИ, рд▓реЗрдХрд┐рди no_std рдореЗрдВ async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди) рдпреЛрдЬрдирд╛ рдХреНрдпрд╛ рд╣реИ?

AFAICT рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рд╡реЗрдХрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TLS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди no_std / core рдХреЛрдИ TLS (рдпрд╛ рдереНрд░реЗрдб) рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ @alexcrichton рд╕реЗ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдЯреАрдПрд▓рдПрд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐/рдЬрдм Generator.resume рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ no_std рд╕рдорд░реНрдерди рдкрд░ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕реНрдерд┐рд░реАрдХрд░рдг рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ? рдпрд╛ рдХреНрдпрд╛ рд╣рдореЗрдВ рдпрдХреАрди рд╣реИ рдХрд┐ no_std рд╕рдорд░реНрдерди рдХрд┐рд╕реА рднреА рдЯреБрдХрдбрд╝реЗ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ std async / рд╕реНрдерд┐рд░ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛?

@japaric poll рдЕрдм рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЗрддрд╛ рд╣реИред AFAIK, TLS рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

https://doc.rust-lang.org/nightly/std/future/trait.Future.html#tymethod.poll

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ, рдХреЗрд╡рд▓ рд╡рд╛рдпрджрд╛ рдХреЗ рд▓рд┐рдПред

[...] рдХреНрдпрд╛ рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ рдХрд┐ no_std рд╕рдорд░реНрдерди рдХреЛ рдХрд┐рд╕реА рднреА рдЯреБрдХрдбрд╝реЗ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ std async/рд╕реНрдерд┐рд░ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛?

рдореБрдЭреЗ рдРрд╕рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИред рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЯреБрдХрдбрд╝реЗ std::future , рдпреЗ рд╕рднреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд gen_future рдЕрд╕реНрдерд┐рд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВ рдЬреЛ рдХрднреА рднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред async рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо set_task_waker рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реЗрдХрд░ рдХреЛ рдЯреАрдПрд▓рдПрд╕ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдлрд┐рд░ await! рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП poll_with_tls_waker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рддрд░реНрдХ рд╕рдорд░реНрдерди рдорд┐рд▓рддрд╛ рд╣реИ рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп async рдкрд░рд┐рд╡рд░реНрддрди рд╡реЗрдХрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ await! рдЗрд╕реЗ рддрд░реНрдХ рд╕реЗ рдмрд╛рд╣рд░ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИред

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

@japaric рд╡рд╣реА рдирд╛рд╡ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдХрд┐рд╕реА рдиреЗ рдлреНрдпреВрдЪрд░реНрд╕ рдХреЛ рдПрдореНрдмреЗрдбреЗрдб рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╣реБрдд рд╣реА рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рднреА рдЯрд┐рдпрд░ 3 рд╣реИред

рдореБрдЭреЗ рдПрдХ рдмрджрд╕реВрд░рдд рд╣реИрдХ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ async рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдПрдХ рдЖрд░реНрдХ рдореЗрдВ рдмреБрдирд╛рдИрдЬреЗрдирд░реЗрдЯрд░ рдХреЗ рдвреЗрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред

  1. "рдкреЛрд▓" рддрд░реНрдХ рджреЗрдЦреЗрдВ https://github.com/aep/osaka/blob/master/osaka-dns/src/lib.rs#L76 рдЗрд╕рдХрд╛ рдПрдХ рдЖрд░реНрдХ
  2. рд▓рд╛рдЗрди 87 . рдкрд░ рдорддрджрд╛рди рдореЗрдВ рдХреБрдЫ рджрд░реНрдЬ рдХрд░рдирд╛
  3. рдЙрдкрдЬ рд▓рд╛рдЗрди 92 . рдкрд░ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдмрд┐рдВрджреБ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  4. рд▓рд╛рдЗрди 207 . рдкрд░ рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рд╕реНрдЯреИрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ
  5. рдЕрдВрдд рдореЗрдВ 215 line рд▓рд╛рдЗрди рдкрд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдкрд╛рд╕ рдХрд░рдХреЗ рдкреВрд░реЗ рд╕реНрдЯреИрдХ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛

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

рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдЖрдзрд╛ рдерд╛

https://twitter.com/arvidep/status/1067383652206690307

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдЕрдХреЗрд▓рд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕реЗ рдЪрд╛рд╣рддрд╛ рд╣реИ рддреЛ рд╕рднреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдФрд░ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЯреАрдПрд▓рдПрд╕-рдХрдо рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ no_std proc-macro рдЖрдзрд╛рд░рд┐рдд async_block! / await! рдореИрдХреНрд░реЛ рдЬреЛрдбрд╝реА рд▓рд╛рдЧреВ рдХреА рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

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

рдореБрдЭреЗ рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдУрдкреА рдореЗрдВ await! рдХреЛ std рд╕реЗ core рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ, рд╢рд╛рдпрдж #56767 рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░реАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрджреНрджреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ред

@ Nemo157 await! рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡реИрд╕реЗ рднреА рдЕрд╡рд░реЛрдзрдХ рдирд╣реАрдВ рд╣реИред

@Centril рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕рдиреЗ рдмрддрд╛рдпрд╛ рдХрд┐ await! рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ ...: рдкрд▓рдХ:

@cramertj рдЙрдирдХрд╛ рдорддрд▓рдм рдореИрдХреНрд░реЛ рд╕рдВрд╕реНрдХрд░рдг рдерд╛, рди рдХрд┐ рдХреАрд╡рд░реНрдб рд╕рдВрд╕реНрдХрд░рдг рдЬреЛ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ ...

@ crlf0710 рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛/рд╕реНрдкрд╖реНрдЯ рдПрд╕рд┐рдВрдХ -рдмреНрд▓реЙрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ?

@ crlf0710 рдореИрдВрдиреЗ рднреА рдХрд┐рдпрд╛ :)

@cramertj рдХреНрдпрд╛ рд╣рдо рдореИрдХреНрд░реЛ рдХреЛ рд╣рдЯрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдПрдХ рдмрджрд╕реВрд░рдд рд╣реИрдХ рд╣реИ рдЬреЛ await рдФрд░ await! рджреЛрдиреЛрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ? рдпрджрд┐ рд╣рдо рдореИрдХреНрд░реЛ рдХреЛ рд╕реНрдерд┐рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдХрднреА рднреА рд╣рдЯрд╛ рдирд╣реАрдВ рдкрд╛рдПрдВрдЧреЗред

@stjepang рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ await! рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐рд╕реА рднреА рджрд┐рд╢рд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рд╣реИ, рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╡рд░реАрдпрддрд╛ рдФрд░ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ рдЕрдкреНрд░рд╛рдкреНрдп/рдЕрди-Google-рд╕рдХреНрд╖рдо рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдирд╛рдкрд╕рдВрдж рд╕реЗ рдЕрд▓рдЧред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рд╕реБрдЭрд╛рд╡ ( ? рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡рддрд╛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рд╣реИрдВ:

  • await!(x)? (рдЖрдЬ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ)
  • await x? ( await ? рд╕реЗ рдЕрдзрд┐рдХ рдХрдбрд╝реЗ рдмрд╛рдВрдзрддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдХреЗрддрди, рдЪреЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)
  • await {x}? (рдКрдкрд░ рдЬреИрд╕рд╛ рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ {} рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)
  • await? x ( await рдХрдо рдХрд╕рдХрд░ рдмрд╛рдВрдзрддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдЙрдкрд╕рд░реНрдЧ рд╕рдВрдХреЗрддрди, рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ)
  • x.await? (рдлрд╝реАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ)
  • x# / x~ /рдЖрджрд┐ред (рдХреБрдЫ рдкреНрд░рддреАрдХ)
  • x.await!()? ( рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ -рдореИрдХреНрд░реЛ-рд╕реНрдЯрд╛рдЗрд▓, рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ -рдореИрдХреНрд░реЛрдЬрд╝ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЯрд╛рдЗрдк-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░реЗрд╖рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП . рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрдЧрд╛ред )

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд┐рдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдорд╛рд░реНрдЧ await!(x) , un-keyword-ify await рдЙрддрд░рдирд╛ рд╣реИ, рдФрд░ рдЕрдВрддрддрдГ рдХрд┐рд╕реА рджрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреА рдЕрдЪреНрдЫрд╛рдИ рдкрд░ рдмреЗрдЪрдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╣рдореЗрдВ x.await!() рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдмрд╣реБрдд рдвреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореЗрд░реА рд░рд╛рдп рд╣реИ:

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ await! рдореИрдХреНрд░реЛ рдкрд╕рдВрдж рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://blag.nemo157.com/2018/12/09/inside-rusts-async-transform.html

рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЬрд╛рджреВ рдпрд╛ рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдХ рдирд┐рдпрдорд┐рдд рдореИрдХреНрд░реЛ рд╣реИред рдХрдо рдЬреНрдпрд╛рджрд╛ рд╣реИ, рдЖрдЦрд┐рд░ред

рдлрд┐рд░ рд╕реЗ, рдореИрдВрдиреЗ try! рднреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА, рдХреНрдпреЛрдВрдХрд┐ Try рдЕрднреА рднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, await!(x)? рдЪреАрдиреА рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╛рдорд┐рдд рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдЬреИрд╕реЗ рдбреАрдмрдЧ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛ рд╕рдХреЗред

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

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЕрдВрддрддрдГ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд╕ рдФрд░ рдЬреЗрдирд░реЗрдЯрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рднреА рд╕рдВрдЧрдд рд╣реЛрдВ (рдПрдХ Stream )ред await! рдХреЛ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝рдирд╛ рдЬреЛ рдХреЗрд╡рд▓ yield рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

рдкреНрд░рддреАрдХреНрд╖рд╛ рдЫреЛрдбрд╝рдХрд░! рдПрдХ рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдХреЗрд╡рд▓ рдЙрдкрдЬ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

рдпрд╣ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рджреГрд╢реНрдпрдорд╛рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ yield рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ async + рдЬрдирд░реЗрдЯрд░ = Stream рд╣реЛ рддрдм рднреА рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП yield Poll::Pending; рдмрдирд╛рдо yield Poll::Ready(next_value) ред

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЕрдВрддрддрдГ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрд╕рд┐рдВрдХреНрд╕ рдФрд░ рдЬреЗрдирд░реЗрдЯрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реЛрдВ

рдХреНрдпрд╛ рдПрд╕рд┐рдВрдХреНрд╕ рдФрд░ рдЬреЗрдирд░реЗрдЯрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ ? рд╕рдВрдмрдВрдзрд┐рдд, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рд╣рдореЗрд╢рд╛ рд╕реЛрдЪрд╛ рдХрд┐ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрд╕рд┐рдВрдХ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдиреЗ рдХрд╛ рдЕрдВрддрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рднреА рдирд┐рдпрдорд┐рдд рдореВрд▓реНрдп рдХреЗ рд╡рд┐рдкрд░реАрдд Future s рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред рдПрдХ рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП async рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрдЬреАрд╡рди рд╕рд╛рдорд╛рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред

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

@cramertj рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рджреЛрдиреЛрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ "рдкреНрд░рднрд╛рд╡" рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдХреБрдЫ рдЪрд░реНрдЪрд╛ рд╣реИ: https://internals.rust-lang.org/t/pre-rfc-await-generators-directly/7202ред рд╣рдо yield Poll::Ready(next_value) рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдо yield next_value , рдФрд░ рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд╣реАрдВ рдФрд░ await ред

@rpjohnst

рд╣рдо рдкреЛрд▓ :: рд░реЗрдбреА (рдиреЗрдХреНрд╕реНрдЯ_рд╡реИрд▓реНрдпреВ) рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдо рдиреЗрдХреНрд╕реНрдЯ_рд╡реИрд▓реНрдпреВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рд╛рдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди desugaring рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ yield s рдХреЛ Poll::Ready рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ рдФрд░ Poll::Pending рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ yield рдЙрддреНрдкрдиреНрди await! ред рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЕрднреА рднреА рд╕рдВрдХрд▓рдХ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@cramertj рдпрд╣ рднреА рдПрдХ:

  • await? x

@novacrazy рд╣рд╛рдБ, рд╡реЗ рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдПрдХ рд╕рд╛рде composable рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡реЗ composable рд╣реИрдВ:

https://thenewstack.io/whats-coming-up-in-javascript-2018-async-generators-better-regex/

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

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

@Centril рдареАрдХ рд╣реИ, # 56974 рдЦреЛрд▓рд╛ рдЧрдпрд╛, рдХреНрдпрд╛ рдпрд╣ рдУрдкреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирд╕реБрд▓рдЭреЗ рдкреНрд░рд╢реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ?


рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд┐рдВрджреБ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реЛрдЧрд╛:

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ await! рдореИрдХреНрд░реЛ рдкрд╕рдВрдж рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИ рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: https://blag.nemo157.com/2018/12/09/inside-rusts-async-transform.html

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣ рднреА рдХрд╣рд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд╛рдЧреВ рдореИрдХреНрд░реЛ рдмрдирд╛ рд░рд╣ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рдЕрдирджреЗрдЦрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВ), рдХрд╛рд░рдгреЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  1. рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫрд┐рдкрд╛рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдирд╕реБрд▓рдЭреЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд░реНрддрдорд╛рди рдореЗрдВ || await!() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
  2. рдПрд╕рд┐рдВрдХ рдЬреЗрдирд░реЗрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ yield s рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реЗ рдЧрдП await рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдЕрдиреНрдп yield рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреВрд░реНрд╡ рд╡реГрд╣рдж рд╡рд┐рд╕реНрддрд╛рд░ рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ _could_ рдЬрд╛, _if_ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХрднреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ yield рдореИрдХреНрд░реЛ рдХреЗ рдЕрдВрджрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдБ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВ yield -рдЗрди-рдореИрдХреНрд░реЛ рддрд░рд╣ рдирд┐рд░реНрдорд╛рдгреЛрдВ yield_from! . рдЗрд╕ рдмрд╛рдзрд╛ рдХреЗ рд╕рд╛рде рдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдореЗрдВ yield s рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рд▓рд┐рдП await! рдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореИрдХреНрд░реЛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдпрджрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд╣реАрдВ рд╣реИ)ред
  3. рд╕рдорд░реНрдерди async fn рдкрд░ no_std ред рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП async fn -created- Future рдФрд░ await рддрд╛рдХрд┐ рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬрд┐рд╕рдореЗрдВ рд╡реЗрдХрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдореИрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрди рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕реНрд╡рдЪреНрдЫ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рджреЛрдиреЛрдВ рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рднреНрд░рдо рд╣реИ-- рдпрд╣ рдХрднреА рднреА рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐ await! рдХреЙрд▓ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд░реИрдкрд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдпреЛрдЧреНрдп рд╣реЛ yield ред await! рдореИрдХреНрд░реЛ-рдЬреИрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рднрд╡рд┐рд╖реНрдп рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдХрдВрдкрд╛рдЗрд▓рд░-рд╕рдорд░реНрдерд┐рдд compile_error! , assert! , format_args! рдЖрджрд┐ рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВ рд╣реИред рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЛрдб рдХреЛ рдбрд┐рд╕реБрдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдпрд╣рд╛рдВ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рдмреАрдЪ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд░реНрде рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ- рд╡реЗ рдХреЗрд╡рд▓ рд╕рддрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╣реИрдВред

рдореИрдВ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рд▓рд┐рдЦреВрдВрдЧрд╛ред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдЖрдпрд╛ рдЬрд┐рд╕рдиреЗ await рдХреЛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ред рд▓реЗрдХрд┐рди expression.await рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рддрд░рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

рддреЛ рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ expression awaited ред рдпрд╣рд╛рдВ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ awaited рдЕрднреА рддрдХ рдПрдХ рдХреАрд╡рд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдФрд░ рдлрд┐рд░ рднреА рдРрд╕реА рдХреЛрдИ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ (рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рд░реВрдк рдЬреИрд╕реЗ expression [token] ) рдЬрдВрдЧ рдореЗрдВ рдорд╛рдиреНрдп рд╣реИ рдЕрднреА, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЙрдЪрд┐рдд рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рдлрд┐рд░ рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ expression? awaited рдПрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рдХреЗ рд▓рд┐рдП Result<Future,_> , рдФрд░ expression awaited? рдПрдХ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рдХреЗ рд▓рд┐рдП Future<Item=Result<_,_>> ред

@рдЕрд░реНрдердЗрдВрдЬрд┐рди

рдЬрдмрдХрд┐ рдореБрдЭреЗ awaited рдХреАрд╡рд░реНрдб рдкрд░ рдмреЗрдЪрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреБрдЫ рдкрд░ рд╣реИрдВред

рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╣реИ: yield рдФрд░ await рдЬреИрд╕реЗ рд╣реИрдВ return рдФрд░ ? ред

return x рдореВрд▓реНрдп x return x рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ x? рдкрд░рд┐рдгрд╛рдо x рдХреЛ рдЦреЛрд▓ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ Err рддреЛ рдЬрд▓реНрджреА рд▓реМрдЯрддрд╛ рд╣реИред
yield x рдореВрд▓реНрдп x , рдЬрдмрдХрд┐ x awaited рднрд╡рд┐рд╖реНрдп рдХреЗ x рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ Pending рддреЛ рдЬрд▓реНрджреА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд╕рдорд░реВрдкрддрд╛ рд╣реИред рд╢рд╛рдпрдж await рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

let x = x.do_something() await.do_another_thing() await;
let x = x.foo(|| ...).bar(|| ... ).baz() await;

рдореИрдВ рд╕рдЯреАрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ @cramertj рдЕрднреА рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рд╕рдордЧреНрд░ рдкрдардиреАрдпрддрд╛ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рдВрдмреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдпрд╛ рдЬрдВрдЬреАрд░ рд╡рд╛рд▓реЗ рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдПред рдпрд╣ await! / await рддрд░рд╣ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛ рдХреЛрдИ рдЕрд░реНрде рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ ? рдХреА рд╕рд╛рджрдЧреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ ...

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

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

Rustfmt рдорд╛рдирдХреЛрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛

let x = x.do_something() await
         .do_another_thing() await;
let x = x.foo(|| ...)
         .bar(|| ...)
         .baz() await;

рдореИрдВ рд╢рд╛рдпрдж рд╣реА рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдкрдардиреАрдпрддрд╛ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

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

(рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рддрдВрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рд╕рдВрдХрд▓рдХ рд╡рд┐рд╢реЗрд╖-рдорд╛рдорд▓рд╛ .await!() ред)

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

рдореБрдЭреЗ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐

stream.for_each(async |item| {
    ...
}) await;

рд╕реЗ рдЕрдзрд┐рдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ

await!(stream.for_each(async |item| {
    ...
});

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

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

рдХреНрдпреЛрдВ рди рджреЛрдиреЛрдВ?

macro_rules! await {
    ($e:expr) => {{$e await}}
}

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

рддреЛ, рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП +1ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ .await!() рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ; рдореИрдВ рдПрдХ рдкреНрд░рдореБрдЦ рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ await рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВред

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

рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо await рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрднреА, рд╣рдо рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдзрд╛рд░рдг ASCII рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдП рдереЗред рдлрд┐рд░ рднреА рдХреИрд╕реЗ

let x = do_something()тМЫ.do_somthing_else()тМЫ;

рдЕрдЧрд░ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╛рджреЗ ASCII рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ (рдЙрдкрд░реЛрдХреНрдд рдЖрдХрд╛рд░ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд) рд▓реЗрдХрд░ рдЖрдпрд╛ рд╣реВрдВ

let x = do_something()><.do_somthing_else()><;

рдпрд╛ (рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдорд╛рди рдЖрдХрд╛рд░)

let x = do_something()>=<.do_somthing_else()>=<;

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░, await рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдПрдХ рдмреНрд░реИрдХреЗрдЯ рдмрдирд╛рдирд╛ рд╣реИред

let x = >do_something()<.>do_something_else()<;

рд╡реЗ рд╕рднреА ASCII рд╕рдорд╛рдзрд╛рди, рдПрдХ рд╣реА рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рдореБрджреНрджреЗ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ <..> рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрддреНрдпрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ < рдФрд░ > рд╕рд╛рде рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, >< рдпрд╛ >=< рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рдЬрдЧрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдИ рдЦреБрд▓рд╛ < ред


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

let x = do_something()-await.do_something_else()-await;

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

@goffrie рд╣рд╛рдВ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВ рд╕рд┐рд░реНрдл рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░ рд░рд╣рд╛ рдерд╛, рд╕рдореБрджрд╛рдп рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдХреЛ рдЪреБрдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, await! рдореИрдХреНрд░реЛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореИрдХреНрд░реЛ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд░рд╕реНрдЯ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП "рдПрдХ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рд╣реЛрдирд╛" рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИред

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

рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд▓рдЪреАрд▓реЗрдкрди рдФрд░ рд╕реНрд╡рд░реВрдкрдг рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдЬреЛ рдЙрди рд╕рднреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рднрд░ рджреЗред

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

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

@novacrazy

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

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ yield 42 рдкреНрд░рдХрд╛рд░ рдкрд░ рд╣реИ ! , рдЬрдмрдХрд┐ foo.await рдкреНрд░рдХрд╛рд░ рдкрд░ рд╣реИ T рдЬрд╣рд╛рдВ foo: impl Future<Output = T> ред @stjepang рдпрд╣рд╛рдВ ? рдФрд░ return рд╕рд╛рде рд╕рд╣реА рд╕рд╛рджреГрд╢реНрдп рдмрдирд╛рддрд╛ рд╣реИред await рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реИ yield ред

рдХреНрдпреЛрдВ рди рджреЛрдиреЛрдВ?

macro_rules! await {
    ($e:expr) => {{$e await}}
}

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


рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдореИрдВ await рдЙрдкрд╕рд░реНрдЧ рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ рдмреНрд▓реЙрдХ рдлреЙрд░реНрдо await { ... } ред

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

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

рдЗрд╕рд╕реЗ рднреА рдмреБрд░рд╛ рд╣реЛрдЧрд╛ await { ... } ред рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕, рдпрджрд┐ rustfmt рдЕрдиреБрд╕рд╛рд░ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:

    let x = await { // by analogy with `loop`
        foo.bar.baz.other_thing()
    };

рдпрд╣ рдПрд░реНрдЧреЛрдиреЛрдорд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд▓рдВрдмрд╡рдд рд▓рдВрдмрд╛рдИ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рджреЗрдЧрд╛ред


рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛, рдЬреИрд╕реЗ ? , рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд░рд╕реНрдЯ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдореЗрдердб рдЪреЗрдирд┐рдВрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдХрдИ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдКрдВрдЧрд╛:

  1. foo.await!() -- рдпрд╣ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рд╕рдорд╛рдзрд╛рди рд╣реИред рдЬрдмрдХрд┐ рдореИрдВ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ, рдореИрдВ https://github.com/rust-lang/rust/issues/50547#issuecomment -454225040 рдореЗрдВ @cramertj рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдРрд╕рд╛ рддрдм рддрдХ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рддрд┐рдмрджреНрдз рди рд╣реЛрдВред рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ред рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдЧреИрд░-рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рдПрд╣рд╕рд╛рд╕ рд╣реЛрддрд╛ рд╣реИ; рд╣рдореЗрдВ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП I

  2. foo await - рдпрд╣ рдЗрддрдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ ( expr op ) рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реНрд╡рд░реВрдкрдг рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧреБрдо рд╣реИ (рдпрд╛рдиреА рдпрд╣ "рдЦрд╛рд▓реА" рд▓рдЧрддрд╛ рд╣реИ); рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, expr? ? рд╕реАрдзреЗ expr рдкрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ; рдпрд╣рд╛рдБ рдХреЛрдИ рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИред рдпрд╣ ? рджреЗрдЦрдиреЗ рдореЗрдВ рдЖрдХрд░реНрд╖рдХ рдмрдирд╛рддрд╛ рд╣реИред

  3. foo.await -- рдлреАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЧрдИ рд╣реИ; рдФрд░ рдпрд╣ рд╕рдЪ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдореЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ await рдПрдХ рдХреАрд╡рд░реНрдб рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕реЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ IDE рдореЗрдВ рдпрд╛ GitHub рдкрд░ рд╕рдордХрдХреНрд╖ рд░реВрдк рд╕реЗ Rust рдХреЛрдб рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ await foo рд╕реЗ рднрд┐рдиреНрди рд░рдВрдЧ рдпрд╛ рдмреЛрд▓реНрдбрдиреЗрд╕ рдореЗрдВ рд╣реЛрдЧрд╛ред рдХрд┐рд╕реА рднрд┐рдиреНрди рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    let x = foo.match?;
    

    рдкреНрд░рдерд╛рдЧрдд рд░реВрдк рд╕реЗ, рдлрд╝реАрд▓реНрдб рднреА рд╕рдВрдЬреНрдЮрд╛ рд╣реИрдВ рдЬрдмрдХрд┐ await рдПрдХ рдХреНрд░рд┐рдпрд╛ рд╣реИред

    рдЬрдмрдХрд┐ foo.await рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрдкрд╣рд╛рд╕ рдХрд╛рд░рдХ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкрдардиреАрдп рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдПрдХ рджреГрд╖реНрдЯрд┐ рд╕реЗ рдЖрдХрд░реНрд╖рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЧрдВрднреАрд░ рд╡рд┐рдЪрд╛рд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

    рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ, .await рд╕реЗ рдЖрдкрдХреЛ рдбреЙрдЯ рдХреА рд╢рдХреНрддрд┐ рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдбреЙрдЯ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдЖрдИрдбреАрдИ рдореЗрдВ рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рдорд┐рд▓рддреА рд╣реИ (рдкреГрд╖реНрда 56 рджреЗрдЦреЗрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк foo. рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ foo рднрд╡рд┐рд╖реНрдп рд╣реЛрддрд╛ рд╣реИ, рддреЛ await рдкрд╣рд▓реА рдкрд╕рдВрдж рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдПрд░реНрдЧреЛрдиреЙрдорд┐рдХреНрд╕ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдЙрддреНрдкрд╛рджрдХрддрд╛ рджреЛрдиреЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбреЙрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпреЛрдВ рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред

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

  4. foo# - sigil рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ # рдкрд░ рдЗрдВрддрдЬрд╛рд░ foo ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рддрд░реНрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ ? рднреА рдПрдХ рд╕рддрд░реНрдХ рд╣реИ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рд▓реНрдХреЗ рд╡рдЬрди рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИред ? рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рдпрд╣ foo#? рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ -- рдЬреЛ рдареАрдХ рджрд┐рдЦрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, # рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдФрдЪрд┐рддреНрдп рдирд╣реАрдВ рд╣реИред рдмрд▓реНрдХрд┐, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рддрд░реНрдХ рд╣реИ рдЬреЛ рдЕрднреА рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред

  5. foo@ -- рдПрдХ рдФрд░ рд╕рд╛рд╡рдзрд╛рдиреА рд╣реИ @ ред ? рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рд╣реЛрдиреЗ рдкрд░, рд╣рдореЗрдВ foo@? ред рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рддрд░реНрдХрддрд╛ рдХрд╛ рдПрдХ рдФрдЪрд┐рддреНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ a -ish ( @wait ) рджрд┐рдЦрддрд╛ рд╣реИред

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

рдПрдХ рдФрд░ рд╕рд┐рдВрдЧрд▓ рд╕рд┐рдЧрд┐рд▓ рд╣реИ foo~ ред рд▓рд╣рд░ рдХреЛ "рдЧреВрдВрдЬ" рдпрд╛ "рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ" рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рднреА рд░рд╕реНрдЯ рднрд╛рд╖рд╛ рдореЗрдВ рдХрд╣реАрдВ рднреА рдЗрд╕рдХрд╛ рдкреНрд░рдпреЛрдЧ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЯрд┐рд▓реНрдбреЗ ~ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдореЗрдВ рдвреЗрд░ рдЖрд╡рдВрдЯрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛: https://github.com/rust-lang/rfcs/blob/master/text/0059-remove-tilde.md

рдХреНрдпрд╛ ? рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╛ рдпрд╣ рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдЬрд╛рджреВ рд╣реИ? impl Try for T: Future рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛?

@parasyte рд╣рд╛рдБ рдореБрдЭреЗ рдпрд╛рдж рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рд▓рдВрдмрд╛ рдЪрд▓рд╛ рдЧрдпрд╛ рдерд╛ред

@jethrogb рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ impl Try рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ, ? рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ return рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рд╕реЗ Try рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬрдмрдХрд┐ await рдХреЛ yield ред

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ? рдХреЛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖-рдЖрд╡рд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдпрд╛ рддреЛ yield рдпрд╛ return рдЙрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛ рд╕рдХреЗ рдЬрд┐рд╕ рдкрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреИрд╕реЗ рд╕рд╛рде рдХрд┐ рдмрд╛рддрдЪреАрдд Future<Output=Result<...>> , рдЖрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ let foo = bar()??; рджреЛрдиреЛрдВ рдХреЛ рд╣реИ "рдЗрдВрддрдЬрд╛рд░" рдФрд░ рдлрд┐рд░ рдорд┐рд▓ Ok рдХреЗ рд╕рдВрд╕реНрдХрд░рдг Result ( рдпрд╛ рдЬреЗрдирд░реЗрдЯрд░ рдореЗрдВ ? рдПрдХ рдЯреНрд░рд┐рд╕реНрдЯреЗрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрдЧрд╛ рдЬреЛ yield , return рдпрд╛ рдПрдХ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдореВрд▓реНрдп рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)?

рд╡рд╣ рдЕрдВрддрд┐рдо рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЯрд┐рдкреНрдкрдгреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдПрдХ рддреНрд╡рд░рд┐рдд рд╕реНрдХреЗрдЪ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
enum GenOp<T, U, E> { Break(T), Yield(U), Error(E) }

trait TryGen {
    type Ok;
    type Yield;
    type Error;

    fn into_result(self) -> GenOp<Self::Ok, Self::Yield, Self::Error>;
}
рдЬрдирд░реЗрдЯрд░ рдХреЗ рднреАрддрд░ `foo?` рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдФрд░ `foo` рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕реНрдЯреИрдХ-рдкрд┐рди рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)
loop {
    match TryGen::into_result(foo) {
        GenOp::Break(val) => break val,
        GenOp::Yield(val) => yield val,
        GenOp::Return(val) => return Try::from_error(val.into()),
    }
}

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

? рдХреЗ @jethrogb рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдореЗрд░рд╛ рднреА рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рдерд╛ред

@ рдирд┐рдореЛ157

рдРрд╕рд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ impl Try рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦ рд╕рдХреВрдВ, ? рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ return s рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рд╕реЗ Try рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ рдЬрдмрдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ yield ред

рд╢рд╛рдпрдж рдореБрдЭреЗ ? рдФрд░ Try рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдпрд╛рдж рдЖ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╣рд╛рдВ/рдХреНрдпреЛрдВ рд╕реНрдкрд╖реНрдЯ рд╣реИ? рдФрд░ рдПрдХ рдПрд╕рд┐рдВрдХ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ return рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ yield рдХреЗ рд╕рдорд╛рди рд╣реА рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдХ рдЕрд▓рдЧ рд░рд╛рдЬреНрдп рд╕рдВрдХреНрд░рдордг рд╣реИ?

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ? рдХреЛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖-рдЖрд╡рд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдпрд╛ рддреЛ yield рдпрд╛ return рдЙрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛ рд╕рдХреЗ рдЬрд┐рд╕ рдкрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

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

рд╕рд╛рде рд╣реА рдпрд╣ Future<Output=Result<...>> рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░реЗрдЧрд╛, рдХреНрдпрд╛ рдЖрдкрдХреЛ let foo = bar()?? ;

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

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

рдореБрдЭреЗ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@jethrogb @rolandsteiner рдПрдХ рд╕рдВрд░рдЪрдирд╛ Try рдФрд░ Future рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреМрди рд╕рд╛ ? рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП?

@jethrogb @rolandsteiner рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛрд╢рд┐рд╢ рдФрд░ рднрд╡рд┐рд╖реНрдп рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреМрди рд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЦреЛрд▓рдирд╛?

рдирд╣реАрдВ, рдпрд╣ рдХрдВрдмрд▓ рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ T: Future рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

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

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рд╕рд┐рд░реНрдл рдмрд╛рдЗрдХ рдЫрд╛рдпрд╛рдВрдХрди рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЕрднреА рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ await!(my_future) рд▓рд┐рдП рд╕рдордЭреМрддрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рд╕рд┐рд░реНрдл рдмрд╛рдЗрдХ рдЫрд╛рдпрд╛рдВрдХрди рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдЕрднреА рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдореИрдХреНрд░реЛ рд╕рд┐рдВрдЯреИрдХреНрд╕ await!(my_future) рд▓рд┐рдП рд╕рдордЭреМрддрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

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

рдкреНрд░рддреАрдХреНрд╖рд╛! (рднрд╡рд┐рд╖реНрдп) рдкрд░ рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ рдпрд╣ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдХрд┐ рдПрдХ рдЦреЛрдЬрд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рдЦреЛрдЬрд╢рдмреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрд╕рдВрднрд╡ рдмрдирд╛ рджреЗрддрд╛ рд╣реИред

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

@rolandsteiner

рдФрд░ рдПрдХ рдПрд╕рд┐рдВрдХ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ return рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ yield рдХреЗ рд╕рдорд╛рди рд╣реА рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдПрдХ рдЕрд▓рдЧ рд░рд╛рдЬреНрдп рд╕рдВрдХреНрд░рдордг рд╣реИ?

yield рдПрдХ рдПрд╕рд┐рдВрдХ рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдпрд╣ async / await рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдЬрдирд░реЗрдЯрд░/ yield рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдСрдкрд░реЗрд╢рди рд╣реИред рд╡рд░реНрддрдорд╛рди рдЬрдирд░реЗрдЯрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдореЗрдВ yield рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ return , рдЕрдЧрд░ ? рд╡рд┐рд╕реНрддрд╛рд░ рдЬрдирд░реЗрдЯрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдХрдм рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ рд╣реИ рдПрдХ return рдпрд╛ рдПрдХ yield ред

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

рдпрд╣ рддрд╛рд░реНрдХрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд╣рд▓реВ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ (рдЕрдзрд┐рдХрд╛рдВрд╢?) рдорд╛рдорд▓реЗ рдЬрд╣рд╛рдВ рдЖрдк async рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, IO рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдбрдмрд▓ ?? рд╕реЗ рднрд░реЗ рдЬрд╛рдПрдВрдЧреЗред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рд╡реЗрдХрд░ рд╕рдВрджрд░реНрдн рдЪрд░ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ ...

рдореБрдЭреЗ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рд╡рд┐рд╕реНрддреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

async рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП Future::poll рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рд╡реЗрдХрд░ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдо рдХрд┐рдП рдЧрдП рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдСрдкрд░реЗрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕реЗ std рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдПрдХ TLS рдЪрд░ рдХреЗ рд╕рд╛рде рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рджреЛрдиреЛрдВ рд╕рдВрджрд░реНрдн рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдпрджрд┐ ? рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдкреБрди: рдЙрдкрдЬ рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ _at рдЬрдирд░реЗрдЯрд░ рд╕реНрддрд░_ рддреЛ async рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рддрд░рд╣ рд╕реЗ рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

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

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

рдЙрд╕ рдиреЗ рдХрд╣рд╛, foo await рд╕рдмрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдм рддрдХ рджреЗрдЦрд╛ рд╣реИ:

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

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

рд╕рд┐рдбреЗрдиреЛрдЯ: рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИ:

let x = (x.do_something() await).do_another_thing() await;
let x = x.foo(|| ...).bar(|| ... ).baz() await;

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

рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ @earthengine рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рд╣реА рдЙрдЪрд┐рдд рд╣реИ (рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд

let x = x.do_something() await
         .do_another_thing() await;

let x = x.foo(|| ...)
         .bar(|| ... )
         .baz() await;
  • рд╕рддрд╣ рдХреЗ рд╕реНрддрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдкрд╛рдпрдерди рдпрд╛ рд╕реА # рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

try { .. } рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдиреЗ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд░рд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ POV рд╕реЗ рднреА рд╕рд╣реА рдбрд┐рдЬрд╝рд╛рдЗрди рдерд╛ред рддреЛ рдЙрди рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде, рдЬрдВрдЧ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЧрддреА рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЙрдкрд╕рд░реНрдЧ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдпрд╛ рддреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдпрд╛ рдПрдкреАрдЖрдИ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореЗрдВ рдЬрдВрдЧ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред

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

рдореИрдВ рдЗрд╕ рднрд╛рд╡рдирд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, .await!() рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХрд╛ рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛ред

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

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЪреАрдЬреЛрдВ рдХреЛ let рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдорд╣рдВрдЧрд╛рддрд╛ рд╣реИред рдореЗрдердб рдЪреЗрди рдХрднреА-рдХрднреА рдорд╣рдВрдЧреА рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдорд╣рдВрдЧреА рднреАред let рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ a) рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдПрдХ рдРрд╕рд╛ рдирд╛рдо рджреЗрдВ рдЬрд╣рд╛рдВ рдпрд╣ рдкрдардиреАрдпрддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, b) рдПрдХ рд╣реА рдЧрдгрдирд╛ рдореВрд▓реНрдп рдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ (рдЬреИрд╕реЗ &x рдпрд╛ рдЬрдм рдХреЛрдИ рдкреНрд░рдХрд╛рд░ рдХреЙрдкреА рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛ)ред

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

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

let temporary = some_computation() await?;

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

рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ await рд▓рд┐рдП рджреЛ рдпрд╛ рддреАрди рдмрд╛рд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ (рдпрд╣ rustfmt рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ):

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

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

let рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдореЗрдВ рдФрд░ let binding = await!(...)?; рд╕рд╛рде рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рдореИрдВрдиреЗ рдкрдврд╝рд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдлреНрдпреВрд╢рд┐рдпрд╛ рдХреЛрдб рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ред

  • рдпрд╣ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдкрд░рд┐рдЪрд┐рдд рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рд╕реАрдЦрдирд╛ рд╣реИ рдХрд┐ рд░рд╕реНрдЯ рдореЗрдВ рдкрд╣рд▓реЗ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддреАрдХреНрд╖рд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмрд╛рдж рдЬрд╛рддреА рд╣реИ, рди рдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдпред

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

  • рдпрд╣ рдЙрд╕ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рд╕рдм рд░рд╣рд╛ рд╣реИред

рдирд╣реАрдВ, рдпрд╣ рдХреЗрд╡рд▓ рд╡рд░реАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

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

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рдордЬрдмреВрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рд╡реНрдпрд╛рдХрд░рдг рдирд┐рдпрдо рд╣реИрдВ рдЬреЛ foo await.method() рд░реЛрдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ await рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рди рдХрд┐ foo (рдЬрдмрдХрд┐ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ foo await? )ред

рдЬрдмрдХрд┐ рдореБрдЭреЗ foo await рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рд╣рдо рдПрдХ рдЬрд╛рдирдмреВрдЭрдХрд░ рдбрд┐рдЬрд╛рдЗрди рдкреЗрдкрд░рдХрдЯ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ await рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЪреЗрдирд┐рдВрдЧ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред

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

рдпрд╣ рдЕрднреА рднреА _рд▓рдЧрддрд╛ рд╣реИ_ рдПрдХ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдВрдЪ рд░рд╣рд╛ рд╣реИред

@glaebhoerl рдЖрдк рдЕрдЪреНрдЫреЗ рдЕрдВрдХ рдмрдирд╛рддреЗ рд╣реИрдВ; рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХрд╛ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЖрдкрдХрд╛ рдорд╕реНрддрд┐рд╖реНрдХ рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЙрд╕ рдкрд░ рдХреЛрдИ/рдЕрдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ? рдХреЛрдб рдкрдврд╝рддреЗ рд╕рдордп рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП рд░рдВрдЧ рдФрд░ рдмреЛрд▓реНрдбрдиреЗрд╕ рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ .await рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдЫреЛрдбрд╝реВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдмрд╛рдХреА рдЪреАрдЬреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд░рдВрдЧ рд╣реИред

рдлреАрд▓реНрдб рдПрдХреНрд╕реЗрд╕ рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ - рдпрд╣ рд░рд╕реНрдЯ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдо рдкреНрд░рднрд╛рд╡реА рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕ рдмреАрдЪ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЕрддреНрдпрдзрд┐рдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдЗрдб-рдЗрдлрд╝реЗрдХреНрдЯрд┐рдВрдЧ рдСрдкрд░реЗрд╢рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (рдпрд╣ рджреЛрдиреЛрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирд┐рд░реНрдорд┐рдд I/O рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдкреНрд░рднрд╛рд╡ рд╣реЛрддрд╛ рд╣реИ)ред

рдореИрдВ рдЗрд╕рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред await рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬреИрд╕реЗ break рдпрд╛ return , рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╕рдВрдХреЗрддрди рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рдпрдерди рдХрд╛ if : if c { e1 } else { e2 } рд╕реЗ e1 if c else e2 ред рдЕрдВрдд рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдЖрдк рдХрд┐рд╕реА рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд┐рдВрдЧ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдбрдмрд▓-рдЯреЗрдХ рдХрд░рддреЗ рд╣реИрдВред

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

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

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

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

рдореИрдВ рдЗрд╕рд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред await рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬреИрд╕реЗ break рдпрд╛ return , рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВред рдиреЛрдЯреЗрд╢рди foo.await , foo await , foo# , ... рд╕реНрдкрд╖реНрдЯ рд╣реИрдВ ред рдХреЛрдИ рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред

рдореИрдВ рдпрд╣ рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреИрд╕реЗ e.await рд░рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рде await!(e) рдпрд╛ await e рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрдЧрдд рд╣реИред

рд╕рд┐рдВрдЯреИрдХреНрд╕ e.await рдкреНрд░рддрд┐ рд╕реЗ рд░рд╕реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдЖрдорддреМрд░ рдкрд░ ? рд╕рд╛рде рдмреЗрд╣рддрд░ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ рдФрд░ рд░рд╕реНрдЯ рдПрдкреАрдЖрдИ рдХреЛ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рддрд░реАрдХреЛрдВ рдХреЛ рдореБрдлреНрдд рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

await e? рд╕рд┐рдВрдЯреИрдХреНрд╕, рдпрджрд┐ (await e)? рд░реВрдк рдореЗрдВ рд╕рдВрдмрджреНрдз рд╣реИ, рддреЛ break рдФрд░ return рд╕рд╣рдпреЛрдЧреА рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдЧрдд рд╣реИред await!(e) рднреА рдЕрд╕рдВрдЧрдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЕрдиреНрдп рдЙрдкрд╕рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рддрд░рд╣ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдХреЛрдИ рдЕрдиреНрдп рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЗрд╕реЗ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рд╡рд┐рд╢реЗрд╖-рдХреЗрд╕ рдХрд░рдирд╛ рдерд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕реБрд╕рдВрдЧрдд рд╣реЛрдиреЗ рдХрд╛ рдкреНрд░рдорд╛рдг рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ .await рд▓рд┐рдП libsyntax рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдлреАрд▓реНрдб рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рддрд░реНрдХ рдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕рдВрдХрд▓реНрдк рдпрд╛ рдПрдЪрдЖрдИрдЖрд░ рдореЗрдВ рдирд┐рдкрдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

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

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

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ .wait рдХреЗ рд▓рд┐рдП libsyntax рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдлреАрд▓реНрдб рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдордиреЛрд░рдВрдЬрдХ рд╣реИред
рддреЛ рд╡рд┐рдЪрд╛рд░ self / super ... рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрде рдЦрдВрдбреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдлрд╝реАрд▓реНрдб рдХреЗ рд▓рд┐рдПред

рдпрд╣ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ await рдПрдХ рдкрде рдЦрдВрдб рдХреАрд╡рд░реНрдб рдмрдирд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдЪреНрдЪреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ

#[derive(Default)]
struct S {
    r#await: u8
}

fn main() {
    let s = ;
    let z = S::default().await; //  Hmmm...
}

рдХреЛрдИ рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред

рдЗрд╕ рдзрд╛рдЧреЗ ("рдирд┐рд╣рд┐рдд рдкреНрд░рддреАрдХреНрд╖рд╛" рдкреНрд░рд╕реНрддрд╛рд╡) рдкрд░ рд╡рд┐рдЪрд╛рд░ рджреЛ рдмрд╛рд░ рдЖрдпрд╛ред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ

try! (рдЬрд┐рд╕рдиреЗ рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛) рдФрд░ рддрд░реНрдХрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рдмрд╣рд┐рд╖реНрдХреГрдд select! ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ await return рддреБрд▓рдирд╛ рдореЗрдВ "рдордЬрдмреВрдд" рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЕрдиреБрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ ? рдХреЗ return рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдореЗрдВ рдЕрдзрд┐рдХ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

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

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

рдкреНрд░рддреАрдХреНрд╖рд╛ рдИ? рд╕рд┐рдВрдЯреИрдХреНрд╕, рдпрджрд┐ (рдкреНрд░рддреАрдХреНрд╖рд╛ рдИ) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдмрджреНрдз рд╣реИ? рдХреИрд╕реЗ рдмреНрд░реЗрдХ рдФрд░ рд░рд┐рдЯрд░реНрди рд╕рд╣рдпреЛрдЧреА рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдЧрдд рд╣реИред

рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ await!(e)? , await { e }? рдпрд╛ рд╢рд╛рдпрдж { await e }? - рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╛рдПрдВ рд╕реЗ рджрд╛рдПрдВ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред _рдзреНрдпрд╛рди рджреЗрдВ_

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

рд╢рд╛рдпрдж рдЗрд╕реЗ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╕реЛрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

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

рдореИрдВ рд╡рд╛рдпрджрд╛ рд╕рд╣рд┐рдд рдЬрдВрдЧ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдореВрд░реНрддрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рддрд░реНрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рд┐рд░реНрдл рд░рд╛рдЬреНрдп рдорд╢реАрди рд╣реИрдВред

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

рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣реИ, рдореВрд▓ await! рдореИрдХреНрд░реЛред

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

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХреИрд╕реЗ...? await(foo)? / await { foo }? рдСрдкрд░реЗрдЯрд░ рд╡рд░реАрдпрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдПрдкреАрдЖрдИ рдХреЛ рд░рд╕реНрдЯ рдореЗрдВ рдХреИрд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ- рдЗрд╕рдХрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рд╢рдмреНрджрд╢рдГрддрд╛ рд╣реИ рдФрд░ (рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдЬрдВрдЬреАрд░, рдорд┐рд╕рд╛рд▓ рдХреЛ рддреЛрдбрд╝рдирд╛ рдпрд╛ рд╣реЛрдирд╛ рдирд╣реАрдВ рд╣реИ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ред

try! (рдЬрд┐рд╕рдиреЗ рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛) рдФрд░ рддрд░реНрдХрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рдмрд╣рд┐рд╖реНрдХреГрдд select! ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдСрдкрд░реЗрдЯрд┐рд╡ рд╢рдмреНрдж рдмрд╣рд┐рд╖реНрдХреГрдд рд╣реИ ред рд░рд╕реНрдЯ 2018 рдкрд░ try!(...) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдПрдХ рдХрдард┐рди рддреНрд░реБрдЯрд┐ рд╣реИред рдпрд╣ рдЕрдм рдПрдХ рдХрдард┐рди рддреНрд░реБрдЯрд┐ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдПрдХ рдмреЗрд╣рддрд░, рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдФрд░ рдкреЛрд╕реНрдЯрдлрд╝рд┐рдХреНрд╕ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреЗрд╢ рдХрд┐рдпрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ await return рддреБрд▓рдирд╛ рдореЗрдВ "рдордЬрдмреВрдд" рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЕрдиреБрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ ? рдХреЗ return рддреБрд▓рдирд╛ рдореЗрдВ рдХреЛрдб рдореЗрдВ рдЕрдзрд┐рдХ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

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

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

рдЙрди рдЙрдкрд╕рд░реНрдЧ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ ! рдкреНрд░рдХрд╛рд░ рдкрд░ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдСрдкрд░реЗрдЯрд░ ? рдЬреЛ рдПрдХ рд╕рдВрджрд░реНрдн impl Try<Ok = T, ...> рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ T рд╣реИ рд╡рд╣ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рд╣реИред

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХреИрд╕реЗ...? await(foo)? / await { foo }? рдСрдкрд░реЗрдЯрд░ рд╡рд░реАрдпрддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдХреИрд╕реЗ рдПрдкреАрдЖрдИ рдХреЛ рдЬрдВрдЧ рдореЗрдВ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ-

await(foo) рд╕рд┐рдВрдЯреИрдХреНрд╕ await foo рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдХреЛрд╖реНрдардХ рдкреВрд░реНрд╡ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдмрд╛рдж рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред рдкреВрд░реНрд╡ рдЕрднреВрддрдкреВрд░реНрд╡ рд╣реИ, рдмрд╛рдж рд╡рд╛рд▓реЗ рдореЗрдВ рд╡рд░реАрдпрддрд╛ рдХреЗ рдореБрджреНрджреЗ рд╣реИрдВред ? рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИ, рдирд╛рд╡ рдХреЗ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдкрд░ рдФрд░ рдбрд┐рд╕реНрдХреЙрд░реНрдб рдкрд░ред await { foo } рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЕрдиреНрдп рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ (рджреЗрдЦреЗрдВ https://github.com/rust-lang/rust/issues/50547#issuecomment-454313611)ред

рдЗрд╕рдХрд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рд╢рдмреНрджрд╢рдГрддрд╛ рдФрд░ (рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдЬрдВрдЬреАрд░ рдмрдирд╛рдирд╛ рд╣реИ, рди рдХрд┐ рдорд┐рд╕рд╛рд▓ рдХреЛ рддреЛрдбрд╝рдирд╛ рдпрд╛ рднреНрд░рдорд┐рдд рдХрд░рдирд╛ред

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

рдореИрдВ рдЗрд╕ рд░рд╛рдп рдХреЗ рд╕рд╛рде рдЕрд▓реНрдкрдордд рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ:

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

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

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

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

рдордВрдЧрд▓рд╡рд╛рд░, 15 рдЬрдирд╡рд░реА, 2019 рдХреЛ 07:10:32 рдкреВрд░реНрд╡рд╛рд╣реНрди -800 рдмрдЬреЗ, рдкреМрди рдиреЗ рд▓рд┐рдЦрд╛:

рд╕рд┐рдбреЗрдиреЛрдЯ: рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рд╣реЛрддрд╛ рд╣реИ:

let x = (x.do_something() await).do_another_thing() await;
let x = x.foo(|| ...).bar(|| ... ).baz() await;

рдпрд╣ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдкреНрд░рд╛рдердорд┐рдХ рд▓рд╛рдн рдХреЛ рд╣рд░рд╛ рджреЗрддрд╛ рд╣реИ: "рдмрд╕ рд░рдЦреЗрдВ
рд▓рд┐рдЦрдирд╛/рдкрдврд╝рдирд╛"ред рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ рдкреНрд░рддреАрдХреНрд╖рд╛, рдЬреИрд╕реЗ рдкреЛрд╕реНрдЯрдлрд┐рдХреНрд╕ ? , рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
рдмрд╛рдПрдБ рд╕реЗ рджрд╛рдПрдБ рдЪрд▓рддреЗ рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП:

foo().await!()?.bar().await!()

рдпрджрд┐ await! рдЙрдкрд╕рд░реНрдЧ рдереЗ, рдпрд╛ рд╡рд╛рдкрд╕ рдЬрдм try! рдЙрдкрд╕рд░реНрдЧ рдерд╛, рдпрд╛ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ
рдХреЛрд╖реНрдардХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рдЖрдкрдХреЛ рдмрд╛рдИрдВ рдУрд░ рд╡рд╛рдкрд╕ рдХреВрджрдирд╛ рд╣реЛрдЧрд╛
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд▓рд┐рдЦрддреЗ рдпрд╛ рдкрдврд╝рддреЗ рд╕рдордпред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореИрдВ рдИрдореЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реБрд░реВ рд╕реЗ рдЕрдВрдд рддрдХ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдкрдврд╝ рд░рд╣рд╛ рдерд╛, рдФрд░ рдЗрд╕ рдореЗрд▓ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж рддрдХ "рдЕрдиреНрдп рдореБрджреНрджреЗ рдкрд░ рдмрд╛рддрдЪреАрдд рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ" рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд╣реАрдВ рджреЗрдЦреАрдВред

рд▓рд┐рдВрдХ рдЕрдкрдбреЗрдЯ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/rust-lang/rust/issues/53259 рдФрд░ https://github.com/rust-lang/rust/issues/53447 рдмрдВрдж рдХрд░ рджрд┐рдП рдЧрдП рд╣реИрдВред https://github.com/rust-lang-nursery/futures-rs/issues/1199 рдХреЗ рд▓рд┐рдП рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ https://github.com/rust-lang/rust/issues/53548ред

Async-рдкреНрд░рддреАрдХреНрд╖рд┐рдд рд╕реНрдерд┐рддрд┐ рд░рд┐рдкреЛрд░реНрдЯ:

http://smallcultfollowing.com/babysteps/blog/2019/03/01/async-await-status-report/


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

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдп рд╕рдореВрд╣ рдХреА рдШреЛрд╖рдгрд╛

рдЗрд╕ рдкреБрд╢ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рдпрд╣ рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП рдЦреБрд╢реА рд╣реЛ рд░рд╣реА рд╣реИ рдХрд┐ рд╣рдордиреЗ рдПрдХ рдХрд╛ рдЧрдарди рдХрд┐рдпрд╛ рд╣реИ
async-рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рд░реНрдп рд╕рдореВрд╣ ред рдпрд╣ рдХрд╛рд░реНрдп рд╕рдореВрд╣
рд╕рдВрдкреВрд░реНрдг async-рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдкреНрд░рдпрд╛рд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рд╕рдВрдХрд▓рдХ рдЯреАрдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдлрд┐рдирд┐рд╢ рд▓рд╛рдЗрди рдкрд░ async-рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХрд░реЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореБрджреНрджреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ
рдЬрд╣рд╛рдВ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдорджрдж рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдкрдврд╝реЗрдВ)ред

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

...

std::future::Future рдХрдм рд╕реНрдерд┐рд░ рд░рд╣реЗрдЧрд╛? рдХреНрдпрд╛ рдЗрд╕реЗ async рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреА? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕рдореЗрдВ рдХреЛрдб рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред (рдХреНрдпрд╛ рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╢рд┐рдо рд╣реИ?)

@ рдЗрд╕рдХреЗ рд▓рд┐рдП рддрд╛рдЬрд╝рд╛ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рджреЗрдЦреЗрдВ :

async/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕рдВрдХрд▓рдХ рд╕рдорд╕реНрдпрд╛: https://github.com/rust-lang/rust/issues/59245

рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╢реАрд░реНрд╖ рдкреЛрд╕реНрдЯ рдореЗрдВ https://github.com/rust-lang-nursery/futures-rs/issues/1199 рдХреЛ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдм рдареАрдХ рд╣реЛ рдЧрдпрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ HRLB рдФрд░ async рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ: https://github.com/rust-lang/rust/issues/59337ред (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрд░рдПрдлрд╕реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдХрд┐рдо рдХрд░рдирд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрд╕рд┐рдВрдХ рдХреНрд▓реЛрдЬрд░ рдЙрд╕реА рддрд░реНрдХ рдХреЗ рдЕрдзреАрди рд╣реИрдВ рдЬреЛ рдПрд╕рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИ)ред

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

рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ await!(fut) рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ fut Unpin : https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist= 9c189fae3cfeecbb041f68f02f31893d

рдХреНрдпрд╛ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ? рдпрд╣ рдЖрд░рдПрдлрд╕реА рдореЗрдВ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

@Ekleog рдЬреЛ await! рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджреЗ рд░рд╣рд╛ рд╣реИ, await! рдЕрд╡рдзрд╛рд░рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд рднрд╡рд┐рд╖реНрдп рдХреЛ рд╕реНрдЯреИрдХ-рдкрд┐рди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ !Unpin рдлреНрдпреВрдЪрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ ( рддреНрд╡рд░рд┐рдд рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдЙрджрд╛рд╣рд░рдг )ред рддреНрд░реБрдЯрд┐ impl Future for Box<impl Future + Unpin> рдкрд░ рдмрд╛рдзрд╛ рд╕реЗ рдЖрддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп Unpin рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

// where Foo: Future + !Unpin
let mut foo: Box<Foo> = ...;
Pin::new(&mut foo).poll(cx);
let mut foo = Box::new(*foo);
Pin::new(&mut foo).poll(cx);

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

рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЛ рд╕рдВрднрд╡рддрдГ Box<dyn Future> рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ

рд╢рд╛рдпрдж IntoFuture рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ await! рд▓рд┐рдП рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП? Box<dyn Future> рдЗрд╕реЗ Pin<Box<dyn Future>> рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрд╕рд┐рдВрдХ/рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдЕрдЧрд▓рд╛ рдмрдЧ рдпрд╣рд╛рдВ рдЖрддрд╛ рд╣реИ: рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ async fn рдмреНрд░реЗрдХ рдЕрдиреБрдорд╛рди рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛: https://github.com/rust-lang/rust/ рдореБрджреНрджреЗ/60414

рд╢реАрд░реНрд╖-рдкреЛрд╕реНрдЯ рдХреА рд╕реВрдЪреА рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ # 60414 рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ (рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рд╢рд╛рдпрдж рдпрд╣ рдЬреАрдердм рд▓реЗрдмрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛?), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ "рдЬрдВрдЧ-рд▓реИрдВрдЧ рдХрд╛ рд╕рдорд╛рдзрд╛рди/ rfcs#2418тАЭ рдкрд░ рдирд┐рд╢рд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ IIRC рдХреЗ Future рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕реНрдерд┐рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

рдореИрдВ рдмрд▓реНрдХрд┐ рд▓рд┐рдЦрддрд╛ рд╣реВрдБ

let x = (await future)?

рдЙрд╕ рдЕрдЬреАрдм рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗред

рдЪреЗрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдореИрдВ 1 await рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рджреЛрдмрд╛рд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рд╕рд╛рде рд╣реА, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ( рд╕реНрдорд╛рд░реНрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкреНрд░рд╕реНрддрд╛рд╡ ):

const x = promise
  |> await #
  |> x => x.foo
  |> await #
  |> x => x.bar

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

@KSXGitHub рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рддрд░реНрдХ рдХреЛ рдпрд╣рд╛рдВ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рдХрд╛рд░рдг рд╣реИрдВ рдЬреЛ рдХрдИ рдорд╣реАрдиреЛрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реЛрдЪрд╛ рдЧрдпрд╛ рд╣реИ https://boats.gitlab.io/blog/post /рдкреНрд░рддреАрдХреНрд╖рд╛-рдирд┐рд░реНрдгрдп/

@KSXGitHub рдЬрдмрдХрд┐ рдореИрдВ рдЕрдВрддрд┐рдо рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рднреА рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдХреА #57640, https://internals.rust-lang.org/t/await-syntax-discussion-summary/ , https://internals.rust- рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред

рдХреГрдкрдпрд╛ рдпрд╣рд╛рдБ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд┐рд░реНрдгрдпреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рди рдХрд░реЗрдВ, рдЗрд╕ рд╕реНрдкрд╖реНрдЯ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрддреНрд░ рд╣реИ

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

@ рдореЗрд░реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП

рдХреНрдпрд╛ 4 рдЬреБрд▓рд╛рдИ рдХреЛ рдЕрдЧрд▓реЗ рдмреАрдЯрд╛ рдХрдЯ рдХреЗ рд▓рд┐рдП рд╕рдордп рдкрд░ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ, рдпрд╛ рдмрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЪрдХреНрд░ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА? A-async-рдкреНрд░рддреАрдХреНрд╖рд╛ рдЯреИрдЧ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЦреБрд▓реЗ рдореБрджреНрджреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

рдЖрд╣, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВ, рдореИрдВрдиреЗ рдЕрднреА - рдЕрднреА рдЦреЛрдЬрд╛ рд╣реИ ред

рдирдорд╕реНрддреЗ! рд╣рдореЗрдВ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕реНрдерд┐рд░ рд░рд┐рд▓реАрдЬ рдХреА рдЙрдореНрдореАрдж рдХрдм рдХрд░рдиреА рд╣реИ? рдФрд░ рдореИрдВ рдЗрд╕реЗ рд░рд╛рдд рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

@MehrdadKhnzd https://github.com/rust-lang/rust/issues/62149 рдореЗрдВ рд▓рдХреНрд╖реНрдп рд░рд┐рд▓реАрдЬ рдХреА рддрд╛рд░реАрдЦ рдФрд░ рдЕрдзрд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ

рд╡рд╣рд╛рдБ рдпреЛрдЬрдирд╛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╣реИ Unpin рд╡рд╛рдпрджрд╛ рд╣реИ рдХрд┐ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд░ рд░рд╣реЗ рдХреЗ рд▓рд┐рдП async fn ?

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

@DoumanAsh рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ async fn рдХреЗ рдкрд╛рд╕ рдЙрдкрдЬ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдХрднреА рднреА рдХреЛрдИ рд╕рдХреНрд░рд┐рдп рдЖрддреНрдо-рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЙрддреНрдкрдиреНрди рднрд╡рд┐рд╖реНрдп рд╕рдВрднрд╡рддрдГ рдЕрдирдкрд┐рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде "рдЗрд╕_ рдЙрдзрд╛рд░ рдХреЗ рдХрд╛рд░рдг Unpin рдирд╣реАрдВ" рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА + "рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдк рдЗрд╕ рднрд╡рд┐рд╖реНрдп рдХреЛ рдмреЙрдХреНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рдХрд╛ рдПрдХ рд╕рдВрдХреЗрдд

#63209 рдкрд░ рд╕реНрдерд┐рд░реАрдХрд░рдг рдкреАрдЖрд░ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ "рд╕рднреА рдЕрд╡рд░реЛрдзрдХ рдЕрдм рдмрдВрдж рд╣реЛ рдЧрдП рд╣реИрдВред" рдФрд░ 20 рдЕрдЧрд╕реНрдд рдХреЛ рд░рд╛рдд рдореЗрдВ рдЙрддрд░рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рдкреНрддрд╛рд╣ рдХреЗ рдЕрдВрдд рдореЗрдВ рдмреАрдЯрд╛ рдХрдЯ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 20 рдЕрдЧрд╕реНрдд рд╕реЗ рдХреБрдЫ рдирдП рдЕрд╡рд░реЛрдзрди рдореБрджреНрджреЗ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ AsyncAwait-Blocking рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдЗрдирдореЗрдВ рд╕реЗ рджреЛ (#63710, #64130) рдЕрдЪреНрдЫреЗ-рд╕реЗ-рдЕрдЪреНрдЫреЗ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдерд┐рд░реАрдХрд░рдг рдореЗрдВ рдмрд╛рдзрд╛ рдирд╣реАрдВ рдбрд╛рд▓реЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рддреАрди рдЕрдиреНрдп рдореБрджреНрджреЗ рд╣реИрдВ (#64391, #64433, #64477) рдЬреЛ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд╛рдпрдХ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред рдпреЗ рдмрд╛рдж рдХреЗ рддреАрди рдореБрджреНрджреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдпреЗ рд╕рднреА рдкреАрдЖрд░ #64292 рдХреЗ рдХрд╛рд░рдг рдЙрддреНрдкрдиреНрди рд╣реБрдП рд╣реИрдВ, рдЬреЛ рд╕реНрд╡рдпрдВ AsyncAwait-Blocking рд╕рдорд╕реНрдпрд╛ # 63832 рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддрд░рд╛ рдерд╛ред рдПрдХ рдкреАрдЖрд░, #64584, рдкрд╣рд▓реЗ рд╣реА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдЙрддрд░ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреАрди рдореБрджреНрджреЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╣реИрдВред

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

@bstree рд╣рдо рдЙрдиреНрд╣реЗрдВ "рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдиреЛрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд▓реЗрдмрд▓ рдХреА рдХрдореА рдХреЗ рд▓рд┐рдП "AsyncAwait-blocking" рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдореЗрдВ рд▓реЗрдмрд▓рд┐рдВрдЧ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЬрд▓реНрдж рд╣реА рд╕реБрдзрд╛рд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЗрд╕реЗ рдХрдо рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, cc @nikomatsakis.

... рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ... рд╣рдо 1.38 рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдореЗрдВ async-рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕реЗ рдЪреВрдХ рдЧрдПред 1.39 рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИ, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдХреБрдЫ "рдореБрджреНрджреЛрдВ" рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ рд╣реБрдИ ...

@earthengine рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдЪрд┐рдд рдЖрдХрд▓рди рд╣реИред рдЬреЛ рдореБрджреНрджреЗ рд╕рд╛рдордиреЗ рдЖрдП рд╣реИрдВ, рд╡реЗ рд╕рднреА рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд▓реЗрдиреЗ рд▓рд╛рдпрдХ рд╣реИрдВред рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ async рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдЗрди рдореБрджреНрджреЛрдВ рдореЗрдВ рдЗрд╕реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ :)

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

modsec picture modsec  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Robbepop picture Robbepop  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

overvenus picture overvenus  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pedrohjordao picture pedrohjordao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jmegaffin picture jmegaffin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ