Rust: `await` ๊ตฌ๋ฌธ ํ•ด๊ฒฐ

์— ๋งŒ๋“  2019๋…„ 01์›” 15์ผ  ยท  512์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ด ์Šค๋ ˆ๋“œ์— ๋Œ“๊ธ€์„ ๋‹ฌ๊ธฐ ์ „์— https://github.com/rust-lang/rust/issues/50547 ์„ ํ™•์ธํ•˜๊ณ  ์ด๋ฏธ ์ž‘์„ฑ๋œ ์ธ์ˆ˜๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.


๋ชฉ์ž๋“ค์˜ ๋ฉ”๋ชจ :

์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ https://github.com/rust-lang/rust/issues/57640#issuecomment -456617889์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์—๋Š” ์„ธ ๊ฐ€์ง€ ํ›Œ๋ฅญํ•œ ์š”์•ฝ ์ฃผ์„์ด ๋’ค๋”ฐ ๋ž์œผ๋ฉฐ ๊ทธ์ค‘ ๊ฐ€์žฅ ์ตœ๊ทผ์—๋Š” https : //github.com/rust-lang/rust/issues/57640#issuecomment -457101180. (๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, @traviscross!)

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

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ await ๊ตฌ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.


Kotlin

val result = task.await()

์”จ

var result = await task;

์—ํ”„

let! result = task()

์Šค์นผ๋ผ

val result = Await.result(task, timeout)

ํŒŒ์ด์ฌ

result = await task

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ

let result = await task;

C ++ (์ฝ” ๋ฃจํ‹ด TR)

auto result = co_await task;

๋งˆ๊ตฌ ์ž๋ฅด๊ธฐ

$result = await task;

๋‹คํŠธ

var result = await task;

์ด ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  Rust ํ‘œํ˜„์‹์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—ฐ๊ฒฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ฉ์‹œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  512 ๋Œ“๊ธ€

๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ await ๊ตฌ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.


Kotlin

val result = task.await()

์”จ

var result = await task;

์—ํ”„

let! result = task()

์Šค์นผ๋ผ

val result = Await.result(task, timeout)

ํŒŒ์ด์ฌ

result = await task

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ

let result = await task;

C ++ (์ฝ” ๋ฃจํ‹ด TR)

auto result = co_await task;

๋งˆ๊ตฌ ์ž๋ฅด๊ธฐ

$result = await task;

๋‹คํŠธ

var result = await task;

์ด ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  Rust ํ‘œํ˜„์‹์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—ฐ๊ฒฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ฉ์‹œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  Rust ํ‘œํ˜„์‹์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—ฐ๊ฒฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ฉ์‹œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์žฅ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด์—๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด์žˆ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” Rust, Kotlin, C # (์˜ˆ : ๋ฉ”์„œ๋“œ ๊ตฌ๋ฌธ LINQ ๋ฐ ๋‹ค์–‘ํ•œ ๋นŒ๋”) ๋ฐ F #์ด ํฌํ•จ๋˜์ง€๋งŒ ํ›„์ž๋Š” ๋™์ผํ•œ ํšจ๊ณผ๋ฅผ ์œ„ํ•ด ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์ „ํžˆ ๋‚ด ์ผํ™”์ด์ง€๋งŒ, ์•ผ์ƒ์—์„œ Rust ์ฝ”๋“œ์—์„œ ์ˆ˜์‹ญ ๊ฐœ ์ด์ƒ์˜ ๋ฉ”์†Œ๋“œ ์ฒด์ธ ํ‘œํ˜„์‹์„ ์ •๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์ž˜ ์ฝ๊ณ  ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊ฒฝํ—˜ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ # 50547์˜ ์ตœ์ƒ์œ„ ๊ฒŒ์‹œ๋ฌผ ( "๋Œ€๊ธฐ์— ๋Œ€ํ•œ ์ตœ์ข… ๊ตฌ๋ฌธ"ํ™•์ธ๋ž€ ์˜†์— ์žˆ์Œ)์—์„œ ์–ธ๊ธ‰ ๋œ ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Kotlin

val result = task.await()

Kotlin์˜ ๊ตฌ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

val result = doTask()

await ๋Š” ์ผ๋ฅ˜๊ฐ€ ์•„๋‹Œ suspendable function ์ž…๋‹ˆ๋‹ค.

๋ง์”€ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Kotlin์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๋ž˜๊ฐ€ ์—ด๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์•”์‹œ ์ ์ด๋ผ๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ง€์—ฐ๋œ ๋ธ”๋ก์„ ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ์€ ์ง€์—ฐ๋œ ๋ธ”๋ก์˜ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์„ ์—ฌ๋Ÿฌ ๋ฒˆํ–ˆ๋‹ค.

@cramertj https://github.com/rust-lang/rust/issues/50547์— 276 ๊ฐœ์˜ ๋Œ“๊ธ€์ด ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ธฐ ์‰ฝ๋„๋ก ์—ฌ๊ธฐ์— ์ž‘์„ฑ๋œ ์ธ์ˆ˜๋ฅผ ์š”์•ฝ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์•„๋งˆ ์—ฌ๊ธฐ OP์— ์ถ”๊ฐ€ํ• ๊นŒ์š”?)

Kotlin์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๋ž˜๊ฐ€ ์—ด๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์•”์‹œ ์ ์ด๋ผ๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ง€์—ฐ๋œ ๋ธ”๋ก์„ ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ์€ ์ง€์—ฐ๋œ ๋ธ”๋ก์˜ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์„ ์—ฌ๋Ÿฌ ๋ฒˆํ–ˆ๋‹ค.

์•ฝ๊ฐ„์˜ ์ปจํ…์ŠคํŠธ / ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ๋‘ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ go-lang๊ณผ ๊ฐ™์€ ์•”์‹œ ์  ๋Œ€๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—๋Š” ๋ฌด์—‡์ด ์žˆ์Šต๋‹ˆ๊นŒ?

post-fix ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ํ˜ธ์ถœ์ž์˜ ๊ด€์ ์—์„œ await๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ๋ฆ„ ์ œ์–ด๋ฅผ ํฌ๊ธฐํ•˜๊ณ  ๋‹ค์‹œ ๊ฐ€์ ธ ์˜ค๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์Šคํƒ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํ•จ์ˆ˜ ํŒจ๋ž€ ํ…Œ ์‹œ์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•œ ๋™์ž‘์„ ํฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋™์ž‘์ด ๋™๊ธฐํ™” ๋ธ”๋ก๊ณผ ๋น„๋™๊ธฐ ๋ธ”๋ก ์‚ฌ์ด์—์„œ ์ผ๊ด€๋˜๋„๋ก ์ฒซ ๋ฒˆ์งธ ์‹คํ–‰์—์„œ ์ฝ” ๋ฃจํ‹ด์˜ ๊ตฌ์„ฑ์„ ๋ถ„ํ• ํ•˜๋ ค๋Š” ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•”๋ฌต์  ์ฝ” ๋ฃจํ‹ด ์Šคํƒ€์ผ์— ๋Œ€ํ•ด ๋…ผ์˜๋˜๊ณ  ์žˆ๊ณ  ์ €๋Š” ๋ช…์‹œ ์„ฑ์˜ ํŽธ์—์žˆ๋Š” ๋ฐ˜๋ฉด ์ฝ” ๋ฃจํ‹ด์„ .await!() ๋Š” ๋ณดํ†ต ํ˜ธ์ถœ๊ณผ ์ฝ” ๋ฃจํ‹ด ํ˜ธ์ถœ์„ ๊ตฌ๋ถ„ํ•˜๋ ค๋Š” ์‹œ๋„์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํฌ์ŠคํŠธ ํ”ฝ์Šค๊ฐ€ ์„ ํ˜ธ๋˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ๋‹ค์†Œ ์ƒˆ๋กœ์šด ๊ด€์ ์„ ์ œ๊ณต ํ•œ ํ›„, ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ฒธ์†ํ•œ ์ œ์•ˆ :

  • future(?)
  • ๋˜๋Š” future(await) ๋Š” ๋ฌผ๋ก  ์ž์ฒด ์žฅ๋‹จ์ ์ด ์žˆ์ง€๋งŒ ๋œ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ›์•„ ๋“ค์—ฌ์ง€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฒŒ์‹œ๋ฌผ ํ•˜๋‹จ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ƒ๋‹นํžˆ ์ธ๊ธฐ์žˆ๋Š” ์˜ˆ์ œ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค ( logger.log ๋„ ์ฝ” ๋ฃจํ‹ด์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ์ฆ‰์‹œ ํ˜ธ์ถœ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค).

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

๊ทธ๋ฆฌ๊ณ  ๋Œ€์•ˆ :

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

์ฝ์„ ์ˆ˜์—†๋Š” ์ฝ”๋“œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ๊ตฌ๋ฌธ ๋ถ„์„์„ ๋•๊ธฐ ์œ„ํ•ด ๋ฌผ์Œํ‘œ์™€ ์—ด๋ฆฐ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์‚ฌ์ด๊ฐ€ ์•„๋‹Œ ๋ฌผ์Œํ‘œ ๋’ค์˜ ๊ณต๋ฐฑ ๋งŒ ํ—ˆ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋”ฐ๋ผ์„œ future(? ) ์€ ์ข‹์ง€๋งŒ future( ?) ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋ชจ๋“  ํ˜„์žฌ ํ† ํฐ์„ ์ด์ „๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” future(await) ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ˆ˜์ • ํ›„ ์—ฐ์‚ฐ์ž (์˜ˆ : ํ˜„์žฌ ? -try)์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ๋„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋˜๋Š”

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

์ด๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์œ  :

  • .await!() ์™€ ๋น„๊ตํ•˜๋ฉด ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ํšŒ์›์„ ์•”์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐ ๋ฐ ? ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ˜ธ์ถœ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ ํ–‰ ์ˆ˜์—…์˜ ์ˆ˜๋ฅผ ๋‚ฎ์ถ”๊ณ  ํ•™์Šต์— ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ (ํŠน์„ฑ์ด ์žˆ๋”๋ผ๋„) ์–ธ์–ด์—์„œ ํ•ญ์ƒ ๋‹ค์†Œ ํŠน๋ณ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ๊ณผ ํšจ๊ณผ๋ฅผ ๊ฐ€์ง„ ์ž์‹ ์˜ my_await!() ๋ฅผ ์ •์˜ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ธฐ๋Œ€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” ์žฌ๊ฐœ์‹œ ๋” ๋งŽ์€ ์ธ์ˆ˜๊ฐ€ ์ œ๊ณต ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ์ƒ์„ฑ๊ธฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ์„ฑ๊ธฐ์™€ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ผ๋ฐ˜ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ์ด๊ฒƒ์€ FnOnce ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๋ฐ˜๋ฉด Streams ๋Š” FnMut ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ฃผ์žฅ๋„ ์‰ฝ๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ „์— ํ˜„์žฌ Futures ๋ฅผ ์‚ฌ์šฉํ•œ ์ ์ด์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด, ์ด๊ฒƒ์€ ? ์™€ ํ•จ๊ป˜ Poll ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ ํ–ˆ์–ด์•ผํ–ˆ๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค (๋ถˆํ–‰ํ•œ ์•ˆ์ •ํ™” ์‹œํ€€์Šค ์—ฌ๊ธฐ). ํ•™์Šต ๋‹จ๊ณ„๋กœ์„œ ? ๊ธฐ๋ฐ˜ ์šด์˜์ž๊ฐ€ ์ œ์–ด ํ๋ฆ„์„ ์ „ํ™˜ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— (await) ๋Š”์ด๋ฅผ ๋งŒ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ๋ถ„๊ธฐ์ ์—์„œ ์žฌ๊ฐœ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ์ด ์ธ์ˆ˜๋Š” ๋‚˜์™€ ๋™์˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ์ด์œ  :

  • ? ๋Š” ์ธ์ˆ˜๋กœ ๋ณด์ด์ง€๋งŒ ํ‘œํ˜„์‹์—๋„ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ ์šฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ํ† ํฐ์ด ๋‹ค์†Œ ์ •ํ™•ํ•œ ๊ฐœ๋… ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ž์ฒด์ด๋ฏ€๋กœ ๊ต์œก์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๊ตฌ๋ฌธ์ด ๋ชจํ˜ธํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊ธ์ •์ ์œผ๋กœ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • paranthesis์™€ ? ๋” ๋งŽ์€ (๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ) ํ˜ผํ•ฉ์€ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํ•˜๋‚˜์˜ ๋ฏธ๋ž˜๊ฐ€ ๋‹ค๋ฅธ ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ : construct_future()(?)?(?)? . ๊ทธ๋Ÿฌ๋‚˜ fn ๊ฐ์ฒด์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋™์ผํ•œ ์ธ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‘œํ˜„์‹์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. foobar()?()?()? . ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‚˜๋Š” ์ด๊ฒƒ์ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ๋ถˆ๋งŒ์„ ํ’ˆ์€ ๊ฒƒ์„ ๋ณธ ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ๋ณ„๋„์˜ ์ง„์ˆ ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” construct_future()(await)?(await)? ์—๋„ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค-
  • future(?) ๋Š” ๊ฐ„๊ฒฐํ•˜๊ณ  ์—ฌ์ „ํžˆ ๋‹ค์†Œ ๊ฐ„๊ฒฐํ•œ ๊ตฌ๋ฌธ์—์„œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์ด์œ ๋Š” ์ฝ” ๋ฃจํ‹ด์˜ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ (์ผ์‹œ์ ์œผ๋กœ ์ด๋ ฅ์„œ์— ๋ฐ˜ํ™˜ ๋ฐ ๋ฐœ์†ก)์— ๊ธฐ๋ฐ˜์„๋‘๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ถ”์ƒํ™”์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. future(await) ๋Š” await ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ๋‚ด์žฌํ™” ํ•œ ํ›„์—๋„ ์„ค๋ช… ํ•  ์ˆ˜์žˆ๋Š” ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์ธ์ˆ˜ ์œ„์น˜๋Š” ์ œ๊ฒŒ ์‚ผํ‚ค๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ฝ” ๋ฃจํ‹ด์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ ํ•  ๋•Œ ํ™•์‹คํžˆ ๋” ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ œ์•ˆ๊ณผ ๊ฐ„์„ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  • ๋„ˆ ์Šค์Šค๋กœ? ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ์ด ๊ฐ„๊ฒฐํ•œ post-fix ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋‚ญ๋น„์ฒ˜๋Ÿผ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

future(?)

Result ์—๋Š” ํŠน๋ณ„ํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. Futures๋Š” ๋ชจ๋“  Rust ์œ ํ˜•์„ ๋ฐ˜ํ™˜ ์ผ๋ถ€ ์„ ๋ฌผ์€ Result ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด Result ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” Futures์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ์š”?

๋‚ด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. future(?) ๋Š” ์ด์ „์— future.await!() ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ๋…ผ์˜ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฏธ๋ž˜์—๋„ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์€ future(?)? (์ œ์–ด ํ๋ฆ„์„ ์กฐ๊ธฐ์— ํฌ๊ธฐํ•  ์ˆ˜์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•). ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ฏธ๋ž˜ ํด๋ง (?) ๋ฐ ๊ฒฐ๊ณผ ํ…Œ์ŠคํŠธ ? ์ง๊ตํ•ฉ๋‹ˆ๋‹ค. ํŽธ์ง‘ : ์ด์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์˜ˆ์ œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ“จ์ฒ˜์— ๋Œ€ํ•œ ๋ถ„๊ธฐ๋„ future(?)?

๋ช…ํ™•ํžˆ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‚˜๋Š” ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์˜ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ฆ‰, Future<Output = Result<_, _>> ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด foo()(?)? ์™€ ๊ฐ™์ด ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์ด ๋งค์šฐ ๋งŽ๊ณ  ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์œผ๋กœ ? ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฌด๊ฑฐ์šด ? ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ํžŒํŠธ๋ผ๋ฉด ๋ฌผ๋ก  ์ƒˆ๋กœ ์˜ˆ์•ฝ ๋œ ํ‚ค์›Œ๋“œ๋กœ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฒ˜์Œ์— ์ด๊ฒƒ์ด ์ˆ˜์ˆ˜๊ป˜๋ผ ๊ฐ™์€ ์œ ํ˜•์˜ ์‹ค์ œ ์ฃผ์žฅ๊ณผ ๋„ˆ๋ฌด ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ๊ทธ ์ ˆ์ถฉ์•ˆ์€ ์ง„์ˆ ์„ ์ •์‹ ์ ์œผ๋กœ ํŒŒ์‹ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ impl Future<Output = Result<_,_>> ๋Œ€ํ•œ ๋™์ผํ•œ ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • foo()(await)?

? ์ด ์ ์ ˆํ•œ ์ด์œ ๋Š” ์‚ฌ์šฉ๋˜๋Š” ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋‹ค์†Œ ์œ ์‚ฌํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ˜„์žฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ Poll ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ). ์ด๊ฒƒ์€ ์ข‹์€ ์ถ”์ƒํ™”์˜ ์š”์ ์„ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ์ด ๋งค์šฐ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ช…๋ฐฑํ•œ ๊ธฐ๋‹ค๋ฆผ์˜ ์š”์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์€ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์„ ์œ„ํ•ด.

์˜ˆ, foo()(await) -๊ตฌ๋ฌธ์ด ํ›จ์”ฌ ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์€ ํด๋กœ์ €๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•œ ๋‹ค์Œ JS์—์„œ ํด๋กœ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"syntax-heavy"์— ๋Œ€ํ•œ ๋‚˜์˜ ์ฝ๊ธฐ๋Š” "sigil-heavy"์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ()(?)? ์˜ ์‹œํ€€์Šค๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์—‰๋ง์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

paranthesis์™€ ? ๋” ๋งŽ์€ (๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ) ํ˜ผํ•ฉ์€ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํ•˜๋‚˜์˜ ๋ฏธ๋ž˜๊ฐ€ ๋‹ค๋ฅธ ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ : construct_future()(?)?(?)?

๊ทธ๋Ÿฌ๋‚˜ fn ๊ฐ์ฒด์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋™์ผํ•œ ์ธ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ‘œํ˜„์‹์ด ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. foobar()?()?()? . ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‚˜๋Š” ์ด๊ฒƒ์ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ๋ถˆ๋งŒ์„ ํ’ˆ์€ ๊ฒƒ์„ ๋ณธ ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ๋ณ„๋„์˜ ์ง„์ˆ ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋Œ€ํ•œ ๋ฐ˜๋ฐ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค : ์•ผ์ƒ์—์„œ -> impl Fn ๋ฅผ ๋ช‡ ๋ฒˆ์ด๋‚˜ ๋ณด์…จ์Šต๋‹ˆ๊นŒ ( -> Result<impl Fn() -> Result<impl Fn() -> Result<_, _>, _>, _> ์ œ์™ธ)? ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ -> impl Future<Output = Result<_, _>> ๋ฅผ ๋ช‡ ๋ฒˆ์ด๋‚˜ ๋ณผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๊นŒ? ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํฌ๊ท€ ํ•œ impl Fn ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์ž„์‹œ impl Future ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ƒ๋‹น ๋ถ€๋ถ„์— ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํฌ๊ท€ ํ•œ impl Fn ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ์ž„์‹œ impl Future ๋ฐ˜ํ™˜ ๊ฐ’์˜ ์ƒ๋‹น ๋ถ€๋ถ„์— ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ ์„ ํƒ์ด ๊ฒฐ๊ณผ ์œ ํ˜•์˜ ์ด๋ฆ„์„ ๋ช…์‹œ ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผํ•˜๋Š” ํšŸ์ˆ˜์— ์–ด๋–ป๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. await? future ์™€ ๋‹ค๋ฅธ ์œ ํ˜• ์ถ”๋ก ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ๋ถ„์€ ๋ชจ๋‘ ์—ฌ๊ธฐ์—์„œ ๋งค์šฐ ์ข‹์€ ์ ์„ ์ง€์ ํ•˜๊ณ  ๋” ๋งŽ์€ ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ• ์ˆ˜๋ก (์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์€ ํ•ญ์ƒ ๋‘ ๊ฐ€์ง€ ๊ตฌ๋ฌธ ๋ฒ„์ „์„ future(await) ๋” ์˜์ง€ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ดํ•‘ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์œผ๋ฉฐ ์ด๊ฒƒ์ด ๋ถˆ๋Ÿฌ ์ผ์œผํ‚ค๋ ค๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์˜ ๋ชจ๋“  ๋ช…ํ™•์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๋ฒˆ์ด๋‚˜ ๋ณผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๊นŒ-> impl Future> ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ?

๋‚˜๋Š”์ด ์œ ํ˜•์— ํ•ด๋‹น ๋ณผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ (๋น„๋™๊ธฐ FN์„ ๊ทธ ๋ฆฌํ„ด ๊ฒฐ๊ณผ) ๋ชจ๋“  ์‹œ๊ฐ„, ๋ชจ๋“  ๋น„๋™๊ธฐ FNS์˜ ๊ฐ€๋Šฅ์„ฑ๋„ ๋Œ€๋ถ€๋ถ„, ๋‹น์‹ ์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ ์žˆ๋Š” ๊ฒƒ์€ ์‹ฌ์ง€์–ด IO ๊ฒฝ์šฐ ๋•Œ๋ฌธ์—, ๋‹น์‹ ์€ ๊ฑฐ์˜ ํ™•์‹คํ•˜๊ฒŒ ๋˜์ง€๊ณ ์žˆ์„๊ฑฐ์•ผ ์œ„์ชฝ์œผ๋กœ IO ์˜ค๋ฅ˜.


์ถ”์  ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์— ์—ฐ๊ฒฐ ํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์—๋Š” await ๋ฌธ์ž์—ด์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ์ด ํ—ˆ์šฉ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด 1 ๋…„ ๋™์•ˆ ์ž‘์—… ํ•œ ํ›„์—๋Š” ์•Œ๋ ค์ง„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์˜ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ด ๋” ์ƒ์‚ฐ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์„ ๊ณ ๋ คํ•  ๋•Œ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ตฌ๋ฌธ์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋กœ ์ ‘๋‘์‚ฌ๊ฐ€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ (์ค‘๊ด„ํ˜ธ ๋˜๋Š” ๊ด„ํ˜ธ ๋˜๋Š” ๋‘˜ ๋‹ค ํ—ˆ์šฉ)์— ๋Œ€ํ•œ ๊ฒฐ์ •๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค ๋ชจ๋‘๋Š” ๊ณ ์œ  ํ•œ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, await(future) ๋˜๋Š” await { future } ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ๊ฐ€ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€๋งŒ ๊ตฌ๋ฌธ ์ƒ ์‹œ๋„๋Ÿฝ๊ณ  ๋‘ ๊ตฌ๋ถ„์ž ์˜ต์…˜ ๋ชจ๋‘ ํ˜ผ๋™์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ? ์™€ ๊ด€๋ จ๋œ "์œ ์šฉํ•œ"์šฐ์„  ์ˆœ์œ„๋กœ ์ ‘๋‘์–ด๊ฐ€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. (์ฆ‰, ๊ทธ ๋Œ€๊ธฐ๋Š”?๋ณด๋‹ค ๋” ๋นก๋นกํ•˜๊ฒŒ ๋ฌถ์ž…๋‹ˆ๋‹ค.) ์ด๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋ฅผ ๋†€๋ผ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ณด๋‹ค ์••๋„์ ์œผ๋กœ ๋” ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
  • ? ์— ๋Œ€ํ•œ "๋ช…๋ฐฑํ•œ"์šฐ์„  ์ˆœ์œ„๋กœ ์ ‘๋‘์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. (์ฆ‰,? ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋นก๋นกํ•˜๊ฒŒ ๋ฌถ์Šต๋‹ˆ๋‹ค). ๊ฒฐํ•ฉ ๋œ await ๋ฐ?์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ตฌ๋ฌธ ์„คํƒ• await? ์šด์˜์ž. ์ด ๊ตฌ๋ฌธ ์„คํƒ•์€์ด ์šฐ์„  ์ˆœ์œ„ ์ˆœ์„œ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํ•ญ์ƒ (await future)? ์“ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ œ๊ฐ€ ์—ด๊ฑฐ ํ•œ ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์˜ ๋” ๋‚˜์œ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค.
  • ๊ตฌ๋ฌธ ๊ณต๊ฐ„์ด์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‘ ์—ฐ์‚ฐ์ž ์‚ฌ์ด์— ๋ช…ํ™•ํ•œ ์‹œ๊ฐ์  ์ˆœ์„œ๋ฅผ ๊ฐ€์ง์œผ๋กœ์จ ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ๋งŽ์€ ์ธก๋ฉด์—์„œ ๋ถˆ์•ˆ๊ฐ์„ ๋Š๋‚๋‹ˆ๋‹ค.

๋‚ด ์ž์‹ ์˜ ์ˆœ์œ„๋Š” ๋‚ด๊ฐ€ ๋ฌธ์ œ๋ฅผ ์กฐ์‚ฌ ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋Ÿฌํ•œ ์„ ํƒ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์„คํƒ•์— ๋Œ€ํ•œ ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ธ์ฒด ๊ณตํ•™, ์นœ์ˆ™ ํ•จ ๋ฐ ์ดํ•ด๋ ฅ์˜ ์ตœ์ƒ์˜ ๊ท ํ˜•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณผ๊ฑฐ์—๋Š” ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋…ผ์˜๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ์˜ต์…˜์— ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„ | ๋ฏธ๋ž˜ | ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜ | ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ
--- | --- | --- | ---
ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ | await(future) ๋˜๋Š” await { future } | await(future)? ๋˜๋Š” await { future }? | await(future?) ๋˜๋Š” await { future? }
์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„ | await future | await future? | await (future?)
์„คํƒ•์ด์žˆ๋Š” ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„ | await future | await? future ๋˜๋Š” (await future)? | await future?
์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ | future await | future await? | future? await

(์ด ์˜ต์…˜์„ "postfix macro"์™€ ๊ฐ™์€ ๋‹ค๋ฅธ postfix ๊ตฌ๋ฌธ๊ณผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํžˆ "postfix keyword"๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.)

์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„์—์„œ await future? ์˜ '์ถ•๋ณต'์˜ ๋‹จ์  ์ค‘ ํ•˜๋‚˜์ด์ง€๋งŒ ํ›„์œ„ ์ˆ˜์ •์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ? ๋กœ ํ‘œํ˜„์‹์„ ์ˆ˜๋™์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ด ๋” ์ด์ƒ ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” Future ๊ฐ€ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ Result ๋ฉ”์†Œ๋“œ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ๋ณต์ œํ•˜๋„๋ก ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๋ณต์ œ๋˜๋ฉด, ์–ด๋Š ๊ฒฐํ•ฉ์ž๊ฐ€ ๋ฐ˜ํ™˜ ๋œ ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด ์ผํ•˜๊ณ  ์—ด๋งํ•˜๋Š”์ง€๊ฐ€ ๊ฐ‘์ž๊ธฐ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง‘๋‹ˆ๋‹ค. ์ฆ‰, ์•”์‹œ ์  ๋Œ€๊ธฐ์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๊ฒฐํ•ฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํŽธ์ง‘ : ์‹ค์ œ๋กœ ? ์˜ ๋†€๋ผ์šด ๋Œ€์ฒด๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋” ๊ธฐ์ˆ ์  ์ธ ๊ด€์ ์ด์žˆ๋Š” ์•„๋ž˜ ๋‘ ๊ฐœ์˜ ์ฃผ์„์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค)

์˜ค๋ฅ˜ ์‚ฌ๋ก€์—์„œ ๋ณต๊ตฌ ํ•  ์ˆ˜์žˆ๋Š” ์˜ˆ :

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

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

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

์‹ค์ œ ์ˆ˜์ • ํ›„ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด์„œ๋Š”์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ๋“ค์€ ๋‹ค๋ฅธ ํ‘œํ˜„์‹์ด๋ฉฐ, ์  ์—ฐ์‚ฐ์ž๋Š” "๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„" await ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฏ€๋กœ ๋™๋“ฑํ•œ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ or_recover ๊ฐ€ ๋น„๋™๊ธฐ์ธ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ชจํ˜ธ์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค. ๋‹น์‹ ์€ ํ‘œํ˜„์ด ์ „์ฒด์ ์œผ๋กœ ๋น„๋™๊ธฐ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ด์œ ๋กœ ํŠน์ • ๋ถ€๋ถ„์ด ๋น„๋™๊ธฐ์ธ์ง€ ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด or_recover ์˜ ์ •์˜๋ฅผ ๋ณผ ์ˆ˜์žˆ๋‹ค).

์ด๊ฒƒ์€ or_recover๊ฐ€ ๋น„๋™๊ธฐ์ธ์ง€ ์•„๋‹Œ์ง€์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ชจํ˜ธ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜‘๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. unwrap_or_else ์€ (๋Š”) ๋Œ€๊ธฐ ์ค‘์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฝ” ๋ฃจํ‹ด์„ ์ƒ์„ฑํ•ด์•ผํ•˜๋ฏ€๋กœ ๋ชจํ˜ธ์„ฑ์€ get_result ๊ฐ€ ์ฝ” ๋ฃจํ‹ด (์ฝค๋น„ ๋„ค์ดํ„ฐ๊ฐ€ ๋นŒ๋“œ ๋จ)์ธ์ง€ ์•„๋‹ˆ๋ฉด Result<impl Future, _> (๋ฐ Ok ์—๋Š” ์ด๋ฏธ ์ฝ” ๋ฃจํ‹ด์ด ํฌํ•จ๋˜์–ด ์žˆ๊ณ  Err ๋Š” ์ฝ” ๋ฃจํ‹ด์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค). ๋‘˜ ๋‹ค await ์‹œํ€€์Šค ํฌ์ธํŠธ๋ฅผ join ์ด๋™ํ•˜์—ฌ ํšจ์œจ์„ฑ ํ–ฅ์ƒ์„ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋™์ผํ•œ ์šฐ๋ ค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค await ์•”์‹œ ์  ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์–ด๋–ค ๊ฒฝ์šฐ์—๋„์ด ์ค‘๊ฐ„ ๊ณ„์‚ฐ ์€ ๋™๊ธฐํ™” ๋˜์–ด์•ผ ํ•˜๊ณ  await ์ „์— ์œ ํ˜•์— ์ ์šฉ ๋˜์–ด์•ผ ํ•˜๊ณ  ์ฝ” ๋ฃจํ‹ด์ด ๋Œ€๊ธฐ

์ด๋“ค์€ ๋‹ค๋ฅธ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. ๋„ํŠธ ์—ฐ์‚ฐ์ž๋Š” "๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„"await ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฏ€๋กœ ๋™๋“ฑํ•œ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฆ‰, ๋Œ€์ฒด ํ˜ผ๋ž€์˜ ์ผ๋ถ€ ? ํšŒ๋ณต ๋™์ž‘์œผ๋กœ์˜ ์œ„์น˜ ๋ณ€๊ฒฝ๋œ await ๊ทผ๋ณธ์ ์œผ๋กœํ•œ๋‹ค. ? ๊ตฌ๋ฌธ์˜ ์ปจํ…์ŠคํŠธ์—์„œ T expr ๋ถ€๋ถ„ ํ‘œํ˜„์‹์ด ์ฃผ์–ด์ง€๋ฉด ๋ณ€ํ™˜์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค ( T::unwrap_or_else ๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •). :

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

๊ทธ๋Ÿฌ๋‚˜ '์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„'๋ฐ await expr? ( await expr T ์‚ฐ์ถœ ํ•จ)์—์„œ ๋Œ€์‹ 

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

๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„์—์„œ์ด ๋ณ€ํ˜•์€ ๋” ์ด์ƒ ์ถ”๊ฐ€ ๊ด„ํ˜ธ ์—†์ด๋Š” ์ „ํ˜€ ์ ์šฉ๋˜์ง€ ์•Š์ง€๋งŒ ์ ์–ด๋„ ์ง๊ฐ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹'๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ'๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ฝค๋น„ ๋„ค์ดํ„ฐ ์‹œํ€€์Šค์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ์ง€์ ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋” ํฅ๋ฏธ๋กœ์šด ๊ฒฝ์šฐ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Rust ์–ธ์–ด์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ 'ํ‘œํ˜„์‹์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ‰๊ฐ€๋จ'์ด ์ž‘๋™ํ•˜๋„๋ก ๊ธธ๊ฒŒ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” ์ž๋™ ์ฐธ์กฐ ๋งˆ๋ฒ•์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋Œ€๊ธฐ / ์‹œ๋„ / ๊ฒฐํ•ฉ ํฌ์ธํŠธ๊ฐ€์žˆ๋Š” ๋” ๊ธด ์ฒด์ธ์—์„œ ์ด๊ฒƒ์ด ๋” ๋‚˜๋น ์ง„๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์ œ.

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

๋‚ด๊ฐ€ ํ”ผํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ C์˜ ์œ ํ˜• ๊ตฌ๋ฌธ ๋ถ„์„์˜ Rust ์•„๋‚ ๋กœ๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
'ํฌ์ธํ„ฐ'์™€ '๋ฐฐ์—ด'๊ฒฐํ•ฉ ์ž์— ๋Œ€ํ•œ ํ‘œํ˜„์˜ ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ.

@withoutboats ์Šคํƒ€์ผ์˜ ํ…Œ์ด๋ธ” ํ•ญ๋ชฉ :

| ์ด๋ฆ„ | ๋ฏธ๋ž˜ | ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜ | ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ |
|-|-|-|-|
| ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ | await(future) | await(future)? | await(future?) |
| ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„ | await future | await future? | await (future?) |
| ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„ | await future | await? future | await future? |
| Postfix ํ˜ธ์ถœ | future(await) | future(await)? | future?(await) |

| ์ด๋ฆ„ | ์ฒด์ธ |
|-|-|
| ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ | await(await(foo())?.bar())? |
| ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„ | await(await foo()?).bar()? |
| ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„ | await? (await? foo()).bar() |
| Postfix ํ˜ธ์ถœ | foo()(await)?.bar()(await) |

๋‚˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ๊ธฐ๋‹ค๋ฆผ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๊ฐ•๋ ฅํžˆ ์„ ํ˜ธํ•˜์ง€๋งŒ foo await.method() ์€ (๋Š”) ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ๋น„์Šทํ•œ ํ…Œ์ด๋ธ”์„ ๋ณด๋˜ ์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜•์„ ๋ช‡ ๊ฐœ ๋” ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

| ์ด๋ฆ„ | ๋ฏธ๋ž˜ | ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜ | ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ |
| ---------------------- | -------------------- | ----- ---------------- | --------------------- |
| ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ | await { future } | await { future }? | await { future? } |
| ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„ | await future | await future? | await (future?) |
| ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„ | await future | await? future | await future? |
| ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ | future await | future await? | future? await |
| ์ ‘๋ฏธ์‚ฌ ํ•„๋“œ | future.await | future.await? | future?.await |
| ํ›„์œ„ ๋ฐฉ๋ฒ• | future.await() | future.await()? | future?.await() |

์ด์ œ ์—ฐ๊ฒฐ๋œ ๋ฏธ๋ž˜ ํ‘œํ˜„์‹์„ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

| ์ด๋ฆ„ | ๊ฒฐ๊ณผ์˜ ์—ฐ๊ฒฐ ๋ฏธ๋ž˜ |
| ---------------------- | -------------------------- ----------- |
| ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ | await { await { foo() }?.bar() }? |
| ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„ | await (await foo()?).bar()? |
| ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„ | await? (await? foo()).bar() |
| ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ | foo() await?.bar() await? |
| ์ ‘๋ฏธ์‚ฌ ํ•„๋“œ | foo().await?.bar().await? |
| ํ›„์œ„ ๋ฐฉ๋ฒ• | foo().await()?.bar().await()? |

์ด์ œ ์‹ค์ œ ์˜ˆ๋ฅผ ๋“ค์–ด reqwests ์—์„œ ์—ฐ๊ฒฐ ํ•œ ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋‚ด ์„ ํ˜ธํ•˜๋Š” ๋Œ€๊ธฐ ์–‘์‹ ์‚ฌ์šฉ).

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

์‹ค์ œ๋กœ ๋‚˜๋Š” ๋ชจ๋“  ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์ž˜ ๋ณด์ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
let res: MyResponse = client.get("https://my_api").send()/await?.json()/await?;
๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ง€์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์˜๊ฒฌ์ด ์—†์Šต๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ (์˜ˆ : future.await!() )๊ฐ€ ์—ฌ์ „ํžˆ ์˜ต์…˜ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•˜๋ฉฐ ๋ชจํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

| ๋ฏธ๋ž˜ | ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜ | ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ |
| --- | --- | --- |
| future.await! () | future.await! ()? | ๋ฏธ๋ž˜? .await! () |

๋˜ํ•œ postfix ๋งคํฌ๋กœ๋Š” ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋…ธ๋ ฅ์ด ์ ๊ณ  ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ postfix ๋งคํฌ๋กœ๋Š” ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋…ธ๋ ฅ์ด ์ ๊ณ  ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ผ๋ฐ˜์ ์ธ lang ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ 

postfix ๋งคํฌ๋กœ๋Š” postfix์˜ ๊ฐ„๊ฒฐํ•จ๊ณผ ์—ฐ์‡„ ์„ฑ์„ ๋น„๋งˆ ๋ฒ•์ ์ธ ์†์„ฑ ๋ฐ ๋ช…๋ฐฑํ•œ ๋งคํฌ๋กœ์˜ ์กด์žฌ์™€ ๊ฒฐํ•ฉํ•˜๊ณ  ์ผ๋ถ€ .await_debug!() , .await_log!(WARN) ์™€ ๊ฐ™์€ ํƒ€์‚ฌ ์‚ฌ์šฉ์ž ๋งคํฌ๋กœ์— ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค. .await_trace!()

์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋Š” [...] ๋งคํฌ๋กœ์˜ ๋น„๋งˆ ๋ฒ•์  ์†์„ฑ [...]์„ ๊ฒฐํ•ฉํ•˜๋ฏ€๋กœ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@novacrazy ์ด ์ธ์ˆ˜์˜ ๋ฌธ์ œ๋Š” await! ๋งคํฌ๋กœ _would_๊ฐ€ ๋งˆ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (ํ˜„์žฌ ๊ธฐ๋ณธ ์ƒ์„ฑ๊ธฐ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„์ด ๋‹ค์†Œ ๋…ธ์ถœ๋˜์–ด ์žˆ์ง€๋งŒ ์ œ ์ดํ•ด๋Š” ์•ˆ์ •ํ™”๋˜๊ธฐ ์ „์— ์ด๊ฒƒ์€ ์™„์ „ํžˆ ์ˆจ๊ฒจ ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์‹ค์ œ๋กœ ํ˜„์žฌ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ ค๋ฉด rustc -๋‚ด๋ถ€ ์•ผ๊ฐ„ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค)).

@ Nemo157 ํ . ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋„ˆ๋ฌด ๋ถˆํˆฌ๋ช…ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ๋ฒ•์˜ ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹Œ "๋น„๋™๊ธฐ"ํ•จ์ˆ˜์—์„œ ์ƒ์„ฑ๊ธฐ ํ•จ์ˆ˜๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด #[async] ์™€ ๊ฐ™์€ ์ ˆ์ฐจ ์  ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žฌ๊ณ ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ์—ˆ์Šต๋‹ˆ๊นŒ? 3 ๊ฐœ์˜ ์ถ”๊ฐ€ ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•ด์•ผํ•˜๋ฉฐ #[must_use] ๋˜๋Š” #[repr(C)] ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์„œ์— ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹คํ–‰์˜ ํ๋ฆ„์„ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹์ถ”์ƒํ™” ๋ ˆ์ด์–ด๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด ์‹ซ๋‹ค. Rust๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋ฐ˜๋Œ€๋˜๋Š” ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ฝ”๋“œ๋ฅผ ์™„์ „ํžˆ ์ถ”์ ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ์–ด๋””์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์‚ฌ๋ฌผ์„ ํ•ดํ‚นํ•˜๊ณ  ์‹œ์Šคํ…œ์„ ์†์ด ๋„๋ก ์žฅ๋ ค ํ•ด์•ผํ•˜๋ฉฐ, ์•ˆ์ „ํ•œ Rust๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํ†ต์ œ๋ ฅ์„ ์žƒ๋Š”๋‹ค๋ฉด ์ด๊ฒƒ์€ ์•„๋ฌด๊ฒƒ๋„ ๊ฐœ์„ ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋‚˜๋Š” ์›์‹œ ์„ ๋ฌผ์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์–ธ์–ด ( std / core ์•„๋‹˜) ์ธ Rust๊ฐ€ ์‚ฌ์šฉ์ž ๋˜๋Š” std ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ (๋˜๋Š” ๋งค์šฐ ๋น„ํ˜„์‹ค์ ์ธ) ๊ฒฝ์šฐ์—๋งŒ ์ถ”์ƒํ™”์™€ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค๊ณ  ๊ตณ๊ฒŒ ๋ฏฟ์Šต๋‹ˆ๋‹ค core . ์ด ๋ชจ๋“  ๋น„๋™๊ธฐ ์ž‘์—…์€ ๊ทธ ์ ์—์„œ ์†์„ ๋–ผ์—ˆ์Šต๋‹ˆ๋‹ค. rustc ์˜ ํ•€ API์™€ ์ƒ์„ฑ๊ธฐ ์™ธ์— ๋” ๋งŽ์€ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

@novacrazy ๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ์ •์— ๋™์˜ํ•˜์ง€๋งŒ ๊ฒฐ๋ก ์—๋Š” ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๋‚˜ ํ‘œ์ค€์ด ์ˆ˜ํ–‰ ํ•  ์ˆ˜์—†๋Š” (๋˜๋Š” ๋งค์šฐ ๋น„ํ˜„์‹ค์ ์ธ) ๊ฒฝ์šฐ์—๋งŒ ์ถ”์ƒํ™” ๋ฐ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

for ๋ฃจํ”„๊ฐ€ loop ๋กœ ๋ฐ”๋€Œ๋Š” ๋งคํฌ๋กœ๊ฐ€ ๋  ์ˆ˜๋„์žˆ์„ ๋•Œ ์–ธ์–ด์—์„œ ๋ฃจํ”„๋ฅผ ๊ฐ–๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? || closure ๊ฐ€ ์ „์šฉ ํŠธ๋ ˆ์ด ํŠธ ๋ฐ ๊ฐ์ฒด ์ƒ์„ฑ์ž ์ผ ์ˆ˜์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด๋ฏธ try!() ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ์™œ ? ๋„์ž… ํ–ˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ๊ทธ ์งˆ๋ฌธ๊ณผ ๋‹น์‹ ์˜ ๊ฒฐ๋ก ์— ๋™์˜ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์ผ๊ด€์„ฑ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ถ”์ƒํ™”์˜ ์š”์ ์€ ์บก์Šํ™”ํ•˜๋Š” ๋™์ž‘๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ์ž…๋‹ˆ๋‹ค. for ๋Œ€์ฒด๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ, ๊ธฐ๋ณธ ์ฝ”๋“œ ๊ฒฝ๋กœ ๋ฐ ๊ฐ€๋…์„ฑ์—์„œ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. || ๋Œ€์ฒด๋Š” ์„ ์–ธ์˜ ์ž์„ธํ•œ ์ •๋„์—์„œ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ Futures ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. try!() ๋Š” ์˜ˆ์ƒ๋˜๋Š” ํ‘œํ˜„ ์ˆœ์„œ์™€ ์กฐํ•ฉ ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

async ๋Š” ํ•จ์ˆ˜์˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ผ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ aync-blocks ๋ฐ async || ์ถ”๊ฐ€ ํŒจํ„ด์„ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ์ƒ๊ฐ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋‹ค๋ฅธ ์–ธ์–ด ํ•ญ๋ชฉ์— ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งคํฌ๋กœ์˜ ์œ ์šฉ์„ฑ์€ ์ฐจ์„ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๊ตฌํ˜„์„ ์ƒ๊ฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์‚ฌ์šฉ์ž๋Š” ์ฝ”๋“œ๋ฅผ ์™„์ „ํžˆ ์ถ”์ ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๊ณ  ์–ด๋””์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์‚ฌ๋ฌผ์„ ํ•ดํ‚นํ•˜๊ณ  ์‹œ์Šคํ…œ์„ ์†์ด๋„๋ก ์žฅ๋ คํ•ด์•ผํ•˜๋ฉฐ, ์•ˆ์ „ํ•œ Rust๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ „์ ์œผ๋กœ std api๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ” ๋ฃจํ‹ด์„ ๊ตฌํ˜„ํ•˜๋ฉด unsafe ์— ํฌ๊ฒŒ ์˜์กด ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์—์ด ์ฃผ์žฅ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ ํ–‰ํ•  ์ˆ˜ ๋ฐ ๋‹น์‹ ์ด-์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ๋งŒ๋“ค์–ด ๊นจ๋Š” ๊ฐ€์ •์˜ ์œ„ํ—˜์— ๋งŽ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค ํ•  ์ˆ˜์žˆ๋Š” ์–ธ์–ด์˜ ๊ตฌ๋ฌธ๊ณผ ์˜๋ฏธ ๋ก ์  ๋ฐฉ๋ฒ•์ด ๊ฒฝ์šฐ์—๋„ ์ค‘๋‹จ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋Œ€ ์ฃผ์žฅ์ด unsafe ์ฝ”๋“œ. ๋‚˜๋Š” Rust๊ฐ€ ์ฝ” ๋ฃจํ‹ด์˜ ๋‚ด๋ถ€๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ณง ์•ˆ์ •ํ™” ๋  ์˜๋„๊ฐ€์—†๋Š” ๋น„ํŠธ ๊ตฌํ˜„์— ๋Œ€ํ•œ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•œ ์œ ์‚ฌ์ ์€ extern "rust-call" ๋  ๊ฒƒ์ธ๋ฐ, ์ด๊ฒƒ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๊ทธ๋Ÿฌํ•œ ๋ณด์žฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆํ•˜๊ธฐ์œ„ํ•œ ํ˜„์žฌ์˜ ๋งˆ๋ฒ• ์—ญํ• ์„ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ํ˜• ์ฝ” ๋ฃจํ‹ด์˜ ์šด๋ช…์ด ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‹ค์ œ๋กœ return ๋ฅผ ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ ํ™”๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋” ๊นŠ์ด ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์ณ๋‘๊ณ  : ์ด๋ก  ์ƒ์œผ๋กœ๋Š” ์™„์ „ํžˆ ์ง„์ง€ํ•œ ์ƒ๊ฐ์ด ์•„๋‹Œ ์ฝ” ๋ฃจํ‹ด์ด ๊ฐ€์ƒ extern "await-call" fn () -> T ๋กœ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ „์ฃผ๊ณก์—์„œ

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

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

์ผ๋ช…. ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ฌธ์„œํ™” ํ•ญ๋ชฉ์˜ future.await() . ๋˜๋Š” ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž ๊ตฌ๋ฌธ๋„ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

์ด๋ฏธ try!() ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ์™œ ? ์†Œ๊ฐœ ํ–ˆ์Šต๋‹ˆ๊นŒ?

๊ณต์ •ํ•˜๊ฒŒ ๋งํ•˜๋ฉด, ๋‚˜์—๊ฒŒ๋„ ์„ฑ์žฅํ–ˆ์ง€๋งŒ ์ด์— ๋ฐ˜๋Œ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Try ์ด ์•ˆ์ •๋œ ๊ฒฝ์šฐ ๋” ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด์ง€๋งŒ ์ด๋Š” ๋˜ ๋‹ค๋ฅธ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์ด์ฃผ๋Š” "์„คํƒ•"์˜ ์˜ˆ์˜ ๋ฌธ์ œ๋Š” ๋งค์šฐ ์–‡์€ ์„คํƒ•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. impl MyStruct ๋„ impl <anonymous trait> for MyStruct ๋Œ€ํ•ด ์„คํƒ•์ด ๋” ๋งŽ๊ฑฐ๋‚˜ ์ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๊ฐ„์ ‘๋น„๋ฅผ ์ „ํ˜€ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์‚ถ์˜ ์งˆ ์„คํƒ•์ž…๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ƒ์„ฑ๊ธฐ์™€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์ „ํ˜€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์˜ค๋ฒ„ ํ—ค๋“œ์™€ ์ƒ๋‹นํ•œ ์ •์‹ ์  ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๊ธฐ๋Š” ํŠนํžˆ ์‚ฌ์šฉ์ž๋กœ์„œ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๊ณ  ์–ธ์–ด ์ž์ฒด์˜ ์ผ๋ถ€๋กœ ๋” ํšจ๊ณผ์ ์ด๊ณ  ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฐ˜๋ฉด ๋น„๋™๊ธฐ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ๋ธ”๋ก ๋˜๋Š” ํด๋กœ์ €์— ๋Œ€ํ•œ ์š”์ ์€ ํฅ๋ฏธ๋กญ๊ณ  ํ‚ค์›Œ๋“œ๊ฐ€ ๋” ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ์ธ์ •ํ•˜์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•˜์œ„ ์ˆ˜์ค€ ํ•ญ๋ชฉ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์— ์—ฌ์ „ํžˆ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” async ํ‚ค์›Œ๋“œ ์™€ #[async] ์†์„ฑ / ํ”„๋กœ ์‹œ์ € ๋งคํฌ๋กœ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „์ž๋Š” ์ƒ์„ฑ ๋œ (๋ง์žฅ๋‚œ ์˜๋„๊ฐ€์—†๋Š”) ์ƒ์„ฑ๊ธฐ์— ๋Œ€ํ•œ ์ €์ˆ˜์ค€ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ yield ๋Š” ํ‚ค์›Œ๋“œ๋กœ async ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋ก์ด๋‚˜ ํ•จ์ˆ˜์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์— ๊ด€ํ•ด์„œ๋Š” await , ์œ„์˜ ๋ชจ๋‘๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๋Š” ๋น„์Šทํ•œ ์ผ์„ํ•˜๊ณ , ํ‚ค์›Œ๋“œ ์ œํ•œ ํ•  ์ˆ˜ await ์— async ํ‚ค์›Œ๋“œ ๊ธฐ๋Šฅ / ๋ธ”๋ก์„, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ข…๋ฅ˜๋ฅผ ์‚ฌ์šฉ await!() #[async] ํ•จ์ˆ˜์˜ await!() ๋งคํฌ๋กœ.

์˜์‚ฌ ์ฝ”๋“œ :

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

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

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

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

    return Ok(item);
}

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

   let item = some_op() await?;

   return Ok(item);
}

๋‘ ์„ธ๊ณ„์˜ ์ตœ๊ณ .

์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ์‹œ ํ•  ๋ณต์žก์„ฑ์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ง„ํ–‰์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋ฉฐ ๋” ๋งŽ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋” ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ํŠนํžˆ await ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ์œ„ํ•œ ๊ฒƒ์ž„์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. async ํ•จ์ˆ˜์™€ ๋ธ”๋ก์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ๋Œ€ํ™”๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋‹จ, await! ๋Š” Rust์—์„œ ์“ธ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์“ธ ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ƒ๊ธฐ์‹œํ‚ค๊ธฐ์œ„ํ•œ ๋ชฉ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ํ‘œ๋ฉด ์–ธ์–ด.

๋ชจ๋“  ์ˆ˜์ • ํ›„ ๊ตฌ๋ฌธ ์ œ์•ˆ์˜ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ํŠน๋ณ„ํžˆ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•ฝ๊ฐ„์˜ ๋‹จ์ ์œผ๋กœ ๋ˆˆ์— ๋ˆ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์„ ํƒํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ฌด ๊ฒƒ๋„ ์—†๋‹ค๋ฉด, ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์€ post-fix์™€ ์ˆœ๋ฐฉํ–ฅ ํ˜ธํ™˜๋˜๋Š” ๊ตฌ๋ฌธ ์ ‘๋‘์‚ฌ ๊ตฌ๋ถ„ ๊ตฌ๋ฌธ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. Postfix๋Š” ์ผ๋ถ€ ํšŒ์›์—๊ฒŒ ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•œ ๊ฒƒ์œผ๋กœ ๊ณต๊ฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ํšŒ์›์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ๋จผ์ €์ด๋ฅผ ๊ฐ•๋ ฅํ•˜๊ฒŒ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์‹ค์šฉ์ ์ž…๋‹ˆ๋‹ค.

๋น„๊ต๋Š” syntax , example (@mehcode์˜ reqwest ๋Š”์ด ์ ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์‹ค์ œ ๋ฒค์น˜ ๋งˆํฌ์ฒ˜๋Ÿผ concerns , ์„ ํƒ์  resolution , ์˜ˆ๋ฅผ ๋“ค์–ด ๊ต์œก์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ ํ•œ ๊ฒฝ์šฐ). ๊ตฌ๋ฌธ ๋ฐ / ๋˜๋Š” ์šฐ๋ ค ์‚ฌํ•ญ์„ ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ๋ฉด์ด ๊ณต๋™ ๊ฒŒ์‹œ๋ฌผ์— ํŽธ์ง‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ๋ฐ”์™€ ๊ฐ™์ด, await ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๊ตฌ๋ฌธ์€ ์‹ ๊ทœ ์ด๋ฏผ์ž์™€ ์ˆ™๋ จ ๋œ ์‚ฌ์šฉ์ž ๋ชจ๋‘์—๊ฒŒ ๋‚ฏ์„ค๊ฒŒ ๋Š๊ปด์ง€์ง€๋งŒ ํ˜„์žฌ ๋‚˜์—ด๋œ ๋ชจ๋“  ๊ตฌ๋ฌธ์—๋Š”์ด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ ์šฉ์œผ๋กœ ๋งŒ ํ•œ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.์ด ๋ถ€๋ถ„์€ ์ž์ „๊ฑฐ๋ฅผ ํƒ€์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

let sent = (await client.get("https://my_api").send())?;
let res: MyResponse = (await sent.json())?;
  • ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ foo() await?

    • ์˜ˆ : client.get("https://my_api").send() await?.json() await?

    • | ์šฐ๋ ค | ํ•ด์ƒ๋„ |

      |-|-|

      | ? ์—†์ด ์—ฐ๊ฒฐํ•˜๋ฉด ํ˜ผ๋ž€ ์Šค๋Ÿฝ๊ฑฐ๋‚˜ ํ—ˆ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |

  • ์ ‘๋ฏธ์‚ฌ ํ•„๋“œ foo().await?

    • ์˜ˆ : client.get("https://my_api").send().await?.json().await?

    • | ์šฐ๋ ค | ํ•ด์ƒ๋„ |

      |-|-|

      | ํ•„๋“œ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค | |

  • ํ›„์œ„ ๋ฐฉ๋ฒ• foo().await()?

    • ์˜ˆ : client.get("https://my_api").send().await()?.json().await()?

    • | ์šฐ๋ ค | ํ•ด์ƒ๋„ |

      |-|-|

      | ๋ฐฉ๋ฒ•์ด๋‚˜ ํŠน์„ฑ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค | ops:: ํŠน์„ฑ์œผ๋กœ ๋ฌธ์„œํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? |

      | ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์•„๋‹˜ | |

  • Postfix ํ†ตํ™” foo()(await)?

    • ์˜ˆ : client.get("https://my_api").send()(await)?.json()(await)?

    • | ์šฐ๋ ค | ํ•ด์ƒ๋„ |

      |-|-|

      | ์‹ค์ œ ์ธ์ˆ˜์™€ ํ˜ผ๋™ ๋  ์ˆ˜ ์žˆ์Œ | ํ‚ค์›Œ๋“œ + ํ•˜์ด๋ผ์ดํŠธ + ๊ฒน์น˜์ง€ ์•Š์Œ |

  • ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ foo().await!()?

    • ์˜ˆ : client.get("https://my_api").send().await!()?.json().await!()?

    • | ์šฐ๋ ค | ํ•ด์ƒ๋„ |

      |-|-|

      | ์‹ค์ œ๋กœ ๋งคํฌ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹คโ€ฆ | |

      | โ€ฆ ๋˜๋Š” await ๋” ์ด์ƒ ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹˜ | |

์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ฉ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๊ด€์ ์—์„œ ์ ‘๋‘์‚ฌ ๋Œ€ ์ ‘๋‘์‚ฌ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ƒ๊ฐ : ๊ฐ’ ๊ณ ๋ ค, yield ๋ฐ await ๋Š” ๋‘ ๊ฐ€์ง€ ์ƒ๋ฐ˜๋˜๋Š” ๋ฌธ ์œ ํ˜•์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ „์ž๋Š” ๊ธฐ๋Šฅ์—์„œ ์™ธ๋ถ€๋กœ ๊ฐ’์„์ฃผ๊ณ  ํ›„์ž๋Š” ๊ฐ’์„๋ฐ›์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  : Python์—๋Š” yield ๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜์žˆ๋Š” ๋Œ€ํ™” ํ˜• ์ƒ์„ฑ๊ธฐ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์นญ ์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ƒ์„ฑ๊ธฐ ๋˜๋Š” ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์—๋Š” ๊ฐ•๋ ฅํ•œ ์œ ํ˜• ์„ค์ •์—์„œ ์ถ”๊ฐ€ ์ธ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์ด ์ผ๋ฐ˜ํ™”ํ•˜๋ ค๊ณ ํ•˜์ง€ ๋ง์ž. ๊ทธ๋Ÿฌ๋ฉด ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์ธ์ˆ˜๊ฐ€ ์ด์ „ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๋Ÿฌํ•œ ์ง„์ˆ ์ด ๋‹ฎ์•„ ๋ณด์ด๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ผ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ํ• ๋‹น ํ‘œํ˜„์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ๋‹ค๋ฅธ ์–ธ์–ด์— ์˜ํ•ด ์„ค์ •๋œ ๊ทœ๋ฒ”์ด Rust์— ๋Œ€ํ•ด ๋œ ์ผ๊ด€์„ฑ ์žˆ๊ณ  ๋œ ๊ฐ„๊ฒฐ ํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์„ค์ • ํ•œ ๊ทœ๋ฒ”์—์„œ ๋ฒ—์–ด๋‚˜์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ‘œํ˜„ํ–ˆ๋“ฏ์ด await ๋ฅผ ํฌํ•จํ•˜๊ณ  ๋™์ผํ•œ ์ธ์ˆ˜ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„ ๋‹ค๋ฅธ ํ‘œํ˜„๊ณผ์˜ ์œ ์‚ฌ์„ฑ์ด ์กด์žฌํ•˜๋Š” ํ•œ ๋‹ค๋ฅธ ๋ชจ๋ธ์—์„œ ์ „ํ™˜ํ•˜๋Š” ๋ฐ ํฐ ๋ฐฉํ•ด๊ฐ€๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

์•”๋ฌต์  ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—.

๋‹ค๋ฅธ ์–ธ์–ด๋กœ async / await๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์—ฌ๊ธฐ์—์„œ ์˜ต์…˜์„ ์‚ดํŽด๋ณธ ๊ฒฐ๊ณผ, ํ“จ์ฒ˜ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ตฌ๋ฌธ ์ ์œผ๋กœ ์ฆ๊ฒ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒด์ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ณ€ํ˜•์ด ํ…Œ์ด๋ธ”์— ์žˆ์Šต๋‹ˆ๊นŒ?

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

๋‚˜๋Š” ์ด๊ฒƒ์ด ํŒจํ„ด์˜ ์ผ๋ถ€๋ผ๋Š” ์ฃผ์žฅ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ธ๋”ฉ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฌธ์ œ๋Š” ์˜ค๋ฅ˜ ์Šคํ† ๋ฆฌ๊ฐ€ ์ข‹์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ธฐ๋‹ค๋ฆด ์ˆ˜์žˆ๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์„ ๋ฌผ์€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ? ์™€ ๊ฒฐํ•ฉ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ์„คํƒ•์ด ์ •๋ง๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ :

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

await ๋ฐ await? ๋‘˜ ๋‹ค ํ‚ค์›Œ๋“œ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜์ด๋ฅผ let ๋กœ ํ™•์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : let? result = 1.divide(0);

๋Ÿฌ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์ฒด์ธ์ด ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š”์ง€๋ฅผ ๊ณ ๋ คํ•  ๋•Œ, ์ €๋Š” ์ฒด์ธ ๋œ awaits๊ฐ€ ๋…์ž์—๊ฒŒ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…ํ™• ํ•ด์ง€๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๋ฐ ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. await์˜ ์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜•์˜ ๊ฒฝ์šฐ :

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

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ Rust ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ปจํ…์ŠคํŠธ์—์„œ await() ๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€๋งŒ ํ‘œํ˜„์‹ ์ปจํ…์ŠคํŠธ์—์„œ ๋งˆ๋ฒ• ๊ฐ™์€ (๋น„ ํ•จ์ˆ˜์™€ ๊ฐ™์€) ๋™์ž‘์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๋ฒ„์ „์€ ์ด๊ฒƒ์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ "์—ฌ๊ธฐ์— ๋งˆ๋ฒ•์ด์žˆ๋‹ค"๋Š” ์˜๋ฏธ์˜ ๋…น์œผ๋กœ ๋œ ๋Š๋‚Œํ‘œ์— ์ต์ˆ™ํ•˜๋ฉฐ,์ด ๋ฒ„์ „์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

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

์ฆ‰, ์ด๋ฏธ try!(expr) ์–ธ์–ด๋กœ๋˜์–ด ์žˆ๊ณ  ? ์˜ ์„ ๊ตฌ์ž๋ผ๋Š” ์ ์„ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ await!(expr) ๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด try!(expr) ๋ฐ ? ๊ฐ€ ์–ธ์–ด์— ๋„์ž… ๋œ ๋ฐฉ์‹๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

await!(expr) ๋ฒ„์ „์˜ await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚˜์ค‘์— ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ? ์Šคํƒ€์ผ ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ? ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ await์— ๋Œ€ํ•œ ์˜ˆ :

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

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

await!(expr) ๋˜๋Š” await!{expr} ๋Š” ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ด๊ณ  ์‹ค์šฉ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜์ค‘์— ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ๋ฌธ์ œ๊ฐ€๋˜๋ฉด ๋‚˜์ค‘์— await์˜ ์ ‘๋ฏธ์‚ฌ ๋ฒ„์ „ (์˜ˆ : .await! ๋˜๋Š” .await!() )์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ๊ณ„ํš์„ ์„ธ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋˜๋Š” ๊ฒฐ๊ตญ ์ถ”๊ฐ€ ? ์Šคํƒ€์ผ ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค ... ์ฃผ์ œ์— ๋Œ€ํ•ด ๋งŽ์€ ์ž์ „๊ฑฐ๋ฅผ ํ˜๋ฆฐ ํ›„ : P)

์ฐธ๊ณ ๋กœ Scala์˜ ๊ตฌ๋ฌธ์€ ์ฐจ๋‹จ ํ˜ธ์ถœ์ด๋ฏ€๋กœ Await.result ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค . Scala์˜ Future๋Š” ๋ชจ๋‚˜๋“œ์ด๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋˜๋Š” for ๋ชจ๋‚˜๋“œ ์ดํ•ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๋”์ฐํ•œ ํ‘œ๊ธฐ๋ฒ•์˜ ๊ฒฐ๊ณผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์„ ํ˜ธํ•˜๋Š” ๊ตฌ๋ฌธ์œผ๋กœ scala-async ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

์ด๊ฒƒ์€ ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Rust ์ฝ”๋“œ๊ฐ€ ์›ํ•˜๋Š” ๋ชจ์Šต์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๋ฏ€๋กœ await!() ์˜ ํ˜„์žฌ ๊ตฌ๋ฌธ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๋™์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ Rust๋Š” ์‹ฌ๋ณผ์ด ๋ฌด๊ฑฐ์›  ๊ณ , ์ •๋‹นํ•œ ์ด์œ ๋กœ ๋ฉ€์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž (๋˜๋Š” ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ)์˜ ํ˜•ํƒœ๋กœ ๊ตฌ๋ฌธ ์„คํƒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉฐ await!(future) ์˜ ๋ช…ํ™•์„ฑ์€ ๋ชจํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด try! ์ง„ํ–‰ ํ•œ ๊ณผ์ •์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋งคํฌ๋กœ๋กœ ์œ ์ง€ํ•˜๋Š” ์ด์ ์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์•„๋‹ˆ๋ผ ์–ธ์–ด ๊ธฐ๋Šฅ์ด๋ผ๋Š” ๊ฒƒ์ด ํ•œ๋ˆˆ์— ๋” ๋ถ„๋ช…ํ•˜๊ฒŒ ๋“œ๋Ÿฌ๋‚œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ! ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ํŽธ์ง‘๊ธฐ / ๋ทฐ์–ด์˜ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ํ˜ธ์ถœ์„ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ด๋ฉฐ ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ๋” ์•ฝํ•œ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด 2 ์„ผํŠธ (์ •๊ธฐ ๊ธฐ๋ถ€์ž๊ฐ€ ์•„๋‹˜, fwiw) ์ €๋Š” try! ๋ชจ๋ธ์„ ๋ณต์‚ฌํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ๋งŽ์€ ๋ถ€๋ถ„์„

๊ทธ๋ž˜์„œ ๋‚ด ํˆฌํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค : await!(...) ์•ˆ์ •ํ™”ํ•˜๊ณ  Rust ๊ฐœ๋ฐœ์ž์˜ ์—ฌ๋ก  ์กฐ์‚ฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ‹์ง„ ์ฒด์ธ์„ ์œ„ํ•ด ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Await๋Š” ํ‚ค์›Œ๋“œ์ด์ง€๋งŒ ! ๋Š” ๊ทธ๊ฒƒ์ด ๋‚˜์—๊ฒŒ "๋งˆ๋ฒ•"์ด๋ผ๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ ๊ด„ํ˜ธ๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋น„๊ต :

| ์ ‘๋ฏธ์‚ฌ | ํ‘œํ˜„ |
| --- | --- |
| .await | client.get("https://my_api").send().await?.json().await? |
| .await! | client.get("https://my_api").send().await!?.json().await!? |
| .await() | client.get("https://my_api").send().await()?.json().await()? |
| ^ | client.get("https://my_api").send()^?.json()^? |
| # | client.get("https://my_api").send()#?.json()#? |
| @ | client.get("https://my_api").send()@?.json()@? |
| $ | client.get("https://my_api").send()$?.json()$? |

๋‚ด ์„ธ ๋ฒˆ์งธ ์„ผํŠธ๋Š” ๋‚ด๊ฐ€ @ ( "await")์™€ # (๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ / ๋™์‹œ์„ฑ์„ ๋‚˜ํƒ€๋ƒ„)๋ฅผ ์ข‹์•„ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” @ ์ ‘๋ฏธ์‚ฌ๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค! ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฐ์ •์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‹ค์ œ๋กœ ๋‚˜์œ ์„ ํƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • _ @ for await_๋Š” ๋ฉ‹์ง€๊ณ  ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ๋‹ˆ๋ชจ๋‹‰์ž…๋‹ˆ๋‹ค.
  • ? ๋ฐ @ ์€ (๋Š”) ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฏ€๋กœ @ ์„ (๋ฅผ) ๋ฐฐ์šฐ๊ณ  ? @ ์„ (๋ฅผ) ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๋„์•ฝํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  • ํ‘œํ˜„์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋‹ซ๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์•ž์œผ๋กœ ์Šค์บ” ํ•  ํ•„์š”์—†์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ผ๋ จ์˜ ํ‘œํ˜„์‹์„ ์Šค์บ”ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” await? foo ๊ตฌ๋ฌธ์„ ๋งค์šฐ ์„ ํ˜ธํ•˜๋ฉฐ ์ˆ˜ํ•™์—์„œ ๋ณผ ์ˆ˜์žˆ๋Š” ๊ตฌ๋ฌธ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. sinยฒ x๋Š” (sin x) ยฒ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์กฐ๊ธˆ ์–ด์ƒ‰ํ•ด ๋ณด์ด์ง€๋งŒ ์ต์ˆ™ํ•ด์ง€๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ๋งํ–ˆ๋“ฏ์ด ์ง€๊ธˆ์€ try!() ์ฒ˜๋Ÿผ ๋งคํฌ๋กœ๋กœ await!() ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฒฐ๊ตญ์—๋Š” ์ ‘๋ฏธ์‚ฌ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. await!() ํ˜ธ์ถœ์„ postfix๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜๋Š” rustfix์— ๋Œ€ํ•œ ์ง€์›์„ ์—ผ๋‘์—๋‘๋ฉด ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์€ ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

postfix ํ‚ค์›Œ๋“œ ์˜ต์…˜์€ ์ €์—๊ฒŒ ๋ถ„๋ช…ํ•œ ์Šน์ž์ž…๋‹ˆ๋‹ค.

  • ์šฐ์„  ์ˆœ์œ„ / ์ˆœ์„œ ๋ฌธ์ œ๋Š” ์—†์ง€๋งŒ ๊ด„ํ˜ธ๋กœ ์ˆœ์„œ๋ฅผ ๋ช…์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€๋ถ€๋ถ„์€ ๊ณผ๋„ํ•œ ์ค‘์ฒฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( 'try ()!'๋Œ€์‹  ์ ‘๋ฏธ์‚ฌ '?'๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์œ ์‚ฌํ•œ ์ธ์ˆ˜).

  • ๋‹ค์ค‘ ๋ผ์ธ ์ฒด์ธ์œผ๋กœ๋ณด๊ธฐ ์ข‹์œผ๋ฉฐ (@earthengine์˜ ์ด์ „ ์ฃผ์„ ์ฐธ์กฐ) ์ฃผ๋ฌธ์ด๋‚˜ ๋Œ€๊ธฐ์ค‘์ธ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํ˜ผ๋™์ด ์—†์Šต๋‹ˆ๋‹ค. await๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉํ•˜๋Š” ํ‘œํ˜„์‹์—๋Š” ์ค‘์ฒฉ / ์ถ”๊ฐ€ ๊ด„ํ˜ธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

let x = x.do_something() await
         .do_another_thing() await;
let x = x.foo(|| ...)
         .bar(|| ...)
         .baz() await;
  • ๊ฐ„๋‹จํ•œ await! () ๋งคํฌ๋กœ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค (@novacrazy์˜ ์ด์ „ ์ฃผ์„ ์ฐธ์กฐ).
macro_rules! await {
    ($e:expr) => {{$e await}}
}
  • ํ•œ ์ค„, ๋„ค์ด ํ‚ค๋“œ ( '?'์—†์ด), postfix await ํ‚ค์›Œ๋“œ ์ฒด์ธ์€ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ๊ณ  ํ›„์† ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๊ฐ’์˜ ๋ฐ˜ํ™˜์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋ฅผ ๊ดด๋กญํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ค„์˜ rustfmt'ed ์ฝ”๋“œ ์„ ํ˜ธ). ๊ณต๊ฐ„์€ ์„ ์„ ๋‚˜๋ˆ„๊ณ  ๋Œ€๊ธฐ์ค‘์ธ ์‹œ๊ฐ์  ํ‘œ์‹œ๊ธฐ / ํ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
client.get("https://my_api").send() await.unwrap().json() await.unwrap()

์•„์ง ๋ณด์ง€ ๋ชปํ•œ ๋‹ค๋ฅธ ํ›„๋ณด๋ฅผ ์ œ์•ˆํ•˜๊ธฐ ์œ„ํ•ด (์•„๋งˆ๋„ ํŒŒ์‹ฑ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ์žฌ๋ฏธ์žˆ๋Š” ์ด์ค‘ ์  '..'์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ธฐ์‹œ์ผœ์ค๋‹ˆ๋‹ค (๊ฒฐ๊ณผ!) ...

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

๋‚˜๋Š” @ ์ ‘๋ฏธ์‚ฌ๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค! ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฐ์ •์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‹ค์ œ๋กœ ๋‚˜์œ ์„ ํƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • _ @ for await_๋Š” ๋ฉ‹์ง€๊ณ  ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด ๋‹ˆ๋ชจ๋‹‰์ž…๋‹ˆ๋‹ค.
  • ? ๋ฐ @ ์€ (๋Š”) ๋งค์šฐ ์œ ์‚ฌํ•˜๋ฏ€๋กœ @ ์„ (๋ฅผ) ๋ฐฐ์šฐ๊ณ  ? @ ์„ (๋ฅผ) ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ๋„์•ฝํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  • ํ‘œํ˜„์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋‹ซ๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์•ž์œผ๋กœ ์Šค์บ” ํ•  ํ•„์š”์—†์ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ผ๋ จ์˜ ํ‘œํ˜„์‹์„ ์Šค์บ”ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ธฐ๋‹ค๋ฆด ๋•Œ @๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ์—„์ง€ ์†๊ฐ€๋ฝ์œผ๋กœ alt-gr์„ ๋ˆ„๋ฅธ ๋‹ค์Œ ์ˆซ์ž ํ–‰์—์„œ ํ‚ค 2๋ฅผ ๋ˆŒ๋Ÿฌ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— fin / swe ๋ ˆ์ด์•„์›ƒ ํ‚ค๋ณด๋“œ์— ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ @๋Š” (at) ์ž˜ ์ •๋ฆฝ ๋œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ์–ด์„œ ์™œ ๊ทธ ์˜๋ฏธ๋ฅผ ํ˜ผ๋™ํ•ด์•ผํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ๋‹จ์ˆœํžˆ await ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ํ‚ค๋ณด๋“œ ๊ณก์˜ˆ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ์ž์‹ ์˜ ๋งค์šฐ ์ฃผ๊ด€์ ์ธ ํ‰๊ฐ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ future@await ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

| ๊ตฌ๋ฌธ | ๋…ธํŠธ |
| --- | --- |
| await { f } | ๊ฐ•ํ•œ:

  • ๋งค์šฐ ๊ฐ„๋‹จ
  • ์œ ์‚ฌ์  for , loop , async ๋“ฑ
์•ฝํ•œ:
  • ๋งค์šฐ ์žฅํ™ฉํ•จ (5 ๊ฐœ์˜ ๋ฌธ์ž, 2 ๊ฐœ์˜ ์ค‘๊ด„ํ˜ธ, 3 ๊ฐœ์˜ ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ๋ณดํ’€์ด์žˆ๋Š” ๊ณต๋ฐฑ)
  • ์—ฐ๊ฒฐ ๊ฒฐ๊ณผ ๋งŽ์€ ์ค‘์ฒฉ ์ค‘๊ด„ํ˜ธ ( await { await { foo() }?.bar() }? )
|
| await f | ๊ฐ•ํ•œ:
  • Python, JS, C # ๋ฐ Dart์˜ await ๊ตฌ๋ฌธ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ„๋‹จํ•˜๊ณ  ์งง์Œ
  • ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„์™€ ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„๋Š” ๋ชจ๋‘ ? ( await fut? ๋Œ€ await? fut )์™€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์•ฝํ•œ:
  • ๋ชจํ˜ธํ•จ : ์œ ์šฉํ•จ vs. ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ฐฐ์›Œ์•ผ ํ•จ
  • ์ฒด์ด๋‹ ๋˜ํ•œ ๋งค์šฐ ๋ฒˆ๊ฑฐ ๋กญ์Šต๋‹ˆ๋‹ค ( await (await foo()?).bar()? ๋Œ€ await? (await? foo()).bar() )
|
| fut.await
fut.await()
fut.await!() | ๊ฐ•ํ•œ:
  • ๋งค์šฐ ์‰ฌ์šด ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ์งง์€
  • ๋ฉ‹์ง„ ์ฝ”๋“œ ์™„์„ฑ
์•ฝํ•œ:
  • ์‚ฌ์šฉ์ž๋ฅผ ์†์—ฌ ์–ด๋”˜๊ฐ€์— ์ •์˜ ๋œ ํ•„๋“œ / ๊ธฐ๋Šฅ / ๋งคํฌ๋กœ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํŽธ์ง‘ : ๋‚˜๋Š” await!() ๊ฐ€ ๊ฐ€์žฅ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋Š๊ปด ์ง€์ง€ ์•Š๋Š”๋‹ค๋Š”
|
| fut(await) | ๊ฐ•ํ•œ:
  • ๋งค์šฐ ์‰ฌ์šด ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ์งง์€
์•ฝํ•œ:
  • ์‚ฌ์šฉ์ž๊ฐ€ await ๋ณ€์ˆ˜๊ฐ€ ์–ด๋”˜๊ฐ€์— ์ •์˜๋˜์–ด ์žˆ๊ณ  Future๊ฐ€ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋„๋ก ์†์ž…๋‹ˆ๋‹ค.
|
| f await | ๊ฐ•ํ•œ:
  • ๋งค์šฐ ์‰ฌ์šด ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ์งง์€
์•ฝํ•œ:
  • Rust์˜ ๊ตฌ๋ฌธ์—์„œ ์•„๋ฌด๊ฒƒ๋„ ์œ ์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‚ด ๋‘๋‡Œ๋Š” client.get("https://my_api").send() await.unwrap().json() await.unwrap() ๋ฅผ client.get("https://my_api").send() , await.unwrap().json() ๋ฐ await.unwrap() ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค (๋จผ์ € ๋ณ„๋กœ ๊ทธ๋ฃนํ™” ํ•œ ๋‹ค์Œ . ) ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  • Haskellers : ์นด๋ ˆ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
|
| f@ | ๊ฐ•ํ•œ:
  • ๋งค์šฐ ์‰ฌ์šด ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ๋งค์šฐ ์งง์€
์•ฝํ•œ:
  • ์•ฝ๊ฐ„ ์–ด์ƒ‰ํ•ด ๋ณด์ธ๋‹ค (์ ์–ด๋„ ์ฒ˜์Œ์—๋Š”)
  • @ ์†Œ๋น„ํ•˜๋ฉฐ ๋‹ค๋ฅธ ๊ฒƒ์— ๋” ์ ํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠนํžˆ ํฐ ํ‘œํ˜„์—์„œ ๊ฐ„๊ณผํ•˜๊ธฐ ์‰ฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ๋ชจ๋“  ์–ธ์–ด์™€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ @ ์‚ฌ์šฉ
|
| f@await | ๊ฐ•ํ•œ:
  • ๋งค์šฐ ์‰ฌ์šด ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ์งง์€
  • ๋ฉ‹์ง„ ์ฝ”๋“œ ์™„์„ฑ
  • await ์€ ํ‚ค์›Œ๋“œ๊ฐ€ ๋  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • forwards-compatible : @operator ํ˜•์‹์œผ๋กœ ์ƒˆ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ? ๋Š” @try ๋กœ ์ˆ˜ํ–‰ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด ๋‘๋‡Œ๋Š” client.get("https://my_api").send()@await.unwrap().json()@await.unwrap() ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๊ทธ๋ฃน์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค (๋จผ์ € . ๋ณ„๋กœ ๊ทธ๋ฃนํ™” ํ•œ ๋‹ค์Œ @ )
์•ฝํ•œ:
  • ๋‹ค๋ฅธ ๋ชจ๋“  ์–ธ์–ด์™€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ @ ์‚ฌ์šฉ
  • ๋ถˆํ•„์š”ํ•œ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
|

๋‚ด ์ ์ˆ˜ :

  • ์ต์ˆ™ ํ•จ (fam) :์ด ๊ตฌ๋ฌธ์ด ์•Œ๋ ค์ง„ ๊ตฌ๋ฌธ (Rust ๋ฐ Python, JS, C #๊ณผ ๊ฐ™์€ ๊ธฐํƒ€)์— ์–ผ๋งˆ๋‚˜ ๊ฐ€๊นŒ์šด ์ง€
  • ๋ช…๋ฐฑ ํ•จ (obv) : ์ฒ˜์Œ์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ์—์„œ ์ด๊ฒƒ์„ ์ฝ์—ˆ๋‹ค๋ฉด ์˜๋ฏธ, ์šฐ์„  ์ˆœ์œ„ ๋“ฑ์„ ์ถ”์ธก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  • ์ƒ์„ธ๋„ (vrb) : ์“ฐ๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ๋ฌธ์ž ์ˆ˜
  • ๊ฐ€์‹œ์„ฑ (vis) : ์ฝ”๋“œ์—์„œ ๋ฐœ๊ฒฌํ•˜๊ธฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด๊ฐ€ (vs. ๊ฐ„๊ณผํ•˜๊ธฐ)
  • chaining (cha) : . ๋ฐ ๊ธฐํƒ€ await ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด๊ฐ€
  • ๊ทธ๋ฃนํ™” (grp) : ๋‚ด ๋‘๋‡Œ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฉ์–ด๋ฆฌ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š”์ง€ ์—ฌ๋ถ€
  • forwards-compatibility (fwd) : ๋‚˜์ค‘์— ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€

| ๊ตฌ๋ฌธ | fam | obv | vrb | ๋งˆ์ฃผ | ์ฐจ | grp | fwd |
| --------------------- | ----- | ----- | ----- | ----- | --- -| ----- | ----- |
| await!(fut) | ++ | + | -| ++ | -| 0 | ++ |
| await { fut } | ++ | ++ | -| ++ | -| 0 | + |
| await fut | ++ | -| + | ++ | -| 0 | -|
| fut.await | 0 | -| + | ++ | ++ | + | -|
| fut.await() | 0 | -| -| ++ | ++ | + | -|
| fut.await!() | 0 | 0 | -| ++ | ++ | + | -|
| fut(await) | -| -| 0 | ++ | ++ | + | -|
| fut await | -| -| + | ++ | ++ | -| -|
| fut@ | -| -| ++ | -| ++ | ++ | -|
| fut@await | -| 0 | + | ++ | ++ | ++ | 0 |

์ฒซ ๋ฒˆ์งธ ์ปท์—์„œ try!() ๊ตฌ๋ฌธ์„ ๋ฏธ๋Ÿฌ๋งํ•˜๊ณ  ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•˜๊ธฐ ์ „์— await!(expr) ์‚ฌ์šฉ์„ ์‹ค์ œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ๋Œ€์ฒด ๊ตฌ๋ฌธ์„ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ..

๋‚˜๋Š” @ ๊ฐ€๋ณด๊ธฐ ํ‰ํ•ด ๋ณด์ธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ , "async"์˜ "at"๋Š” ๋‚˜์—๊ฒŒ ๊ทธ๋‹ค์ง€ ์ง๊ด€์  ์ธ ๋Š๋‚Œ์ด ๋“ค์ง€ ์•Š์œผ๋ฉฐ, ๊ธฐํ˜ธ๋Š” ์ด๋ฏธ ํŒจํ„ด ๋งค์นญ์— ์‚ฌ์šฉ๋œ๋‹ค.

๊ด„ํ˜ธ๊ฐ€์—†๋Š” async ์ ‘๋‘์‚ฌ๋Š” ? (์ž์ฃผ ์‚ฌ์šฉ๋จ)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ์šฐ์„  ์ˆœ์œ„ ๋˜๋Š” ์ฃผ๋ณ€ ๊ด„ํ˜ธ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ .await!() ์ฒด์ธ์€ ๋ฉ‹์ง€๊ฒŒ, ๊ทธ ์˜๋ฏธ๊ฐ€ ๋งค์šฐ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋Š๊ปด์ง€๋ฉฐ, ๋งˆ๋ฒ•์„ ํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๋Š” ! ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ตฌ๋ฌธ ์ ์œผ๋กœ ๋œ ์ƒˆ๋กญ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ด๊ฒƒ์„ ์„ ํ˜ธ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ฒซ ๋ฒˆ์งธ ์ปท await! (expr) ๋ณด๋‹ค ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์–ผ๋งˆ๋‚˜ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ์•„์ง ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—๋Š” ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
let result = await task;
๊ฒฐ๊ณผ ์œ ํ˜•์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์ž์—ฐ ์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— await๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ž‘์—…์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ฝ์„ ๋•Œ ์ •์‹ ์ ์œผ๋กœ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.
let result = somehowkindoflongtask await;
์ž‘์—…์˜ ๋์— ๋„๋‹ฌํ•˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜ํ™˜๋˜๋Š” ์œ ํ˜•์„ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. Intellij๋กœ์„œ์˜ IDE๋Š” ์ด๋ฆ„๊ณผ ๊ฐ™์Œ ์‚ฌ์ด์— ์œ ํ˜• (๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ฐœ์ธํ™”์—†์ด)์„ ์ธ๋ผ์ธํ•œ๋‹ค๋Š” ์ ์„ ์—ผ๋‘์— ๋‘์‹ญ์‹œ์˜ค (์ด๋Š” ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์–ธ์–ด์˜ ๋ฏธ๋ž˜์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์ง€๋Š” ์•Š์Œ).
๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.
6voler6ykj

๊ทธ๋ ‡๋‹ค๊ณ  ๋‚ด ์˜๊ฒฌ์ด ์ ‘๋‘์‚ฌ์— ๋Œ€ํ•ด 100 %๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋  ๋•Œ ๋ฏธ๋ž˜์˜ ์ ‘๋ฏธ์‚ฌ ๋ฒ„์ „์„ ๋งค์šฐ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ๋งฅ์ด ์—†์–ด๋„ ๋‹ค์Œ ์ค‘ ์–ด๋–ค ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
future await?
future? await
๋Œ€์‹  ์ดˆ๋ณด์ž์˜ ๊ด€์ ์—์„œ์ด ๋‘ ๊ฐ€์ง€ ์ค‘ ์–ด๋Š ๊ฒƒ์ด ์‚ฌ์‹ค์ธ์ง€ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.
await future? === await (future?)
await future? === (await future)?

๋‚˜๋Š” ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ await future ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ / ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์ด์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์ด๋ฏ€๋กœ ๊ทธ์ค‘ ํ•˜๋‚˜๋ฅผ ์•„๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ฆ‰์‹œ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

await future? ์˜ ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•ด ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋Š” Result<Future> ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜.
  • Result : Future<Result> ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋Š” ๋ฏธ๋ž˜.

๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ๋Š” I / O ์ž‘์—…์ด ์‹คํŒจ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ฒ˜๋ฆฌ ํ•  ๋•Œ ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ:

await future? <=> (await future)?

๋œ ์ผ๋ฐ˜์ ์ธ ์ฒซ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” await (future?) ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ฌ์ง€์–ด์œ„ํ•œ ์ข‹์€ ์‚ฌ์šฉ ๋  ์ˆ˜ try! :์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋งคํฌ๋กœ await try!(future) . ์ด๋ ‡๊ฒŒํ•˜๋ฉด await ์™€ ๋ฌผ์Œํ‘œ ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฏธ๋ž˜์˜ ๋‹ค๋ฅธ ์ธก๋ฉด์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

await ๋ฅผ ์ฒซ ๋ฒˆ์งธ async ํ•จ์ˆ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

let output = future
    .run(await);

์—ฌ๊ธฐ์„œ future.run(await) ๋Š” await future ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฏธ๋ž˜๋ฅผ ์ทจํ•˜๊ณ  ๋‹จ์ˆœํžˆ await!() ๋งคํฌ๋กœ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ผ๋ฐ˜ async ํ•จ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

C ++ (๋™์‹œ์„ฑ TR)

auto result = co_await task;

์ด๊ฒƒ์€ ๋™์‹œ์„ฑ์ด ์•„๋‹Œ ์ฝ” ๋ฃจํ‹ด TS์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ต์…˜์€ await ๋Œ€์‹  become ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

let output = future.start(become);

become ๋Š” ๋ณด์žฅ ๋œ TCO์˜ ํ‚ค์›Œ๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[๊ฐœ์š”]์— ๋Œ€ํ•ด @EyeOfPython ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง€๊ธˆ ๋ง‰ ์ž์ „๊ฑฐ ์ฐฝ๊ณ ์— ํ•ฉ๋ฅ˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ f await ์—์„œ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋งค์šฐ ์†Œ๋ฐ•ํ•œ ๊ตฌ๋ฌธ์ด ํ˜„๋ช…ํ•˜๊ณ  ์ข€ ํŠน๋ณ„ํ•˜๊ณ  ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Rust๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ์‚ฌ์šฉ์ž๋“ค์ด ๋งŽ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๋Š” ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ, Rust ๋ฒ ํ…Œ๋ž‘๋“ค์—๊ฒŒ๋„ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@novacrazy ์ด ์ธ์ˆ˜์˜ ๋ฌธ์ œ๋Š” await! ๋งคํฌ๋กœ _would_๋Š” ๋งˆ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ Nemo157 await! ๋งคํฌ๋กœ๊ฐ€ ๋งˆ๋ฒ•์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. std ์ด๋ฏธ compile_error! ์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋งคํฌ๋กœ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ด์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ดํ•˜๋Š” ์ผ์ด ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์ดํ•˜๋Š” ์ผ๋งŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ •์ƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํ›„์œ„ ๊ฐ€์žฅ ์ธ์ฒด ๊ณตํ•™์  ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ด์ „ ๋ง๊ธ€์— ๋™์˜ํ•˜์ง€๋งŒ, ์ฐจ๋ผ๋ฆฌ ์ ‘๋‘์‚ฌ ๋งคํฌ๋กœ๋กœ ์‹œ์ž‘ ๊ฒƒ await!(expr) ๊ทธ ์ผ์ด๋˜๋ฉด ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ์ž ์žฌ์  ๋ฐ ์ „ํ™˜๋ณด๋‹ค๋Š”์ด expr.await (๋งค์ง ์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด์žฅ ํ•„๋“œ) ๋˜๋Š” expr.await() (๋งค์ง ์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด์žฅ ๋ฉ”์„œ๋“œ). ๋‘˜ ๋‹ค ์ˆœ์ˆ˜ํ•˜๊ฒŒ์ด ๊ธฐ๋Šฅ์„์œ„ํ•œ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ๊ณผ ์–ธ์–ด๊ฐ€ ์ผ๊ด€์„ฑ์ด ์—†๋‹ค๊ณ  ๋Š๋ผ๊ฒŒํ•˜๋Š” IMO๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

@EyeOfPython ๋ชฉ๋ก๊ณผ ํ…Œ์ด๋ธ”์— future(await) ์„ (๋ฅผ) ์ถ”๊ฐ€ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? future.await() ์— ๋Œ€ํ•œ ํ‰๊ฐ€์˜ ๋ชจ๋“  ๊ธ์ •์  ์ธ ์ ์ด ์•ฝ์ ์—†์ด ์ด์ „๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€๋Š” ๊ตฌ๋ฌธ ๊ฐ•์กฐ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  foo.await ๊ฐ€ ํ•„๋“œ ์•ก์„ธ์Šค์™€ ๋„ˆ๋ฌด ๋น„์Šทํ•ด ๋ณด์ธ๋‹ค๊ณ  ์ฃผ์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— . ํ† ํฐ์„ # ํ•˜๊ณ  ๋Œ€์‹  foo#await ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . ์˜ˆ๋ฅผ ๋“ค๋ฉด :

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

GitHub๊ฐ€ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด await ๋ฅผ match ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ๋ช…ํ™•ํ•˜๊ณ  ์ธ์ฒด ๊ณตํ•™์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ† ํฐ๋ณด๋‹ค # ์˜ ์ด๋ก ์  ๊ทผ๊ฑฐ๋Š” ๊ตฌ์ฒด์ ์ด์ง€ ์•Š์ง€๋งŒ ํ† ํฐ์€ ๋ˆˆ์— ์ž˜ ๋„์–ด ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ๋˜ ๋‹ค๋ฅธ ๊ฐœ๋… : ๋งŒ์•ฝ ๋ฏธ๋ž˜๊ฐ€ ์ฐธ์กฐ๋ผ๋ฉด :

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

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

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

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

let output = *future;

์ด๊ฒƒ์€ ์ •๋ง ์ถ”ํ•˜๊ณ  ์ผ๊ด€์„ฑ์ด ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ทธ ๊ตฌ๋ฌธ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด๋ณด์ž :

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

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

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

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

let output = $future;

๋” ์ข‹์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ชป ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค (๊ทธ๋Ÿฌ๋‚˜ ๋” ๋‚˜๋น ์ง€๋ฉด github์˜ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€๋ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž ๋ฅผ

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

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

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

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

let output = $future;

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! await ( $ )๋ฟ๋งŒ ์•„๋‹ˆ๋ผ deref ( * ) ๋ฐ ๋ถ€์ • ( ! )๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์˜ ๋ช‡ ๊ฐ€์ง€์ฃผ์˜ ์‚ฌํ•ญ :

  1. ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„ : ๋‚˜์—๊ฒŒ๋Š” ๋ถ„๋ช…ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋ถ„๋ช…ํ•ฉ๋‹ˆ๊นŒ?
  2. ๋งคํฌ๋กœ interop : $ ๊ธฐํ˜ธ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ๊นŒ์š”?
  3. ์‹ ๋ถˆ์ผ์น˜ : ์„ ํ–‰ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๋Š” ์ „์ฒด ์‹์— ์ ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด ์ง€์—ฐ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๋Š” . ๊ตฌ๋ถ„ ๋œ ์‹์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค ( await_chain fn์€์ด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค). ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๊นŒ?
  4. ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ๊ตฌํ˜„ : ํ•ด๋‹น ๊ตฌ๋ฌธ์ด ์ „ํ˜€ ์œ ํšจํ•ฉ๋‹ˆ๊นŒ?

์„ผํŠธ๋ฆด
IMO #๊ฐ€ ์›์‹œ ๋ฆฌํ„ฐ๋Ÿด ๊ตฌ๋ฌธ r#"A String with "quotes""# ๋„ˆ๋ฌด ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

IMO #๊ฐ€ ์›์‹œ ๋ฆฌํ„ฐ๋Ÿด ๊ตฌ๋ฌธ r#"A String with "quotes""# ๋„ˆ๋ฌด ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ์ง€ ๋ฌธ๋งฅ ์ƒ ์•„์ฃผ ๋ถ„๋ช…ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์„ผํŠธ๋ฆด
ํ•˜์ง€๋งŒ ๊ตฌ๋ฌธ์€ Rust๊ฐ€ IMHO๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šคํƒ€์ผ๊ณผ๋Š” ์ „ํ˜€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ๊ธฐ์กด ๊ตฌ๋ฌธ๊ณผ ์œ ์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Laaas ์†Œ๊ฐœ๋˜์—ˆ์„ ๋•Œ ? ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” .await ์™€ ํ•จ๊ป˜ ๊ธฐ๊บผ์ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค; ๋‚˜๋Š” (์ฒด์ธ ๊ฐ€๋Šฅ, ์ข‹์€ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ถฉ๋ถ„ํžˆ ์‰ฝ๊ฒŒ ์ž…๋ ฅ, ์ฆ‰, ๋ถ„๋ช… ์ธ์ฒด ๊ณตํ•™์ ์ž…๋‹ˆ๋‹ค) ์ž‘ํ’ˆ ๊ฒƒ์„ ๋‹ค๋ฅธ ๋ญ”๊ฐ€๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๊ณ , ๊ทธ๋ž˜์„œํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋ถˆ๋งŒ ๋ณด์ธ๋‹ค foo#await ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋งŒ์กฑ์‹œํ‚ฌ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

? ์—๋Š” ๋‹ค๋ฅธ ์ข‹์€ ์ ์ด ๋งŽ์ด ์žˆ์ง€๋งŒ #await๋Š” ๋‹ค์†Œ ์ž„์˜์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  .await ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์›ํ•œ๋‹ค๋ฉด .await! ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@Centril ์ด๊ฒƒ์ด future(await) ์ด๋ฉด์˜ ์ฃผ๋œ ๊ทผ๊ฑฐ๋กœ, ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ž ๋‚˜ ์™ธ๋ถ€ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ ๋„ ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#await๋Š” ๋‹ค์†Œ ์ž„์˜์  ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

# ์€ ์ž„์˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ๋ฐœ๋ช… ๋  ๋•Œ ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ๊ฒƒ์ด ์ข‹๊ฒŒ ๋ณด์ด๊ฑฐ๋‚˜ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์€ ์ž„์˜์ ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์™œ .await! ?

๊ทธ๊ฒƒ์€ ๋˜‘๊ฐ™์ด ์ž„์˜์ ์ด์ง€๋งŒ ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Centril ์ด๊ฒƒ์ด future(await) ์ด๋ฉด์˜ ์ฃผ๋œ ๊ทผ๊ฑฐ ์˜€๋Š”๋ฐ, ์ถ”๊ฐ€ ์—ฐ์‚ฐ์ž ๋‚˜ ์™ธ๋ถ€ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ ํ•  ํ•„์š”์—†์ด ํ•„๋“œ ์•ก์„ธ์Šค๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€์‹  await ๋ฅผ future ์ „๋‹ฌํ•˜๋Š” ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. "ํ˜„์žฅ ์ ‘๊ทผ"๋ณด๋‹ค ๋” ํ˜ผ๋ž€ ์Šค๋Ÿฌ์›Œ์š”.

๋Œ€์‹  ๋‹น์‹ ์ด ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ ์žˆ๋Š” ํ•จ์ˆ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. "ํ˜„์žฅ ์ ‘๊ทผ"๋ณด๋‹ค ๋” ํ˜ผ๋ž€ ์Šค๋Ÿฌ์›Œ์š”.

๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ ๊ฐ„๊ฒฐํ•จ์˜ ์ผ๋ถ€์˜€์Šต๋‹ˆ๋‹ค. Await๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์ธก๋ฉด์— ์žˆ์œผ๋ฉฐ (callee๋Š” ์‚ฌ์šฉ์ž์™€ ๊ฒฐ๊ณผ ์‚ฌ์ด์—์„œ ์‹คํ–‰ ๋จ) ํ•ด๋‹น ํ•จ์ˆ˜์— ํ‚ค์›Œ๋“œ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ํ˜ธ์ถœ์ž„์„ ๋ถ„๋ช…ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‚ค์›Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ธ์ˆ˜์™€ ์œ ์‚ฌํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ด…๋‹ˆ๋‹ค. (๋งˆ์ด๋„ˆ์Šค ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ ๋ฐ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ•ํ™”ํ•˜๋ ค๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€. Futures๋Š” ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ ์™ธ์— ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.)

์„ผํŠธ๋ฆด

์ž„์˜์  ์ธ ๊ฒƒ์€ ์ œ์™ธ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๊ธฐ์กด ๊ตฌ๋ฌธ ์œ ์‚ฌ์„ฑ์„ ๊ฐ–๋Š” ์–‘์˜ ๋ฌผ๊ฑด์ด๋‹ค. .await! ์€ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž„์˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ await ๋ผ๋Š” ํ›„์œ„ ๋งคํฌ๋กœ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ await ์— ๋Œ€ํ•œ ์ƒˆ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์š”์ ์„ ๋ช…ํ™•ํžˆ / ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ๊ตฌ๋ฌธ๊ณผ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋งŽ์€ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ทธ์ค‘ ์ผ๋ถ€๋Š” Rust 1.0 ์ดํ›„์— ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ (์˜ˆ : union ) AFAIK๋Š” ๋‹จ์ผ ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค (๊ณต๋ฐฑ, ์  ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๊ตฌ๋ถ„ ๋˜๋”๋ผ๋„ ์ƒ๊ด€ ์—†์Œ) . ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ๊ฐ€์žˆ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

IMHO๋Š” Rust์˜ ์ด์ƒ ํ•จ์„ ํฌ๊ฒŒ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š๋Š” ์œ ์ผํ•œ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์€ postfix ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ๋ฏธ๋Ÿฌ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ง€๋งŒ ์ด์ „์— Rust ๋งคํฌ๋กœ๋ฅผ ๋ณธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ๋งคํฌ๋กœ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์‹๋ณ„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ํ‘œ์ค€ await!() ๋งคํฌ๋กœ๋ฅผ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” awaited ๊ฐ™์ด ๊ณต์กดํ•˜๊ธฐ ์œ„ํ•ด ํ•„๋“œ์™€ ๊ฐ™์€ ์•ก์„ธ์Šค (๋˜๋Š” ๋‹ค๋ฅธ ์ ‘๋ฏธ์‚ฌ)๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

  • Await๋Š” ๋‹น์‹ ์ด ๋‹ค์Œ / ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆผ, ์ด์ „ / ์™ผ์ชฝ์— ์˜จ ๊ฒƒ.
  • ๋ฐ˜๋ณต๊ธฐ์˜ cloned() ๋ฉ”์„œ๋“œ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  @? ๋„ ? ๊ฐ™์€ ์„คํƒ•์œผ๋กœ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๊ฐœ์ธ์ ์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” &? ์กฐํ•ฉ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. @ ๋Š” ๋„ˆ๋ฌด ๊ธธ๊ณ  ์„ ์„ ๋„ˆ๋ฌด ์‚ฐ๋งŒํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. & ๋„ ํ‚ค๊ฐ€ ํฌ์ง€ ๋งŒ (์ข‹์Œ) ๋ฏธ๋‹ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋˜ํ•œ ์ข‹์Šต๋‹ˆ๋‹ค). ์•ˆํƒ€๊น๊ฒŒ๋„ & ์—๋Š” ์ด๋ฏธ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ ํ•ญ์ƒ ? ๋’ค์— ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ :

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

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

๋‚˜์—๊ฒŒ @ ๋Š” ๋ถ€ํ’€์–ด ์˜ค๋ฅธ ์บ๋ฆญํ„ฐ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ณ  ์ฝ๊ธฐ ํ๋ฆ„์ด ์‚ฐ๋งŒ ํ•ด์ง‘๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— &? ๋Š” ๊ธฐ๋ถ„์ด ์ข‹๊ณ  (๋‚ด) ๋…์„œ๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์œผ๋ฉฐ & ์™€ ? ์‚ฌ์ด์— ๋ฉ‹์ง„ ๊ณต๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ„๋‹จํ•œ await! ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. post-fix ๋งคํฌ๋กœ๊ฐ€ ์–ธ์–ด์— ๋“ค์–ด๊ฐ€๋ฉด ๋งคํฌ๋กœ๋Š” ๋‹จ์ˆœํžˆ ํ™•์žฅ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Laaas ๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋งŒํผ Rust์—๋Š” ์•„์ง postfix ๋งคํฌ๋กœ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ foo.await!.bar ๋ฐ foo.await!().bar ๋Š” ๋™์ผํ•œ ํ‘œ๋ฉด ๊ตฌ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ ์‹ค์ œ ์ ‘๋ฏธ์‚ฌ ๋ฐ ๋‚ด์žฅ ๋งคํฌ๋กœ๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (ํ‚ค์›Œ๋“œ๋กœ await ๋ฅผ ํฌ๊ธฐํ•ด์•ผ ํ•จ).

@jplatte

๋งŽ์€ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ทธ์ค‘ ์ผ๋ถ€๋Š” Rust 1.0 ์ดํ›„์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : union ).

union ์€ ๋‹จํ•ญ ํ‘œํ˜„์‹ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ์ด ๋น„๊ต์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. Rust์—๋Š” ์ •ํ™•ํžˆ 3 ๊ฐœ์˜ ์•ˆ์ •๋œ ๋‹จํ•ญ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž ( return , break , continue )๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ชจ๋‘ ! ๋ฉ๋‹ˆ๋‹ค.

ํ  ... @ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „ ์ œ์•ˆ ์ด ์•ฝ๊ฐ„ ๋” ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

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

let output = @future;

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

@Centril ๊ทธ๊ฒƒ์ด ์ œ ์š”์ ์ž…๋‹ˆ๋‹ค. ์•„์ง ์ˆ˜์ • ํ›„ ๋งคํฌ๋กœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— await!() ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋Š” .await!() FYI๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. await ๊ฐ€ ํ‚ค์›Œ๋“œ๊ฐ€ ๋  ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ์˜ˆ์•ฝ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

union ์€ ๋‹จํ•ญ ํ‘œํ˜„์‹ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ์ด ๋น„๊ต์—์„œ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. Rust์—๋Š” ์ •ํ™•ํžˆ 3 ๊ฐœ์˜ ์•ˆ์ •๋œ ๋‹จํ•ญ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž ( return , break , continue )๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ชจ๋‘ ! ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ”„๋ฆฌํ”ฝ์Šค-ํ‚ค์›Œ๋“œ ๋ณ€ํ˜•์ด ๋‹ค๋ฅด๊ฒŒ ์ž…๋ ฅํ•˜๋”๋ผ๋„ ๋‹จํ•ญ ํ‘œํ˜„์‹ ์—ฐ์‚ฐ์ž ๊ทธ๋ฃน์— ์ ํ•ฉ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. postfix-keyword ๋ณ€ํ˜•์€ ๊ธฐ์กด ๊ตฌ๋ฌธ์—์„œ ํ›จ์”ฌ ๋” ํฐ ์ฐจ์ด์ด๋ฉฐ, ์ œ ์ƒ๊ฐ์—๋Š” ์–ธ์–ด์—์„œ await ์˜ ์ค‘์š”์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋„ˆ๋ฌด ํฝ๋‹ˆ๋‹ค.

์ ‘๋‘์‚ฌ ๋งคํฌ๋กœ ๋ฐ ์‚ฌํ›„ ์ˆ˜์ •์œผ๋กœ ์ „ํ™˜ ๊ฐ€๋Šฅ์„ฑ : await ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ํ‚ค์›Œ๋“œ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งคํฌ๋กœ๋Š” ์ถ”๊ฐ€ r# ์—†์ด ํ‚ค์›Œ๋“œ๋ฅผ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ํŠน๋ณ„ํ•œ lang ํ•ญ๋ชฉ์ด๋˜๊ณ  r#await!() ๋Š” ๋™์ผํ•œ ๋งคํฌ๋กœ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ํ˜ธ์ถœํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ์‹ค์šฉ์ ์ธ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ฆ‰, await ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ์œ ์ง€ํ•˜๊ณ  await! ๋ฅผ lang-item ๋งคํฌ๋กœ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

@HeroicKatora ์ž‘๋™ํ•˜๋ ค๋ฉด ํ‚ค์›Œ๋“œ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@Laaas ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ „ํ™˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋‘๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ํ‚ค์›Œ๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ–ฅํ›„ ์ˆ˜์ • ํ›„ ๊ตฌ๋ฌธ์„ ์œ„ํ•ด ์—ด๋ ค ์žˆ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „ํ™˜์„ ์œ„ํ•ด ์—๋””์…˜ ์ค‘๋‹จ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ํ‚ค์›Œ๋“œ ์˜ˆ์•ฝ์„ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์„ผํŠธ๋ฆด

๋˜ํ•œ foo.await! .bar ๋ฐ foo.await! (). bar๋Š” ๋™์ผํ•œ ํ‘œ๋ฉด ๊ตฌ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ ์‹ค์ œ ์ ‘๋ฏธ์‚ฌ ๋ฐ ๋‚ด์žฅ ๋งคํฌ๋กœ (ํ‚ค์›Œ๋“œ๋กœ await๋ฅผ ํฌ๊ธฐํ•ด์•ผ ํ•จ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

! ์™€ ๊ฒฐํ•ฉ ๋œ ํ‚ค์›Œ๋“œ await ๋ฅผ ๋‚ด๋ถ€ ๋งคํฌ๋กœ (์ •์ƒ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ •์˜ ํ•  ์ˆ˜ ์—†์Œ)๋กœ ํ™•์ธํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ‚ค์›Œ๋“œ๋กœ ๋‚จ์•„ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์˜ ๋งคํฌ๋กœ๋กœ ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

@HeroicKatora x.await!() await ์ด ์˜ˆ์•ฝ ํ‚ค์›Œ๋“œ ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์‚ฌํ›„ ์ˆ˜์ •์„ ๋ฏธํ•ด๊ฒฐ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ์ดํ›„ ๋…ผ์˜์—์„œ ๋„๋‹ฌ ํ•  ์†”๋ฃจ์…˜์ด ๋  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ตœ์„ ์˜ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ํ•ฉ์˜ ๋œ ์œ ์ผํ•œ ๊ฒƒ์ด๋ผ๋ฉด, ์šฐ๋ฆฌ๋Š” ์šฐ์„ ์ด ์ •ํ™•ํ•œ post-fix ๊ตฌ๋ฌธ์„ ์ฑ„ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋กœ์„œ ํ›จ์”ฌ ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ํฐ ์˜ˆ๋Š” try! ์ด๋ฉฐ ๊ฒฐ๊ตญ ์ž์ฒด ๊ธฐํ˜ธ ? . ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ›„์œ„ ์—ฐ์‚ฐ์ž๊ฐ€ ๋” ์ตœ์ ์˜ ๋งˆ์ง€๋ง‰ ์‹œ๊ฐ„์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์— ํŠน๋ณ„ํ•œ ๋ฌธ์ž๋ฅผ ์ค„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ ์–ด๋„ @ ์‹œ์ž‘ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ผ์„ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ํ›จ์”ฌ ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ์Šคํƒ€์ผ .await!() ์ง€์›ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์˜๋ฏธ์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ์ž์ฒด์ ์œผ๋กœ ๋„์ž…๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ await!(foo) ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ด๊ฒƒ์„ foo.await!() ๋˜๋Š” foo@ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ž์ฒด ๊ธฐํ˜ธ๋ฅผ ๋ณด์ฆ ํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด.
์ด ๋งคํฌ๋กœ์— ์•ฝ๊ฐ„์˜ ๋งˆ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์€ std์— ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ๋‚˜์—๊ฒŒ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
@jplatte๊ฐ€ ๋งํ–ˆ๋“ฏ์ด :

@ Nemo157 await! ๋งคํฌ๋กœ๊ฐ€ ๋งˆ์ˆ ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. std ์ด๋ฏธ ์—ฌ๋Ÿฌ ๋งคํฌ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด compile_error! ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ดํ•˜๋Š” ์ผ์ด ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์ดํ•˜๋Š” ์ผ๋งŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ •์ƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋…ผ์˜๋˜๋Š” ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ œ๋Š” ์—ฐ๊ฒฐ ๋ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์—ฐ๊ฒฐ ์‹์—์„œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฐ๊ฒฐ์— await๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  await for ๋งŒ ์‚ฌ์šฉํ•˜๋ ค๋ฉด
์šฐ๋ฆฌ๋Š” let์„ await๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
await foo = future

๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด await res = fut1 -> fut2 ๋˜๋Š” await res = fut1 >>= fut2 ์™€ ๊ฐ™์€ ์ผ์ข…์˜ ์ž‘์—…์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๋ฝ ๋œ ์œ ์ผํ•œ ๊ฒฝ์šฐ๋Š” ๋Œ€๊ธฐํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
await res = fut; res .
์ด๊ฒƒ์€ ํ‰๋ฒ”ํ•œ await fut ๋กœ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ œ์•ˆ์„ ๋ณธ ์ ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์ ์–ด๋„
์ฒด์ด๋‹), ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๋Œ€๋กœ ์—ฌ๊ธฐ์— ๋“œ๋กญํ•ฉ๋‹ˆ๋‹ค.

@HeroicKatora ๋ชฉ๋ก์— fut(await) ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚ด ์˜๊ฒฌ์— ๋”ฐ๋ผ ์ˆœ์œ„๋ฅผ ๋งค๊ฒผ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ๋‚ด ์ ์ˆ˜๊ฐ€ ๊บผ์ ธ ์žˆ๋‹ค๊ณ  ๋Š๋ผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

๊ตฌ๋ฌธ ์ธก๋ฉด์—์„œ .await!() ์€ ๊นจ๋—ํ•˜๊ณ  ๊ตฌ๋ฌธ์— ์ด์ƒํ•œ ์ ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ์„œ ์ฒด์ธ์„ ํ—ˆ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ "์‹ค์ œ"์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์–ป์œผ๋ฉด ์•ฝ๊ฐ„ ์ด์ƒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ .r#await!() ๋Š” ์„€๋„ ์ž‰ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ .await!() ๋Š” ์„€๋„ ์ž‰ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” await ๊ฐ€ ํ‘œํ˜„์‹์˜ ๋‹ค์Œ ๋ถ€๋ถ„์— ๊ฒฐํ•ฉ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— "postfix keyword"์˜ต์…˜ ( foo() await?.bar() await? ์™€ ๊ฐ™์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„)์— ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋Š” ๋ถ€๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ณต๋ฐฑ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ธฐํ˜ธ๋ฅผ ์„ ํ˜ธํ•˜๊ณ  ๊ธด ์ฒด์ธ์˜ ๋‹จ์ ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

ํ•„์ž๋Š” "๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„"( await? ์„คํƒ• ํฌํ•จ)๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ์ ‘๋‘์‚ฌ ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋Š” ๋‹จ์ผ ๋ฌธ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์— ๊ณ ํ†ต์Šค๋Ÿฝ๊ณ  "์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„"๋Š” ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ง๊ด€์ ์ด๊ณ  ๋”ฐ๋ผ์„œ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ์ธก๋ฉด์—์„œ .await!() ์€ ๊นจ๋—ํ•˜๊ณ  ๊ตฌ๋ฌธ์— ์ด์ƒํ•œ ์ ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์œผ๋ฉด ์„œ ์ฒด์ธ์„ ํ—ˆ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ "์‹ค์ œ"์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์–ป์œผ๋ฉด ์•ฝ๊ฐ„ ์ด์ƒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ .r#await!() ๋Š” ์„€๋„ ์ž‰ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ .await!() ๋Š” ์„€๋„ ์ž‰ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์–ป๊ณ  .await!() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด await ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ์˜ˆ์•ฝ ํ•ด์ œํ•˜๊ณ  ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋งคํฌ๋กœ์˜ ๊ตฌํ˜„์—๋Š” ์—ฌ์ „ํžˆ ์•ฝ๊ฐ„์˜ ๋งˆ๋ฒ•์ด ํ•„์š”ํ•˜์ง€๋งŒ ์˜ค๋Š˜๋‚ ์˜ compiler_error! ์™€ ๊ฐ™์€ ์‹ค์ œ ๋งคํฌ๋กœ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

@EyeOfPython forward-compatibility ์—์„œ ๊ณ ๋ คํ•˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? fut@await ์ด fut.await!() ๋ณด๋‹ค ๋†’๊ณ  await { future } ๊ฐ€ await!(future) ๋ณด๋‹ค ๋‚ฎ์€ ํ‰๊ฐ€๋ฅผ ๋ฐ›๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. verbosity ์—ด๋„ ์•ฝ๊ฐ„ ์ด์ƒํ•ด ๋ณด์ด๋ฉฐ, ์ผ๋ถ€ ํ‘œํ˜„์€ ์งง์ง€ ๋งŒ ๋“ฑ๊ธ‰์ด ๋‚ฎ๊ณ , ์—ฐ์‡„ ๋œ ๋ฌธ์žฅ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๊นŒ? ๊ธฐํƒ€ ๋ชจ๋“  ๊ฒƒ์€ ๊ท ํ˜• ์žกํžŒ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ๊ฐ€์žฅ ์ž˜ ์š”์•ฝ ๋œ ๊ด‘๋ฒ”์œ„ํ•œ ํ‰๊ฐ€์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ํ† ๋ก ์„ ์ฝ์€ ํ›„ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ผ๋ฐ˜์ ์ธ await!() ๋งคํฌ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‚˜์ค‘์— ์ ‘๋ฏธ์‚ฌ ๋ฒ„์ „์„ ํŒŒ์•…ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ postfix ๋ฒ„์ „์„ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ ,์ด ์ฃผ์„์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์‚ฌ์‹ค๋กœ ๊ฐ„์ฃผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ์—ฌ๊ธฐ์—์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์˜ ์˜๊ฒฌ์„ ์กฐ์‚ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์ง€๊ธˆ await!(future) ๊ตฌ๋ฌธ์— ๋™์˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์žฅ์ ์€ ํ•ด๋‹น ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ชจํ˜ธ์„ฑ์ด ์—†์œผ๋ฉฐ ๋งคํฌ๋กœ์ด๊ธฐ๋„ํ•˜๋ฏ€๋กœ์ด ๋ณ€๊ฒฝ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์–ธ์–ด ๊ตฌ๋ฌธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ ์€ ์ฒด์ด๋‹์ด๋ณด๊ธฐ ํ‰ํ•ด ๋ณด์ด์ง€๋งŒ์ด ๊ตฌ๋ฌธ์€ ์ž๋™์œผ๋กœ ํ›„์œ„ ๋ฒ„์ „์œผ๋กœ ์‰ฝ๊ฒŒ ๋Œ€์ฒด ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ผ๋‹จ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•˜๋ฉด, ์šฐ๋ฆฌ๋Š” ๋” ์„ฑ์ˆ™ํ•œ ๊ฒฝํ—˜, ์•„์ด๋””์–ด ๋ฐ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ ๊ธฐ๋Šฅ์œผ๋กœ postfix await ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ํ† ๋ก ์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@HeroicKatora await ๋ฅผ ์ผ๋ฐ˜ ์‹๋ณ„์ž๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ๋” ๋†’์€ ํ‰๊ฐ€๋ฅผ ๋ฐ›์•˜์ง€๋งŒ fut.await!() ๊ฐ€ await ์ด๋ฉด ๋” ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. fut.await!() ๊ฐ€ ๋” ๋†’์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ํ™•์‹คํžˆ ํƒ€๋‹น ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

await { future } ๋Œ€ await!(future) ๊ฒฝ์šฐ, ํ›„์ž๋Š” ์˜ต์…˜์„ ์—ด์–ด ๊ฑฐ์˜ ๋ชจ๋“  ๋‹ค๋ฅธ ์˜ต์…˜์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์€ ์‹ค์ œ๋กœ await future ๋ณ€ํ˜• ์ค‘ ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค ( @withoutboats '๋ธ”๋กœ๊ทธ ํ•ญ๋ชฉ์— fwd(await { future }) < fwd(await!(future)) ์ด์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ผ€์ด์Šค๋ฅผ ํ•˜์œ„ ๊ทธ๋ฃน์œผ๋กœ ๋ถ„ํ•  ํ•œ ํ›„ ๊ฐ€์žฅ ๊ฐ๊ด€์ ์ธ ํ•ญ๋ชฉ์ด์–ด์•ผํ•˜๋Š” ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ‰๊ฐ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๊ณ ๋ คํ•˜์—ฌ ํŽธ์ง‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

await!(future) ์•ˆ์ •ํ™”๋Š” ์ œ๊ฐ€ ์ƒ์ƒํ•  ์ˆ˜์žˆ๋Š” ์ตœ์•…์˜ ์˜ต์…˜์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ await ์˜ˆ์•ฝ์„ ํ•ด์ œํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ํ–ฅํ›„ ์–ธ์–ด ๋””์ž์ธ์ด ๋” ์–ด๋ ค์›Œ ์ง์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜๋„์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” try!(result) ์™€ ๋™์ผํ•œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (Rust 2018์—์„œ r#try!(result) ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•จ).

    • await!(future) ๊ฐ€ ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ์•ˆ๋‹ค๋ฉด ๊ฒฐ๊ตญ ํ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์ด๋Š” ์˜๋„์ ์œผ๋กœ ๊ธฐ์ˆ ์  ๋ถ€์ฑ„๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ๊ฒŒ๋‹ค๊ฐ€ try!(..) ๋Š” Rust์— ์ •์˜๋˜์–ด ์žˆ์ง€๋งŒ await!(future) ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์ด ๋  ์ˆ˜์—†๊ณ  ๋Œ€์‹ ์— ๊ทธ๋ ‡๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • try!(..) ์ค‘๋‹จ์€ ์‰ฝ์ง€ ์•Š์•˜๊ณ  ์‚ฌํšŒ์ ์œผ๋กœ ํฐ ํƒ€๊ฒฉ์„ ์ž…์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ๋ จ์„ ๋‹ค์‹œ ๊ฒช๋Š” ๊ฒƒ์€ ๋งค๋ ฅ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  3. ์ด๊ฒƒ์€ ์–ธ์–ด์˜ ์ค‘์‹ฌ์ ์ด๊ณ  ์ค‘์š”ํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์ผ๋ฅ˜๊ฐ€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  4. await!(future) ์€ ์‹œ๋„ ๋Ÿฝ์Šต๋‹ˆ๋‹ค . ๋‹ฌ๋ฆฌ await future ๋‹น์‹ ์€ ์“ธ ํ•„์š”๊ฐ€ !( ... ) .
  5. Rust API, ํŠนํžˆ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ์ค‘์‹ฌ์œผ๋กœํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Iterator ์ฒ˜๋ฆฌ ํ•  ๋•Œ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. await { future } ๋ฐ await future await { future } ์™€ ์œ ์‚ฌํ•˜๊ฒŒ await!(future) ๊ตฌ๋ฌธ์€ ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ  ์ž„์‹œ let ๋ฐ”์ธ๋”ฉ์„ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธ์ฒด ๊ณตํ•™๊ณผ ๊ฐ€๋…์„ฑ์—์žˆ์–ด์„œ ๋‚˜์˜๋‹ค.

@Centril ๋™์˜ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์—ด๋ฆฐ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 1. ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์‹ญ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ '๋งˆ๋ฒ•'์œผ๋กœ ๋งŒ๋“ ๋‹ค๋ฉด ์ด๊ฒƒ์„ ํ‚ค์›Œ๋“œ๋กœ ๋“œ๋กญํ•˜์ง€ ์•Š๊ณ  ๋งคํฌ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ—ˆ์šฉํ•จ์œผ๋กœ์จ ๋” ๋งˆ๋ฒ•์„ ๋งŒ๋“ค ์ˆ˜ ์—†์„๊นŒ์š”?

๋‚˜๋Š” 2. ์˜ ์‚ฌํšŒ์  ๊ด€์ ์„ ํ‰๊ฐ€ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋Šฆ๊ฒŒ Rust์— ๊ฐ€์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ํ˜ธ์†Œ ์†Œ๋ฆฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹คํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ณ€ํ™˜๋˜์ง€ ์•Š์€ ์ผ๋ถ€ ์ฝ”๋“œ๋กœ try! ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ณ  ๋ถ„๋ช…ํ•ด์•ผํ•œ๋‹ค. ์ฆ‰ ๊ฐ€์ง€๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์˜๋„ ์—ฌ๋ถ€์˜ ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค async/await ์ธ์„ผํ‹ฐ๋ธŒ ์—๋””์…˜์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์œผ๋กœ 2018 ๋˜๋Š” ์˜คํžˆ๋ ค ์ผ ํ™˜์ž์™€์ด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ํ•ฉ๋‹ˆ๋‹ค.

3. : vec![] ๋ฐ format! / println! ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ (imho) ์ค‘์‹ฌ ๊ธฐ๋Šฅ. ์ „์ž๋Š” ์•ˆ์ •์ ์ธ boxed ๊ตฌ์„ฑ afaik์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋งŽ์ด, ํ›„์ž๋Š” ํ˜•์‹ ๋ฌธ์ž์—ด ๊ตฌ์„ฑ์œผ๋กœ ์ธํ•ด ์ข…์†์ ์œผ๋กœ ํ˜•์‹ํ™” ๋œ ํ‘œํ˜„์‹์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ๋น„๊ต๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ 4. ๋ฅผ ๋‹ค๋ฅธ ๊ด€์ ์— ๋„ฃ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜์–ด์ฒ˜๋Ÿผ ์ฝํžˆ์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. IE, "await x"๋Š” ์˜์–ด์ฒ˜๋Ÿผ ์ฝ์Šต๋‹ˆ๋‹ค. "x # !! @! &"๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "x.await"๋Š” ์˜์–ด์ฒ˜๋Ÿผ ๊ฐ์งˆ ๋‚˜๊ฒŒ ์ฝ์ง€ ๋งŒ x๊ฐ€ ๊ธด ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋‚˜ ์ฒด์ธ ๋œ ๋ฐ˜๋ณต๊ธฐ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์ด ์‚ฌ์†Œํ•œ ์ค„์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด ํ‚ค์›Œ๋“œ๊ฐ€ await "ํ‚ค์›Œ๋“œ x"๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” C ++ ์ฝ” ๋ฃจํ‹ด TS์™€ ์œ ๋‹ˆํ‹ฐ์˜ C # ์ฝ” ๋ฃจํ‹ด์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ์™”๋Š”๋ฐ, ๋‘˜ ๋‹ค ์ด์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๋…„ ๋™์•ˆ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ์ˆ˜์ต๋ฅ  ํฌ์ธํŠธ๊ฐ€ ํ•œ ๋ˆˆ์— ์–ด๋””์— ์žˆ๋Š”์ง€ ํ•ฉ๋‹ˆ๋‹ค . ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ๋“ค์—ฌ ์“ฐ๊ธฐ ์ค„์„ ํ›‘์–ด ๋ณผ ๋•Œ์ธ์ง€ ๋ถ€ํ•˜์—†์ด ๋ช‡ ์ดˆ yield return ์— 200 ์ค„ ํ•จ์ˆ˜์—์„œ co_await / yield return ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

await๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋„ํŠธ ์—ฐ์‚ฐ์ž ๋‚˜ ๋‹ค๋ฅธ ์ ‘๋ฏธ์‚ฌ "๊ธฐํ˜ธ ๋”๋ฏธ"๊ตฌ๋ฌธ์˜ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” await ์ด ์ œ์–ด ํ๋ฆ„ ์ž‘์—…์˜ ๊ธฐ๋ณธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 'if , while , match , return ์™€ ๋™์ผํ•œ ์ˆ˜์ค€์˜ ์กด์ค‘์„ ๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ์ด ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ผ๋ฉด-Rust ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์•…๋ชฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. await์— ๋Œ€ํ•œ ์ œ ์ฃผ์žฅ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Rust ํ•จ์ˆ˜์˜ ๋“ค์—ฌ ์“ฐ๊ธฐ ์ค„์„ ํ›‘์–ด๋ณด๊ณ  ์ฆ‰์‹œ ๋ชจ๋“  ์ œ์–ด ํ๋ฆ„์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ์žˆ์ง€๋งŒ ์˜ˆ์™ธ์ด๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ๋…ธ๋ ฅํ•ด์•ผ ํ•  ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@ejmahler์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์˜ ๋‹ค๋ฅธ ์ธก๋ฉด ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์žŠ์ง€ ๋ง์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ํŒŒ์ผ์€ ํ›จ์”ฌ ๋” ์ž์ฃผ ์ฝํ˜€์ง€๊ณ  ์ž‘์„ฑ๋˜๋ฏ€๋กœ, ์ฝ๊ณ  ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•ญ๋ณต์ ์„ ์ฐพ๋Š” ๊ฒƒ์€ ์ฝ”๋“œ ๊ฒ€ํ† ์—์„œ ์ •๋ง ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ Useful precedence ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฏฟ๋Š”๋‹ค :

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

์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š”.

@Centril ๋™์˜ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์—ด๋ฆฐ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 1. ์— ๋Œ€ํ•ด ํ™•์‹ ํ•˜์‹ญ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ '๋งˆ๋ฒ•'์œผ๋กœ ๋งŒ๋“ ๋‹ค๋ฉด ์ด๊ฒƒ์„ ํ‚ค์›Œ๋“œ๋กœ ๋“œ๋กญํ•˜์ง€ ์•Š๊ณ  ๋งคํฌ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ—ˆ์šฉํ•จ์œผ๋กœ์จ ๋” ๋งˆ๋ฒ•์„ ๋งŒ๋“ค ์ˆ˜ ์—†์„๊นŒ์š”?

๊ธฐ์ˆ ์ ์œผ๋กœ? ํ˜น์‹œ. ๊ทธ๋Ÿฌ๋‚˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ฐ•๋ ฅํ•œ ์ •๋‹น์„ฑ์ด ์žˆ์–ด์•ผํ•˜๋ฉฐ์ด ๊ฒฝ์šฐ ๋งˆ๋ฒ•์— ๋งˆ๋ฒ•์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์€ ์ •๋‹นํ™”๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฆ‰ ๊ฐ€์ง€๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์˜๋„ ์—ฌ๋ถ€์˜ ๋ฌธ์ œ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค async/await ์ธ์„ผํ‹ฐ๋ธŒ ์—๋””์…˜์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์œผ๋กœ 2018 ๋˜๋Š” ์˜คํžˆ๋ ค ์ผ ํ™˜์ž์™€์ด๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์ธ async / await ๋ฐ try { .. } ๋ฅผ ์ธ์„ผํ‹ฐ๋ธŒ๋กœ ์˜๋„ํ–ˆ๋‹ค๊ณ  ๋งํ•œ ์ ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ์˜๋„์™€ ์ƒ๊ด€์—†์ด ๊ทธ๋“ค์€ ์ข‹์€ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ฒฐ๊ตญ ์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋‚˜์€ ๊ด€์šฉ์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

3. : vec![] ๋ฐ format! / println! ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ (imho) ์ค‘์‹ฌ ๊ธฐ๋Šฅ. ์ „์ž๋Š” ์•ˆ์ •๋œ ๋ฐ•์Šคํ˜• ๊ตฌ์กฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•„ํŒŒ ์ต,

์ „์ž๊ฐ€ ์กด์žฌํ•˜๋ฉฐ vec![1, 2, 3, ..] ๋กœ ์ž‘์„ฑ๋˜์–ด ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด ํ‘œํ˜„์‹์„ ๋ชจ๋ฐฉํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : [1, 2, 3, ..] .

ํ—‰ํ—‰

"x.await"๋Š” ์˜์–ด์ฒ˜๋Ÿผ ๊ฐ์งˆ ๋‚˜๊ฒŒ ์ฝ์ง€ ๋งŒ x๊ฐ€ ๊ธด ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋‚˜ ์ฒด์ธ ๋œ ๋ฐ˜๋ณต๊ธฐ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์ด ์‚ฌ์†Œํ•œ ์ค„์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฒด์ธ ๋œ ๋ฐ˜๋ณต๊ธฐ ๋ฉ”์†Œ๋“œ์˜ ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๊ด€์šฉ์  ์ธ Rust์ž…๋‹ˆ๋‹ค.
rustfmt ๋„๊ตฌ๋Š” ๋‹ค๋ฅธ ์ค„์— ๋ฉ”์„œ๋“œ ์ฒด์ธ์„ ํ˜•์‹ํ™”ํ•˜๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋‹ค์‹œ match ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ํ‘œ์‹œ ํ•จ).

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

.await ๋ฅผ "then await"๋กœ ์ฝ์œผ๋ฉด ์ ์–ด๋„ ๋‚˜์—๊ฒŒ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ฝํžŒ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๋…„ ๋™์•ˆ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ์ˆ˜์ต๋ฅ  ํฌ์ธํŠธ๊ฐ€ ํ•œ ๋ˆˆ์— ์–ด๋””์— ์žˆ๋Š”์ง€ ํ•ฉ๋‹ˆ๋‹ค .

๋‚˜๋Š” ํŠนํžˆ ์œ„์˜ rustfmt ํ˜•์‹์—์„œ ์ ‘๋ฏธ์‚ฌ await ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ทธ๊ฒƒ์„ ๋ถ€์ •ํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค๋ฉด.

์ธ์ง€ ๋ถ€ํ•˜์—†์ด ๋‹จ ๋ช‡ ์ดˆ ๋งŒ์— 200 ์ค„ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์ด ์•Œ์ง€ ๋ชปํ•˜๋ฉด 200 LOC๊ฐ€ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์œ„๋ฐ˜ํ•˜๊ณ  ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ ๋” ์ ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๊ทธ๊ฒƒ์ด ์œ ์ง€ ๋ณด์ˆ˜์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” await ์ด ์ œ์–ด ํ๋ฆ„ ์ž‘์—…์˜ ๊ธฐ๋ณธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

? ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ await ๋ฐ ? ๋Š” ๋ชจ๋‘ "์ปจํ…์ŠคํŠธ์—์„œ ๊ฐ’ ์ถ”์ถœ"์ด๋ผ๊ณ  ๋งํ•˜๋Š” ํšจ๊ณผ์ ์ธ ์ œ์–ด ํ๋ฆ„ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋กœ์ปฌ ์ปจํ…์ŠคํŠธ์—์„œ await : impl Future<Output = T> -> T ๋ฐ ? : impl Try<Ok = T> -> T ์œ ํ˜•์„ ๊ฐ–๋Š” ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์™ธ๊ฐ€ ์žˆ์ง€๋งŒ ์˜ˆ์™ธ์ด๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ๋…ธ๋ ฅํ•ด์•ผ ํ•  ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ๋Š” ? ?

์•ˆ๋…•ํ•˜์„ธ์š”.

@ejmahler์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์˜ ๋‹ค๋ฅธ ์ธก๋ฉด ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์žŠ์ง€ ๋ง์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ํŒŒ์ผ์€ ํ›จ์”ฌ ๋” ์ž์ฃผ ์ฝํ˜€์ง€๊ณ  ์ž‘์„ฑ๋˜๋ฏ€๋กœ, ์ฝ๊ณ  ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถˆ์ผ์น˜๋Š” ๊ฐ€๋…์„ฑ๊ณผ ์ธ์ฒด ๊ณตํ•™์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ฒƒ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ํ˜•์‹ํ™” ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. rustfmt ํ†ตํ•ด ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

@ejmahler @andreytkachenko ์—ฌ๊ธฐ์„œ @Centril์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์—์„œ ์–ป์„ ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ํฐ ๋ณ€ํ™” (์ผ๋ถ€๋Š” ๊ฐœ์„ ์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค)๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋ฌธ์žฅ์„ ๋ถ„ํ• ํ•˜๋„๋ก ์ธ์„ผํ‹ฐ๋ธŒ๋ฅผ await ๋Š” ์‹ค์ œ๋กœ ์–‘๋ณดํ•˜๋Š” ์ฝ”๋“œ ํฌ์ธํŠธ์— ๋ฐฐ์น˜๋˜์ง€ ์•Š๊ณ  ์˜คํžˆ๋ ค ๋ฐ˜๋Œ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์—์„œ yield-point๊ฐ€ ๋” ๋ชจํ˜ธํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด @Keruspe ์˜ ์•„์ด๋””์–ด๋ฅผ ์‹ค์ œ๋กœ ์ ์šฉํ•˜๋ ค๋Š” ์ •์‹ ์— ๋”ฐ๋ผ await ๋Œ€์‹  let ๋Œ€์‹  ์ฒ ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ ์ž๋ฅผ ์‹คํ—˜ ํ•ด ๋ด…์‹œ๋‹ค. ์ŠคํŠธ๋ ˆ์น˜์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ํ™•์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋ฌธ๋ฒ•์—์„œ ์ž‘๊ณก ๊ฐ€๋Šฅ์„ฑ ์†์‹ค๊ณผ ํ•ฉ๋ณ‘์ฆ์„ ์„ค๋ช…ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ด์ ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ  ... await์˜ ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ ํ˜•์‹์„ ๋ชจ๋‘ ๊ฐ–๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ ์ ‘๋ฏธ์‚ฌ ํ˜•ํƒœ?

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ๋•Œ ๊ด€์šฉ์ ์ž…๋‹ˆ๋‹ค.
๋ฐ˜๋ณต์ž ๋ฐ ํ›จ์”ฌ ์ ์€ ๋ฒ”์œ„์˜ ์˜ต์…˜์ด์ง€๋งŒ ๊ทธ ์™ธ์—๋Š” ๋…น์ด
๋ช…๋ นํ˜• ์–ธ์–ด๊ฐ€ ๋จผ์ €์ด๊ณ  ๊ธฐ๋Šฅ์  ์–ธ์–ด๊ฐ€ ๋‘ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋ง ๊ทธ๋Œ€๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
์ตœ์ƒ์œ„ ์ œ์–ด ํ๋ฆ„ ์ž‘์—…์„ ์ˆจ๊ธฐ๋Š”์ธ์ง€ ๋ถ€ํ•˜ ์ธ์ˆ˜,
'๋ฐ˜ํ™˜'๊ณผ ๋™์ผํ•œ ์ค‘์š”์„ฑ์„ ์ง€๋‹ˆ ๋ฉฐ
์ค„์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๊ฐ€๊น๊ฒŒ ๋‘๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๋ฉด
์ˆ˜๋…„๊ฐ„์˜ ์ƒ์‚ฐ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ์ด ์ฃผ์žฅ์„ํ•ฉ๋‹ˆ๋‹ค.

2019 ๋…„ 1 ์›” 19 ์ผ ํ† ์š”์ผ ์˜ค์ „ 11:59 Mazdak Farrokhzad [email protected]
์ผ๋‹ค :

@HeroicKatora https://github.com/HeroicKatora

@Centril https://github.com/Centril ๋™์˜ํ•˜๊ณ  ์‹ถ์ง€๋งŒ
๋ช‡ ๊ฐ€์ง€ ๊ณต๊ฐœ ์งˆ๋ฌธ. 1์— ๋Œ€ํ•ด ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ '๋งˆ๋ฒ•'์œผ๋กœ ๋งŒ๋“ ๋‹ค๋ฉด
์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด์—†์ด ๋งคํฌ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ํ—ˆ์šฉํ•จ์œผ๋กœ์จ ๋” ๋งˆ์ˆ ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ‚ค์›Œ๋“œ๋กœ ์‚ญ์ œ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ธฐ์ˆ ์ ์œผ๋กœ? ํ˜น์‹œ. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ •๋‹น์„ฑ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์™€์ด ๊ฒฝ์šฐ ๋งˆ๋ฒ•์— ๋งˆ๋ฒ•์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค
์ •๋‹นํ™”.

๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ async / await๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
2018 ๋…„ํŒ์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ฑฐ๋‚˜ ์ธ๋‚ด์‹ฌ์„ ๊ฐ€์ง€๋ ค๋Š” ์ธ์„ผํ‹ฐ๋ธŒ
์ด๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜์‹ญ์‹œ์˜ค.

์šฐ๋ฆฌ๊ฐ€ ์ƒˆ๋กœ์šด ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ์ธ async /๋ฅผ ์˜๋„ํ–ˆ๋‹ค๊ณ  ๋งํ–ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ธ์„ผํ‹ฐ๋ธŒ๋กœ {..} ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ์˜๋„์™€ ์ƒ๊ด€์—†์ด
๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๊ฒฐ๊ตญ
์ƒˆ๋กœ์šด ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ข‹๊ณ  ๊ด€์šฉ์ ์œผ๋กœ ์“ฐ๊ธฐ ์‹œ์ž‘
๋„์„œ๊ด€.

3๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ (imho) ์ค‘์‹ฌ ๊ธฐ๋Šฅ : vec! [] ๋ฐ format! /
println !. ๊ฐ‘์€ ์•ˆ์ •๋œ ๋ฐ•์Šค๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ
๊ฑด์„ค afaik,

์ „์ž๊ฐ€ ์กด์žฌํ•˜๊ณ  ๋ฐฐ์—ด์„ ๋ชจ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด vec! [1, 2, 3, ..]๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฆฌํ„ฐ๋Ÿด ํ‘œํ˜„์‹, ์˜ˆ : [1, 2, 3, ..].

@ejmahler https://github.com/ejmahler

"x.await"๋Š” ์˜์–ด์ฒ˜๋Ÿผ ๊ฐ์งˆ ๋‚˜๊ฒŒ ์ฝ์ง€ ๋งŒ x๊ฐ€ a ์ผ ๋•Œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ธด ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋˜๋Š” ๋ฌด๋ฆฌ์™€ ๊ฐ™์€ ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ์ค„
์ฒด์ธ ๋ฐ˜๋ณต๊ธฐ ๋ฉ”์„œ๋“œ ๋“ฑ

์ฒด์ธ ๋œ ๋ฐ˜๋ณต๊ธฐ ๋ฉ”์†Œ๋“œ์˜ ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ
๊ด€์šฉ์  ๋…น.
rustfmt ๋„๊ตฌ๋Š” ๋˜ํ•œ ๋‹ค๋ฅธ ์ค„์— ๋ฉ”์†Œ๋“œ ์ฒด์ธ์„ ํฌ๋งทํ•˜์—ฌ
get (๋‹ค์‹œ ์ผ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ) :

let foo = alpha (). match? // ๋˜๋Š” alpha() match? , alpha()#match? , alpha().match!()?
.๋ฒ ํƒ€
.some_other_stuff (). match?
.even_more_stuff (). match
.stuff_and_stuff ();

.await๋ฅผ "then await"๋กœ ์ฝ์œผ๋ฉด ์ ์–ด๋„ ๋‚˜์—๊ฒŒ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ์ฝํžŒ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ƒ์‚ฐ ์ฝ”๋“œ์— ๊ทธ๋“ค์„ ์‚ฌ์šฉ์˜ ๋…„ ํ›„์—, ๋‚˜์˜ ๋ฏฟ์Œ์€ ๊ทธ ์•Œ๊ณ ์žˆ๋‹คํ•œ๋ˆˆ์— ์ˆ˜์ต๋ฅ  ํฌ์ธํŠธ๊ฐ€์žˆ๋Š” ๊ณณ์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์ค‘์š” ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” postfix๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ทธ๊ฒƒ์„ ๋ถ€์ •ํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ rustfmt์—์„œ
์œ„์˜ ํ˜•์‹. ๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค๋ฉด.

์ธ์ง€ ๋ถ€ํ•˜์—†์ด ๋‹จ ๋ช‡ ์ดˆ ๋งŒ์— 200 ์ค„ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์ด ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
200 LOC๋Š” ์•„๋งˆ๋„ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์œ„๋ฐ˜ํ•˜๊ณ 
๋„ˆ๋ฌด ๋งŽ์€. ํ•ด๊ฒฐ์ฑ…์€ ๋” ์ ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋‚˜๋Š”
๊ทธ๊ฒƒ์ด ์œ ์ง€ ๋ณด์ˆ˜์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค.

๋‚˜๋Š” ๊ธฐ๋‹ค๋ฆผ์ด ์ œ์–ด ํ๋ฆ„ ์ž‘์—…์˜ ๊ธฐ๋ณธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ?. ์‚ฌ์‹ค, ๊ธฐ๋‹ค๋ฆฌ๊ณ ? ๋‘˜ ๋‹ค ํšจ๊ณผ์ ์ธ ์ œ์–ด ํ๋ฆ„ ์ž‘์—…์ž…๋‹ˆ๋‹ค.
"์ถ”์ถœ ๊ฐ€์น˜๋ฅผ ๋ฌธ๋งฅ์—์„œ"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ง€์—ญ์—์„œ
์ปจํ…์ŠคํŠธ์—์„œ await ์œ ํ˜•์„ ๊ฐ–๋Š” ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. impl
๋ฏธ๋ž˜-> T ๋ฐ? : impl ์‹œ๋„-> T.

์˜ˆ์™ธ๊ฐ€ ์žˆ์ง€๋งŒ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.
์„ ์œ„ํ•ด ๋…ธ๋ ฅ.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์˜ˆ์™ธ๋Š”? ?

@andreytkachenko https://github.com/andreytkachenko

@ejmahler https://github.com/ejmahler์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฐ ๊ทธ๋Ÿฌ์ง€ ๋ง์•˜์–ด์•ผ ํ–ˆ์–ด
๊ฐœ๋ฐœ์˜ ๋‹ค๋ฅธ ์ธก๋ฉด์„ ์žŠ์–ด ๋ฒ„๋ฆฌ์‹ญ์‹œ์˜ค-์ฝ”๋“œ ๊ฒ€ํ† . ์†Œ์Šค ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ํŒŒ์ผ์€
ํ›จ์”ฌ ๋” ์ž์ฃผ ์ฝํžˆ๊ณ  ์ผ์Šต๋‹ˆ๋‹ค.
์ฝ๊ณ  ์ดํ•ด ํ•œ ๋‹ค์Œ ์“ฐ๊ธฐ.

๋ถˆ์ผ์น˜๋Š” ๊ฐ€๋…์„ฑ๊ณผ
์ธ๊ฐ„ ๊ณตํ•™.

์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ํ˜•์‹ํ™” ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ด€์šฉ์  rustfmt ํ˜•์‹ํ™”
is :

let body : MyResponse = ํด๋ผ์ด์–ธํŠธ
.get ( "https : // my_api")
.๋ณด๋‚ด๋‹ค()
.์‹œํ•ฉ?
.into_json ()
.์‹œํ•ฉ?;

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/57640#issuecomment-455810497 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABGmeocFJpPKaypvQHo9LpAniGOUFrmzks5vE3kXgaJpZM4aBlba
.

@ejmahler ์šฐ๋ฆฌ๋Š” ๋‹ค์‹œ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "์ˆจ๊น€"; ๋™์ผํ•œ ์ฃผ์žฅ ์ด wrt ๋กœ ? ์—ฐ์‚ฐ์ž :

? ์—ฐ์‚ฐ์ž๋Š” ๋งค์šฐ ์งง์œผ๋ฉฐ ๊ณผ๊ฑฐ์— ์ˆ˜์ต์„ "์ˆจ๊ธฐ๊ธฐ"๋ผ๋Š” ๋น„ํŒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ฝ”๋“œ๋Š” ์ž‘์„ฑ๋˜์ง€ ์•Š๊ณ  ์ฝ์Šต๋‹ˆ๋‹ค. ?! ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ฉด ๋‘ ๋ฐฐ ๋” ๊ธธ์–ด ์ง€๋ฏ€๋กœ ๊ฐ„๊ณผํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ๊ถ๊ทน์ ์œผ๋กœ ? ์•ˆ์ •ํ™” ์‹œ์ผฐ๊ณ  ๊ทธ ์ดํ›„๋กœ ์˜ˆ์–ธ์ด ์‹คํ˜„๋˜์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‚˜์—๊ฒŒ await ์ ‘๋ฏธ์‚ฌ๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ์ฝ๊ธฐ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค (์ ์–ด๋„ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์“ฐ๋Š” ์–ธ์–ด ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ). ํŠนํžˆ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ๊ฐ•์กฐ๋Š” ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค. await ๊ด€๋ จ ํ•ญ๋ชฉ์€ ๋ฐ์€ ์ƒ‰์ƒ์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•œ ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ await ๋‹จ์–ด ๋Œ€์‹  ๊ธฐํ˜ธ๊ฐ€ ์žˆ๋”๋ผ๋„ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ์ฝ”๋“œ์—์„œ ์—ฌ์ „ํžˆ ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ await ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐํ˜ธ ๋Œ€์‹  await ๋‹จ์–ด ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋‹ค๋ฆฌ๊ณ ์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ฝ”๋“œ๋ฅผ grepํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. @ ๋˜๋Š” #๊ณผ ๊ฐ™์ด ๋ฌธ๋ฒ•์— ๋”ฐ๋ผ ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ด๊ฑด ๋กœ์ผ“ ๊ณผํ•™์ด ์•„๋‹ˆ์•ผ

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

postfix ... ๋Š” ๋งค์šฐ ์ฝ๊ธฐ ์‰ฝ๊ณ , ํ•œ ๋ˆˆ์— ๋†“์น˜๊ธฐ ์–ด๋ ต๊ณ , ๋งค์šฐ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ฝ”๋“œ๊ฐ€ ๋’ค ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝํžˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ด์ „์— ํƒ€์›์„ ๋ณธ ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„  ์ˆœ์œ„ / ๋งคํฌ๋กœ ํ—›์†Œ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‹ ํ˜ธ๋กœ ์ธํ•œ ์ถ”๊ฐ€ ๋ผ์ธ ๋…ธ์ด์ฆˆ๋„ ์—†์Šต๋‹ˆ๋‹ค.

(@solson์—๊ฒŒ ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค)

@ ben0x539 future()....start ๊ฐ™์€ ๊ฒฐ๊ณผ ๋ฉค๋ฒ„์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๊นŒ? ๋˜๋Š” range()..... ์™€ ๊ฐ™์€ ๋ฒ”์œ„ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์‹ญ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์ค„์ž„ํ‘œ .. ๋Š” ์˜ค๋ฅธ์ชฝ์— ์ดํ•ญ ์—ฐ์‚ฐ์ž ๋˜๋Š” ๊ด„ํ˜ธ๊ฐ€ ์žˆ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— no precedence/macro shenanigans necessary and ์ •ํ™•ํžˆ ์˜๋ฏธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์˜ˆ,? ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ
์˜ˆ์™ธ. ํ•˜์ง€๋งŒ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ œ์–ด ํ๋ฆ„์€
Rust ํ”„๋กœ๊ทธ๋žจ์€ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

2019 ๋…„ 1 ์›” 19 ์ผ ํ† ์š”์ผ ์˜คํ›„ 1:51 Benjamin Herr [email protected]
์ผ๋‹ค :

์ด๊ฑด ๋กœ์ผ“ ๊ณผํ•™์ด ์•„๋‹ˆ์•ผ

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

postfix ... ๋งค์šฐ ์ฝ๊ธฐ ์‰ฝ๊ณ  ํ•œ ๋ˆˆ์— ๋†“์น˜๊ธฐ ์–ด๋ ต๊ณ  ์Šˆํผ
์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝ”๋“œ๊ฐ€ ํ›„๋ฏธ๋กœ ์ฝํžˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ. ์•„๋‹ˆ
์šฐ์„  ์ˆœ์œ„ / ๋งคํฌ๋กœ ํ—›์†Œ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ถ”๊ฐ€ ๋ผ์ธ ๋…ธ์ด์ฆˆ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ „์— ํƒ€์›์„ ๋ณธ ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์ธ์žฅ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/57640#issuecomment-455818177 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABGmen354fhk7snYsANTfp5oOuDb4OLYks5vE5NSgaJpZM4aBlba
.

@HeroicKatora ์•ฝ๊ฐ„ ์ธ์œ„์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๊ทธ๋ž˜์š”. ๋‹ค๋ฅธ ์ ‘๋ฏธ์‚ฌ ์†”๋ฃจ์…˜์ด ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— await x? ๋Œ€ํ•ด ๋ฐ˜ ์ง๊ด€์  ์ธ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋งคํฌ๋กœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ—‰ํ—‰

์˜ˆ,? ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฏธ ์˜ˆ์™ธ๊ฐ€ ์žˆ์Œ์„ ์ธ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

keyword expr ๋งž๋Š” ๋‘ ๊ฐ€์ง€ ํ‘œํ˜„์‹ ํ˜•์‹, ์ฆ‰ return expr ๋ฐ break expr ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ž๊ฐ€ ํ›„์ž๋ณด๋‹ค ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. continue 'label ํ˜•์‹์€ ์‹์ด์ง€๋งŒ keyword expr ํ˜•์‹์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๊ณ„์‚ฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด์ œ 2 ๊ฐœ์˜ ์ „์ฒด ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ ๋‹จํ•ญ ํ‘œํ˜„์‹ ์–‘์‹๊ณผ 1 ๊ฐœ์˜ ํ›„์œ„ ๋‹จํ•ญ ํ‘œํ˜„์‹ ์–‘์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค. ? ๋ฐ await ๊ฐ€ await ๋ฐ return ๋ณด๋‹ค ๋” ์œ ์‚ฌํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์„ ๊ณ ๋ คํ•˜๊ธฐ ์ „์—๋Š” ๊ฑฐ์˜ return/break expr ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ? ์— ๋Œ€ํ•œ ์˜ˆ์™ธ๊ฐ€๋˜๋Š” ๊ทœ์น™.

Rust ํ”„๋กœ๊ทธ๋žจ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์ œ์–ด ํ๋ฆ„์€ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด break expr ๋Š” ๊ทธ๋‹ค์ง€ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( break; ๊ฐ€ ๋” ์ผ๋ฐ˜์ ์ด๊ณ  return; ์ด ๋” ์ผ๋ฐ˜์ ์ด๋ฉฐ ๋‹จํ•ญ ํ‘œํ˜„์‹ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค). ๋‚จ์•„์žˆ๋Š” ๊ฒƒ์€ ์ดˆ๊ธฐ return expr; ์ด๋ฉฐ ์ด๊ฒƒ์ด match , ? ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ด๋ผ๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. if let s ๋ฐ else s ๋ฐ for ๋ฃจํ”„. try { .. } ์•ˆ์ •ํ™”๋˜๋ฉด ? ๊ฐ€ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

@ ben0x539 variadic generics๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€๋˜๋ฉด ... ๋ฅผ ์˜ˆ์•ฝํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์œผ๋กœ ํ˜์‹ ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ๋ฆ„์—์„œ ํ›จ์”ฌ ๋” ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฉฐ ์ ‘๋‘์‚ฌ try! ์—์„œ ์ ‘๋ฏธ์‚ฌ ? ๊ฐ”์„ ๋•Œ ์–ผ๋งˆ๋‚˜ ๋” ๋‚˜์€ ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ ์—ˆ๋Š”์ง€ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. Rust ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ฝ”๋“œ๋ฅผ ์–ผ๋งˆ๋‚˜ ๊ฐœ์„ ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒฝํ—˜์„ ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

.await ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉด ์‹ค์ œ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ฐฝ์˜๋ ฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” ๋Œ€๊ธฐ์— ++ ๋˜๋Š” @ ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

:( ๋” ์ด์ƒ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ชจ๋‘๊ฐ€ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์— ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜๊ฒฌ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š”์ด ์Šค๋ ˆ๋“œ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ๊ฒฐ๊ตญ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  "๋งˆ๋ฒ•์˜ ๋งคํฌ๋กœ"๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” ๋งคํฌ๋กœ ํ™•์žฅ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•ด ๊ฑฐ์˜ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋ฌธ์„œ์—์„œ ๋‰˜์•™์Šค๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์€ ์• ํ”Œ ํŒŒ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ๋‘ ๋ฒˆ์งธ๋กœ ์ข‹์•„ํ•˜๋Š” ์˜ต์…˜์ด์ง€๋งŒ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ€์กฑ์ด ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์˜ต์…˜ [0]์ž…๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ try! ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋” ๋นจ๋ฆฌ ๋™์˜ํ• ์ˆ˜๋ก ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

[0] (์ฒซ ๋ถ„ ์ฐธ์กฐ) https://www.ted.com/talks/kenneth_cukier_big_data_is_better_data/transcript?language=en

match, if, if let, while, while let ๋ฐ for๋Š” ๋ชจ๋‘ ํผ๋ฒ ์ด์‹œ๋ธŒ ์ œ์–ด ํ๋ฆ„์ž…๋‹ˆ๋‹ค.
์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”. ์‰ฌ๋Š” ์ฒ™ํ•˜๊ณ  ๊ณ„์†ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ์ œ์–ด ํ๋ฆ„
ํ‚ค์›Œ๋“œ๋Š” ์‹ค๋ง์Šค๋Ÿฝ๊ฒŒ๋„ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2019 ๋…„ 1 ์›” 19 ์ผ ํ† ์š”์ผ ์˜คํ›„ 3:37 Yazad Daruvala [email protected]
์ผ๋‹ค :

:( ๋” ์ด์ƒ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋‚˜ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์— ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค.์ด ์Šค๋ ˆ๋“œ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€
๋‹ค๋ฅธ ์˜๊ฒฌ์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ๊ฒฐ๊ตญ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  "๋งˆ๋ฒ•์˜ ๋งคํฌ๋กœ"๊ฐ€ ๋˜๊ฒ ์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” ๋งคํฌ๋กœ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ฑฐ์˜ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํ™•์žฅ์€ ๋ณด์ด๋ฉฐ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์‰ฝ๊ฒŒ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฌธ์„œ์˜ ๋‰˜์•™์Šค.

์ผ๋ฐ˜ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์€ ์• ํ”Œ ํŒŒ์ด์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.
๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์˜ต์…˜์ด์ง€๋งŒ ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ€์กฑ์ด ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์˜ต์…˜ [0].
์ค‘์š”ํ•œ ๊ฒƒ์€ try! ๋‚˜์ค‘์— ์–ธ์ œ๋“ ์ง€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„
์ค‘์š”ํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋” ๋นจ๋ฆฌ ๋™์˜ํ• ์ˆ˜๋ก ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ๋” ๋นจ๋ฆฌ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด์‹ญ์‹œ์˜ค!

[0] (์ฒ˜์Œ 1 ๋ถ„์— ์ฐธ์กฐ)
https://www.ted.com/talks/kenneth_cukier_big_data_is_better_data/transcript?language=en

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/57640#issuecomment-455824275 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABGmesz5_LfDKdcKn6zMO5uuSJs9lFiYks5vE6wygaJpZM4aBlba
.

@mitsuhiko ๋™์˜ํ•ฉ๋‹ˆ๋‹ค! Postfix๋Š” ์ฒด์ธ์œผ๋กœ ์ธํ•ด ๋” ์†Œ๋ฐ•ํ•œ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ fut@await ๊ตฌ๋ฌธ์€ ๋‹ค๋ฅธ ์ œ์•ˆ๋งŒํผ ๋‹จ์ ์ด ๋งŽ์ง€ ์•Š์€ ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์˜ต์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๊ณ  ์ข€ ๋” ํ˜„์‹ค์ ์ธ ๋ฒ„์ „์ด ๋” ๋‚˜์€์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ—‰ํ—‰

match, if, let, while, while let ๋ฐ for๋Š” ๋ชจ๋‘ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํผ๋ฒ ์ด์‹œ๋ธŒ ์ œ์–ด ํ๋ฆ„์ž…๋‹ˆ๋‹ค. ์ค‘๋‹จ ๋ฐ ๊ณ„์†ํ•˜๋Š” ์ฒ™ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ์ œ์–ด ํ๋ฆ„ ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ๊ด€๋ จ ๋ฌธ๋ฒ•์€ ๋Œ€๋žต ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

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

ElseExpr =
  | Block:Block
  | If:If
  ;

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

์—ฌ๊ธฐ์—์„œ ์–‘์‹์€ if/while expr block , for pat in expr block ๋ฐ match expr { pat0 => expr0, .., patn => exprn } ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํ˜•์‹์—์„œ ๋’ค์— ์˜ค๋Š” ํ‚ค์›Œ๋“œ ์•ž์—๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด "์ ‘๋‘์‚ฌ ์‚ฌ์šฉ"์ด๋ผ๋Š” ๋œป์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋“ค์€ ๋ชจ๋‘ ๋ธ”๋ก ํ˜•์‹ ์ด๋ฉฐ ๋‹จํ•ญ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ await expr ์™€์˜ ๋น„๊ต๋Š” ์ผ๊ด€์„ฑ์ด๋‚˜ ๊ทœ์น™์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ธ”๋ก ์–‘์‹๊ณผ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ await block ๊ฐ€ ์•„๋‹ˆ๋ผ await expr .

@mitsuhiko ๋™์˜ํ•ฉ๋‹ˆ๋‹ค! Postfix๋Š” ์ฒด์ธ์œผ๋กœ ์ธํ•ด ๋” ์†Œ๋ฐ•ํ•œ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.

Rust๋Š” ์ด์› ์ ์ž…๋‹ˆ๋‹ค. ๋ช…๋ นํ˜• ๋ฐ ๊ธฐ๋Šฅ์  ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— ๊ฐ๊ฐ ๋” ์ ํ•ฉ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ฅด๊ฒ ์–ด์š”. ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๊ฐ–์ถ”๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

ํ•œ๋™์•ˆ Scala๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ €๋„ ๊ทธ๋ ‡๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์„ ์•„์ฃผ ์ข‹์•„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ match ๋ฐ if ๋Š” Rust์˜ ์ ‘๋ฏธ์‚ฌ ์œ„์น˜์— ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ง€๊ธˆ๊นŒ์ง€ ์š”์•ฝ

์˜ต์…˜ ๋งคํŠธ๋ฆญ์Šค :

์˜ต์…˜ ์š”์•ฝ ๋งคํŠธ๋ฆญ์Šค ( @ ๋ฅผ์‹œ๊ธธ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ฐ€๋Šฅ) :

| ์ด๋ฆ„ | Future<T> | Future<Result<T, E>> | Result<Future<T>, E> |
| --- | --- | --- | --- |
| PREFIX | -| -| -|
| ํ‚ค์›Œ๋“œ ๋งคํฌ๋กœ | await!(fut) | await!(fut)? | await!(fut?) |
| ํ‚ค์›Œ๋“œ ๊ธฐ๋Šฅ | await(fut) | await(fut)? | await(fut?) |
| ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„ | await fut | await fut? | await (fut?) |
| ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„ | await fut | await? fut | await fut? |
| POSTFIX | -| -| -|
| ํ‚ค์›Œ๋“œ๋กœ Fn | fut(await) | fut(await)? | fut?(await) |
| ํ‚ค์›Œ๋“œ ํ•„๋“œ | fut.await | fut.await? | fut?.await |
| ํ‚ค์›Œ๋“œ ๋ฐฉ๋ฒ• | fut.await() | fut.await()? | fut?.await() |
| ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ ๋งคํฌ๋กœ | fut.await!() | fut.await!()? | fut?.await!() |
| ์šฐ์ฃผ ํ‚ค์›Œ๋“œ | fut await | fut await? | fut? await |
| Sigil ํ‚ค์›Œ๋“œ | fut@await | fut@await? | fut?@await |
| Sigil | fut@ | fut@? | fut?@ |

"Sigil Keyword"์˜ sigil _cannot_์€ # . ๊ทธ๋Ÿฌ๋ฉด r ๋ผ๋Š” ๋ฏธ๋ž˜๋กœ ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ... ์‹œ๊ธธ ์ด ๋‚ด ์ฒซ ๋ฒˆ์งธ ๊ฑฑ์ •์ฒ˜๋Ÿผ ํ† ํฐ ํ™”๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ ์ž…๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์‹ค์ œ ์‚ฌ์šฉ (urlo์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ await ๋‹ค๋ฅธ _real_ ์‚ฌ์šฉ ์‚ฌ๋ก€ ๋ฅผ PM ๋ฐ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค) :

| ์ด๋ฆ„ | (ํ•„์ˆ˜) Client |> Client::get |> RequestBuilder::send |> await |> ? |> Response::json | > ? |
| --- | --- |
| PREFIX | -|
| ํ‚ค์›Œ๋“œ ๋งคํฌ๋กœ | await!(client.get("url").send())?.json()? |
| ํ‚ค์›Œ๋“œ ๊ธฐ๋Šฅ | await(client.get("url").send())?.json()? |
| ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„ | (await client.get("url").send()?).json()? |
| ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„ | (await? client.get("url").send()).json()? |
| POSTFIX | -|
| ํ‚ค์›Œ๋“œ๋กœ Fn | client.get("url").send()(await)?.json()? |
| ํ‚ค์›Œ๋“œ ํ•„๋“œ | client.get("url").send().await?.json()? |
| ํ‚ค์›Œ๋“œ ๋ฐฉ๋ฒ• | client.get("url").send().await()?.json()? |
| ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ ๋งคํฌ๋กœ | client.get("url").send().await!()?.json()? |
| ์šฐ์ฃผ ํ‚ค์›Œ๋“œ | client.get("url").send() await?.json()? |
| Sigil ํ‚ค์›Œ๋“œ | client.get("url").send()@await?.json()? |
| Sigil | client.get("url").send()@?.json()? |

ํŽธ์ง‘ ์ฐธ๊ณ  : Response::json ๋„ Future ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์  ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ง€์ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ send ๋Š” ๋‚˜๊ฐ€๋Š” IO ๋ฐ json ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์ ‘๋‘์‚ฌ ์˜ต์…˜์— ๋Œ€ํ•œ ๋Œ€๋žต์ ์ธ ํ•ฉ์˜๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„ ( await? ์„คํƒ•๊ณผ ํ•จ๊ป˜)๊ฐ€ ๊ฐ€์žฅ ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์œ„์™€ ๊ฐ™์ด ๋” ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ ‘๋ฏธ์‚ฌ ์†”๋ฃจ์…˜์„ ์ฐฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ ์„ ํƒ์—๋Š” ๋Œ€๋žต์ ์ธ ํ•ฉ์˜๊ฐ€ ์žˆ์ง€๋งŒ ์–ด๋–ค ํ›„์œ„ ์†”๋ฃจ์…˜์ด ๊ฐ€์žฅ ์ข‹์€์ง€์— ๋Œ€ํ•œ ํ•ฉ์˜๋Š”์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ ๋œ ๋ชจ๋“  ์˜ต์…˜์€ ํ˜ผ๋™์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค (ํ‚ค์›Œ๋“œ ๊ฐ•์กฐ ํ‘œ์‹œ๋กœ ์™„ํ™”).

  • Fn With Keyword => await ๋ผ๋Š” ์ธ์ˆ˜๋กœ fn ํ˜ธ์ถœ
  • ํ‚ค์›Œ๋“œ ํ•„๋“œ => ํ•„๋“œ ์•ก์„ธ์Šค
  • ํ‚ค์›Œ๋“œ ๋ฉ”์†Œ๋“œ => ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
  • ๋งคํฌ๋กœ (์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ) => await ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๊นŒ?
  • ๊ณต๋ฐฑ ํ‚ค์›Œ๋“œ => ๊ทธ๋ฃน์„ ํ•œ ์ค„๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค (์—ฌ๋Ÿฌ ์ค„๋ณด๋‹ค ๋” ์ข‹์Šต๋‹ˆ๊นŒ?).
  • Sigil => ์ด๋ฏธ sigil-heavy๋กœ ์ธ์‹๋˜๋Š” ์–ธ์–ด์— ์ƒˆ๋กœ์šด sigils ์ถ”๊ฐ€

๋‹ค๋ฅธ๋ณด๋‹ค ๊ณผ๊ฐํ•œ ์ œ์•ˆ :

  • ์ ‘๋‘์‚ฌ (๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„)์™€ ์ ‘๋ฏธ์‚ฌ "ํ•„๋“œ"๋ฅผ ๋ชจ๋‘ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค (์ด๋ฅผ ์ผ๋ฐ˜ํ™” ๋œ ํŒจํ„ด์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์•ž์œผ๋กœ match , if ๋“ฑ๊ณผ ๊ฐ™์€ ๋” ๋งŽ์€ ํ‚ค์›Œ๋“œ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.) ์ด ํ† ๋ก ์— ๋Œ€ํ•œ ๋ถ€๋ก) [[์ฐธ์กฐ] (https://github.com/rust-lang/rust/issues/57640#issuecomment-455827164)]
  • ์„ ๋ฌผ์„ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ํŒจํ„ด์—์„œ await (์—ฐ์‡„ ์—†์Œ) [[์ฐธ์กฐ] (https://github.com/rust-lang/rust/issues/57640)]
  • ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ์ง€์—ฐ ํ—ˆ์šฉ [[์ฐธ์กฐ] (https://github.com/rust-lang/rust/issues/57640#issuecomment-455782394)]

ํ‚ค์›Œ๋“œ ๋งคํฌ๋กœ await!(fut) ์‚ฌ์šฉํ•œ ์•ˆ์ •ํ™”๋Š” ๋ฌผ๋ก  ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ„์˜ ๋ชจ๋“  ํ•ญ๋ชฉ๊ณผ ํ–ฅํ›„ ํ˜ธํ™˜๋˜์ง€๋งŒ ๋งคํฌ๋กœ๊ฐ€ ์ผ๋ฐ˜ ์‹๋ณ„์ž ๋Œ€์‹  ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ•˜๋‚˜์˜ ์ฒด์ธ์—์„œ ๋‘ ๊ฐœ์˜ await ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์˜ ์‹ค์ œ์™€ ๊ฐ™์€ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ์ €๋Š” ๊ทธ๊ฒƒ์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์•„๋ฌด๋„ ๊ณต์œ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ reqwest ์˜ˆ์ œ์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ ‘๋ฏธ์‚ฌ await ๋Š” ์ฒด์ธ์—์„œ ๋‘ ๋ฒˆ ์ด์ƒ await ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์š”์•ฝ ๋Œ“๊ธ€ ์œ„์— ์ฃผ๋ชฉํ• ๋งŒํ•œ ๋‚ด์šฉ์„ ๋†“์นœ ๊ฒฝ์šฐ urlo์—์„œ ๋‚˜๋ฅผ PMํ•˜๊ณ  ์ถ”๊ฐ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (ํฐ ๋ชฉ์†Œ๋ฆฌ ํŽธ์• ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋Œ“๊ธ€์„ ์ถ”๊ฐ€ํ•ด์•ผํ•˜์ง€๋งŒ)

๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ์—ญ์‚ฌ์ ์œผ๋กœ ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ๋ฅผ ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ํ‚ค์›Œ๋“œ ๋งคํฌ๋กœ await!(fut) ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋Œ€๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์œ„์น˜์— ๋Œ€ํ•œ ์‹ค์ œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐ ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๋‚˜์ค‘์— ๋น„ ๋งคํฌ๋กœ ์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ ์˜ต์…˜์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

ํ•˜์ง€๋งŒ ์œ„์˜ ์š”์•ฝ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์ €๋Š” "ํ‚ค์›Œ๋“œ ํ•„๋“œ"๋ฅผ ์ข‹์•„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. "Space Keyword"๋Š” ์—ฌ๋Ÿฌ ์ค„๋กœ ๋‚˜๋ˆŒ ๋•Œ ๊ธฐ๋ถ„์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ํ•œ ์ค„์— client.get("url").send() await?.json()? ๋ผ๋Š” ์‹์„ ์ž˜๋ชป ๊ทธ๋ฃนํ™”ํ•˜๋Š” ์–ด์ƒ‰ํ•œ ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‚ค์›Œ๋“œ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด client.get("url").send().await?.json()? ๋‘ ๊ฐ€์ง€ ํ˜•์‹ ๋ชจ๋‘์—์„œ๋ณด๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

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

์•ก์…˜์ด๊ธฐ ๋•Œ๋ฌธ์— "ํ‚ค์›Œ๋“œ ๋ฐฉ๋ฒ•"์ด ๋” ์ž˜ ํ๋ฅผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒฝ์šฐ Future ์—์„œ "์‹ค์ œ"๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค _.

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

( extern "rust-await" ๋Š” ๋ฌผ๋ก  ์‹ค์ œ๋กœ await๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๋งˆ๋ฒ•์„ ์•”์‹œํ•˜๊ณ  ์‹ค์ œ๋กœ ์‹ค์ œ fn์ด ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ตฌ๋ฌธ์ด ๋ฉ”์†Œ๋“œ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.)

์ ‘๋‘์‚ฌ (๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„) ๋ฐ ์ ‘๋ฏธ์‚ฌ "ํ•„๋“œ"๋ชจ๋‘ ํ—ˆ์šฉ ...

์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ด ์„ ํƒ๋˜๋ฉด (ํ•จ๊ป˜ ๋˜๋Š” ์ ‘๋‘์‚ฌ 1 ๋Œ€์‹ ์—) ํ™•์‹คํžˆ ํ–ฅํ›„ ๋…ผ์˜๋ฅผ์œ„ํ•œ ๋…ผ์Ÿ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ ํ‘œ๊ธฐ๋ฒ• ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•˜๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์˜๋ฏธ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‘˜ ๋‹ค ํ—ˆ์šฉํ•˜๊ณ  ๊ตฌ๋ฌธ์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋ฉด์„œ ๊ทœ์น™์„ ํ†ตํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์œ ์ƒ๊ฐ ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๊ฑฐ๋ถ€ ๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, await postix ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•ž์œผ๋กœ ๋…ผ์˜ํ•ด์•ผ ํ•  ๋…ผ์˜ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์—๋Š” ๋ฌธ์ž์—ด await๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ์ด ํ—ˆ์šฉ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

: +1 :


์—ฌ๊ธฐ์—์„œ ๋งŽ์€ ์˜ˆ์ œ๋ฅผ ๋ณธ ํ›„ ๋ฌด์ž‘์œ„๋กœ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค ( ์˜ˆ : @mehcode 's ) : .await ์— ๋Œ€ํ•ด ๊ธฐ์–ต ๋‚˜๋Š” ๋ถˆ๋งŒ ์ค‘ ํ•˜๋‚˜๋Š”๋ณด๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค โ€ ,ํ•˜์ง€๋งŒ ๊ธฐ๋‹ค๋ฆด ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์ง€๋งŒ .await? ๋ผ๋Š” ์‚ฌ์‹ค์€ ์–ด์จŒ๋“  ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ด€์‹ฌ์„ ๋„๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

โ€  ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ•์กฐํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ


ํ—‰ํ—‰

์˜์–ด์ฒ˜๋Ÿผ ์ฝํžˆ์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ์— ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

request.get().await ์™€ ๊ฐ™์€ ๊ฒƒ์€ body.lines().collect() ์™€ ๊ฐ™์ด ์ฝ์Šต๋‹ˆ๋‹ค. "์—ฐ์‡„ ๋œ ๋ฐ˜๋ณต๊ธฐ ๋ฉ”์„œ๋“œ์˜ ๋ฌด๋ฆฌ"์—์„œ _prefix_๋Š” ์‹ค์ œ๋กœ ๋” ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์— "๋Œ€๊ธฐ"๋ผ๊ณ  ๋งํ•œ ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ, ๋‹น์‹ ์ด ๋ฌด์Šจ ์†Œ๋ฆฌ๋ฅผ ๋“ฃ๊ฒŒ ๋ ์ง€ ์–ธ์ œ๋“ค์„ ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ ค, ๋งˆ์น˜ ์ •์› ๊ธธ ๋ฌธ์žฅ ์ฒ˜๋Ÿผ.

๊ทธ๋ฆฌ๊ณ  ๋ช‡ ๋…„ ๋™์•ˆ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•œ ํ›„, ์ˆ˜์œจ ํฌ์ธํŠธ๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•„๋Š” ๊ฒƒ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ธ ๊ฒฝ์šฐ ๋“ค์—ฌ ์“ฐ๊ธฐ ์ค„์„ ํ›‘์–ด ๋ณผ ๋•Œ์ธ์ง€ ๋ถ€ํ•˜์—†์ด ๋ช‡ ์ดˆ ๋งŒ์— 200 ์ค„ ํ•จ์ˆ˜์˜ ๋ชจ๋“  co_await / yield ์ˆ˜์ต์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Rust์˜ ํ‘œํ˜„ ์ง€ํ–ฅ์  ํŠน์„ฑ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ ˆ๋Œ€์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ œํ•œ ์ธ ํ‘œํ˜„์‹ ๋‚ด๋ถ€์— ์–ด๋–ค ๊ฒƒ๋„ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ ์–ด๋„ C #์˜ await ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CallSomething(argument, await whatever.Foo() ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ๊ทธ๋Ÿด๋“ฏํ•ฉ๋‹ˆ๋‹ค.

async _will_์ด ์‹ ์ค‘๊ฐ„์— ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ ‘๋‘์‚ฌ๋ณด๋‹ค ์ ‘๋‘์‚ฌ์—์„œ ๋ณด๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šด ์ด์œ ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

'if, while, match, return'๊ณผ ๊ฐ™์€ ์ˆ˜์ค€์˜ ์กด์ค‘์„ ๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ์ด ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ผ๋ฉด-Rust ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์€ ์•…๋ชฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

return (๋ฐ continue ๋ฐ break ) ๋ฐ while ๋Š” ํ•ญ์ƒ ! ๋ฐ () ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ฒด์ธ์— _completely_ ์“ธ๋ชจ์—†๋Š” ๊ฒƒ์œผ๋กœ ์œ ๋ช…ํ•ฉ๋‹ˆ๋‹ค for ๋ฅผ ์ƒ๋žตํ–ˆ์ง€๋งŒ, ํŠนํžˆ rayon์—์„œ ๋‚˜์œ ์˜ํ–ฅ์—†์ด .for_each() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž˜ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ async/await ์ด ์ฃผ์š” ์–ธ์–ด ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ์‚ฌ์‹ค์— ํ™”ํ•ดํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ฝ”๋“œ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ƒํƒœ๊ณ„์— ํผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ณณ์—์„œ๋Š” ? ๋งŒํผ ํ”ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ฒƒ์„ ๋ฐฐ์›Œ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๊ตฌ๋ฌธ ์„ ํƒ์ด ์ฒ˜์Œ์— ์–ด๋–ป๊ฒŒ ๋Š๊ปด์งˆ ์ง€๋ณด๋‹ค ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉ ํ›„ ์–ด๋–ป๊ฒŒ ๋Š๊ปด์งˆ ์ง€ ์˜์‹์ ์œผ๋กœ ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๊ฐ€ ์ง„ํ–‰๋˜๋Š” ํ•œ await ๋Š” ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๋™๋ฌผ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. return , break , continue ๋ฐ yield ์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์€ jmp ์ธก๋ฉด์—์„œ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋ณด๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์‹ ๊ฒฝ ์“ฐ๋Š” ์ œ์–ด ํ๋ฆ„์ด ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ˆˆ์ด ํ™”๋ฉด์„ ๊ฐ€๋กœ ์งˆ๋Ÿฌ ํŠ€์–ด ์˜ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await ๋Š” ๊ธฐ๊ณ„์˜ ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ์ฃผ์ง€๋งŒ ์šฐ๋ฆฌ ๋ˆˆ๊ณผ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ง๊ด€์  ์ธ ์ดํ•ด์— ์ค‘์š”ํ•œ ์ œ์–ด ํ๋ฆ„์„ ์ด๋™ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” return ๋˜๋Š” break ๋ฌด์กฐ๊ฑด ํ˜ธ์ถœ์„ ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ์œ ํ˜น์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ์ด์œ ๋กœ, ์šฐ๋ฆฌ๋Š”์ด๋ฅผ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„  ์ˆœ์œ„ ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ชจ๋“  ๊ฒƒ์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€์ ธ ๊ฐ€์„œ ์–ด๋”˜๊ฐ€๋กœ ๋Œ๋ ค ๋ณด๋‚ด๊ณ  ๊ทธ ํ•จ์ˆ˜ ๋‚˜ ๋ธ”๋ก ๋‚ด์—์„œ ์‹คํ–‰์„ ๋๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await ์—ฐ์‚ฐ์ž๋Š” ์—ฐ๊ฒฐ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ‘œํ˜„์˜ ๋์ด ์•„๋‹ˆ๋ผ ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์˜ ํ† ๋ก ๊ณผ ์˜ˆ์ œ๋ฅผ ๊ณ ๋ คํ•œ ๊ฒฐ๊ณผ, ๋†€๋ผ์šด ์šฐ์„  ์ˆœ์œ„ ๊ทœ์น™์„ ํ›„ํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ด๊ฒŒ ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฐ‰์•„ ๋จน๋Š” ๊ฐ๊ฐ์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํ† ํ‚น ๋ง ํ›„๋ณด์ž๋Š” ๋‹น๋ถ„๊ฐ„ await!(expr) ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ€๊ณ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๊ณ , ๋‚˜์ค‘์— ๋” ๋‚˜์€ ๊ฒƒ์ด ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @Centril ์˜ ๋ฐœ์–ธ์„ ์ฝ๊ธฐ ์ „์— ๋‚˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ตฌ๋ฌธ์œผ๋กœ์ด ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊บผ๋‚ด๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์ง€์›ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ์˜ ์ฃผ์žฅ์€ ์ด๊ฒƒ์ด ๋‹จ์ง€ ๋Œ€์ฒ˜ํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Rust์—์„œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์ฒด์ธ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ? ํ‚ค์›Œ๋“œ๊ฐ€ ์ฑ„ํƒ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ ๋งค์šฐ ์„ฑ๊ณต์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค๋ง ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์˜ ์ดˆ๊ธฐ์— @withoutboats ๋Š” ๊ธฐ์กด ์˜ต์…˜ 4 ๊ฐœ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ expr await ๊ตฌ๋ฌธ ๋งŒ์ด ์šฐ๋ฆฌ๋ฅผ ์žฅ๊ธฐ์ ์œผ๋กœ ํ–‰๋ณตํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ์ด์ƒํ•œ ์šฐ์„  ์ˆœ์œ„ ๋†€๋ผ์›€์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ? ์—ฐ์‚ฐ์ž์˜ ์ ‘๋‘์‚ฌ ๋ฒ„์ „์„ ๋งŒ๋“ค๋„๋ก ๊ฐ•์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹๊ณผ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ์˜ ์ œ์–ด ํ๋ฆ„์„ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ธ ? ์—ฐ์‚ฐ์ž๋Š” ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž์˜ ์„ ๋ก€ ์—ญํ• ์„ํ•˜๋ฉฐ await ๋Š” return , break ๋ณด๋‹ค ์‹ค์ œ๋กœ ? ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. break ๋˜๋Š” yield . ํ›„์œ„ ๋น„ ๊ธฐํ˜ธ ์—ฐ์‚ฐ์ž๊ฐ€ Rust์—์„œ ์ƒˆ๋กœ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ, async/await ์€ ๋น ๋ฅด๊ฒŒ ์ต์ˆ™ํ•ด ์งˆ ์ˆ˜์žˆ์„๋งŒํผ ๋„๋ฆฌ ํผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋ชจ๋“  ์˜ต์…˜์ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ expr await ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ await ๊ฐ€ ํ‚ค์›Œ๋“œ์ž„์„ ๋ช…ํ™•ํžˆํ•˜์—ฌ ๋งˆ๋ฒ• ์ œ์–ด ํ๋ฆ„์„ ๊ฐ•์กฐํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. expr.await , expr.await() expr.await! , expr.await!() ๋“ฑ๊ณผ ๋น„๊ตํ•˜๋ฉด ์ด๊ฒƒ์ด ํ•„๋“œ / ๋ฉ”์„œ๋“œ / ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๊ณ  ์„ค๋ช… ํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ

await ๋ฅผ @ await ๋กœ ์ฒ ์žํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๊ทธ๊ฒƒ์„ ๋ณด์ฆํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•œ ์šด์˜์ž์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ตญ await ์ฒ ์ž๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ ์œ„์น˜์—์žˆ๋Š” ํ•œ.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ _real_ ์˜ˆ์ œ๋ฅผ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ... ๋‚˜๋Š” ๋งค์šฐ ๋น„๋™๊ธฐ์ ์ด๊ณ  ์„ ๋ฌผ 0.1 await (๋‚ด๊ฐ€ ์•Œ๊ณ ์žˆ๋Š” ๋งค์šฐ ์‹คํ—˜์ ์ธ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 23,858 ๋ผ์ธ์˜ rust ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (tokei์— ๋”ฐ๋ฅด๋ฉด). spelunking (ํŽธ์ง‘ ๋จ)์„ ์‹œ์ž‘ํ•ฉ์‹œ๋‹ค (๋ชจ๋“  ๊ฒƒ์ด rustfmt๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜์—ˆ์Œ์„ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค) :

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

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

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

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

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

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

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

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

    Ok(user)
}

์ด์ œ ์ด๊ฒƒ์„ ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ์ ‘๋‘์‚ฌ ๋ณ€ํ˜•์œผ๋กœ ๋ณ€ํ™˜ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ช…๋ฐฑํ•œ ์ด์œ ๋กœ ์ด๊ฒƒ์€ rustfmt๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

    Ok(user)
}

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด๊ฒƒ์„ ์ œ๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜• ์ธ "์ ‘๋ฏธ์‚ฌ ํ•„๋“œ"๋กœ ๋ณ€ํ™˜ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

    Ok(user)
}

์ด ์—ฐ์Šต ํ›„์— ๋‚˜๋Š” ๋งŽ์€ ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•œ๋‹ค.

  • ๋‚˜๋Š” ์ง€๊ธˆ await? foo ๊ฐ•ํ•˜๊ฒŒ ๋ฐ˜๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ํ‘œํ˜„์—๋Š” ์ข‹์ง€๋งŒ ? ๋Š” ๋ณต์žกํ•œ ํ‘œํ˜„์—์„œ๋Š” ์žƒ์–ด๋ฒ„๋ฆฐ ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ๋ฅผํ•ด์•ผํ•œ๋‹ค๋ฉด "์œ ์šฉํ•œ"์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ–๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ์ ‘๋ฏธ์‚ฌ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์„ ๊ฒฐํ•ฉํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ let ๋ฐ”์ธ๋”ฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ ‘๋ฏธ์‚ฌ _field_ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด rustfmt ์–ด๋ฒ•์—์„œ ์ž์ฒด ์ค„์ด ์•„๋‹Œ .await? ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค„์— ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ƒ๋žต ๋ถ€ํ˜ธ "..."๋Š” ๊ฐ„๊ฒฐํ•จ๊ณผ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜๋Š” ์ผ์‹œ ์ค‘์ง€๋ฅผ ์ƒ์ง•์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ์˜์–ด๋กœ ๋ชจ๋‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. (๋น„๋™๊ธฐ ๋™์ž‘์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ฒ˜๋Ÿผ!) ๋˜ํ•œ ์„œ๋กœ ์ž˜ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

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

๋‹ค๋ฅธ ์˜ต์…˜์ด ๊ฐ„๊ฒฐํ•˜๊ณ  ์‹œ๊ฐ์ ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ์„์ง€ ์˜์‹ฌ๋ฉ๋‹ˆ๋‹ค.

ใ…

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

๋น„

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

๊ธด ๊ธฐ๋‹ค๋ฆผ ์ฒด์ธ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์€ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๋‹จ์ˆœํžˆ ์ผ๋ฐ˜ Future ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์‹ค์ œ๋กœ ์‹คํŒจ์‹œ ๋ฐฑ์—… ๋™์ž‘์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ถ€ ํ‘œํ˜„์‹์€ ๋Œ€๊ธฐ ์ฒด์ธ์œผ๋กœ ์ž˜ ๋ณ€ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ƒ๊ฐํ•œ๋‹ค :

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

value.unwrap()

์ด๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝ์Šต๋‹ˆ๋‹ค.

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

value.unwrap()

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ œ๋กœ ๋น„์šฉ ์„ ๋ฌผ์˜ ๋ชจ๋“  ํž˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

@EyeOfPython @ ์—์„œ future@await @ ์ด์™ธ์˜ ๋‹ค๋ฅธ ์„ ํƒ์ด ์žˆ์Œ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. future~await ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ~ ๋Š” ์„ธ๋ฏธ ํ•˜์ดํ”ˆ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋ฉฐ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ดํ”ˆ - ์€ (๋Š”) ๋งˆ์ด๋„ˆ์Šค ์—ฐ์‚ฐ์ž์™€ ์Œ์ˆ˜ ์—ฐ์‚ฐ์ž๋กœ ์ด๋ฏธ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ~ ๋Š” Rust์—์„œ ํž™ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋„ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. sould๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ˜ผ๋ž€์„ ๋œ์ค๋‹ˆ๋‹ค.

@earthengine ์ข‹์€ ์ƒ๊ฐ์ด์ง€๋งŒ future~ ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ~ ๊ฐ€ await ํ‚ค์›Œ๋“œ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ( ? ๊ธฐํ˜ธ์ฒ˜๋Ÿผ)

๋ฏธ๋ž˜ | ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜ | ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ
-| -| -
๋ฏธ๋ž˜ ~ | ๋ฏธ๋ž˜ ~? | ๋ฏธ๋ž˜? ~

๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ๊ฒฐ ์„ ๋ฌผ :

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

Go๊ฐ€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ณ  ํฅ๋ฏธ๋กœ์šด ์ ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. Go์˜ ์„ ๋ฌผ์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋Œ€์•ˆ์€ ์ฑ„๋„์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” await ๋˜๋Š” ๋‹ค๋ฅธ ๋น„๋ช… ๊ตฌ๋ฌธ ๋Œ€์‹  Go ์ฑ„๋„์€ ํ•ด๋‹น ์šฉ๋„๋กœ <- ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” ๊ฝค ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๋‹จ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ด์ „์—๋Š” ์‚ฌ๋žŒ๋“ค์ด Go์˜ ๊ฐ„๋‹จํ•œ ๊ตฌ๋ฌธ๊ณผ ์šฐ์ˆ˜ํ•œ ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ์นญ์ฐฌํ•˜๋Š” ๋ฐฉ์‹์„ ์ž์ฃผ ๋ณด์•˜์œผ๋ฏ€๋กœ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํ•˜๊ฒŒ๋„, Go์—์„œ๋ณด๋‹ค Rust ์†Œ์Šค ์ฝ”๋“œ์— ๊บพ์‡  ๊ด„ํ˜ธ๊ฐ€ ํ›จ์”ฌ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํžˆ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์ œ๋„ค๋ฆญ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด <- ์—ฐ์‚ฐ์ž๊ฐ€ ์ •๋ง ๋ฏธ๋ฌ˜ํ•˜๊ณ  ์ž‘์—…ํ•˜๊ธฐ์— ์ฆ๊ฒ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋‹จ์ ์€ ํ•จ์ˆ˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์—์„œ -> ์™€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ๋‹จ์ ์€ <- ์‹œ๊ธธ์ด placement new ๋กœ ๊ตฌํ˜„๋˜์–ด ์‚ฌ๋žŒ๋“ค์ด ์ž˜๋ชป ํ•ด์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜ ํ›„ <-- ์‹œ๊ธธ์—์„œ ์ค‘์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

let output = <-- future;

async ์ปจํ…์ŠคํŠธ์—์„œ <-- ๋Š” <- ๋ฏธ๋งŒ์ด์ง€๋งŒ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€์‹  <- ๋ฐ ์ ‘๋‘์‚ฌ await ๋ณด๋‹ค ํฐ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋“ค์—ฌ ์“ฐ๊ธฐ์™€ ์ž˜ ์–ด์šธ๋ฆฝ๋‹ˆ๋‹ค.

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

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

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

๋‚˜์—๊ฒŒ์ด ์—ฐ์‚ฐ์ž๋Š” await (์ฝ”๋“œ ์ปจํ…์ŠคํŠธ์—์„œ ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ ๋‚˜ ๋ณ€์ˆ˜์™€ ๋” ๋น„์Šทํ•ด ๋ณด์ž„)๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋…ํŠนํ•˜๊ณ  ์ฐพ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ Github์—์„œ๋Š” ๋‚ด ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ๋ณด๋‹ค ๋” ์–‡์•„ ๋ณด์ด์ง€๋งŒ ์น˜๋ช…์ ์ด์ง€ ์•Š์œผ๋ฉฐ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ์‚ด ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ถˆํŽธํ•˜๋‹ค๊ณ  ๋Š๋ผ๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ ๋˜๋Š” ๋” ๋‚˜์€ ๊ธ€๊ผด (ํŠนํžˆ ํ•ฉ์ž ์‚ฌ์šฉ)์ด ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์„ ์ข‹์•„ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๊ฐœ๋…์ ์œผ๋กœ "์•„์ง ์—ฌ๊ธฐ์—์—†๋Š” ๊ฒƒ"์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ์˜ ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ ๋ฐฉํ–ฅ์€ ํ…์ŠคํŠธ๋ฅผ ์ฝ๋Š” ๋ฐฉํ–ฅ๊ณผ ๋ฐ˜๋Œ€์ด๋ฏ€๋กœ "๋ฏธ๋ž˜์—์„œ ์˜ค๋Š” ๊ฒƒ"์œผ๋กœ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. <-- ์—ฐ์‚ฐ์ž์˜ ๊ธด ๋ชจ์–‘์€ "์ผ๋ถ€ ๋‚ด๊ตฌ์„ฑ์žˆ๋Š” ์ž‘์—…์ด ์‹œ์ž‘๋จ"์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค. future ์—์„œ ์˜ค๋Š” ๊บพ์‡  ๊ด„ํ˜ธ์™€ ๋‘ ๊ฐœ์˜ ํ•˜์ดํ”ˆ์€ "์—ฐ์† ํด๋ง"์„ ์ƒ์ง• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์ด์ „์ฒ˜๋Ÿผ "๋Œ€๊ธฐ"๋กœ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์–ด๋–ค ์ข…๋ฅ˜์˜ ๊นจ๋‹ฌ์Œ์€ ์•„๋‹ˆ์ง€๋งŒ ์žฌ๋ฏธ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ด ์ œ์•ˆ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ธ์ฒด ๊ณตํ•™์  ๋ฐฉ๋ฒ• ์ฒด์ธ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „์— ์ œ์•ˆํ•œ ์ง€์—ฐ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž ์˜ ์•„์ด๋””์–ด๊ฐ€ ์—ฌ๊ธฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ ‘๋‘์‚ฌ ๋ฐ ์ ‘๋ฏธ์‚ฌ await ๊ตฌ๋ฌธ์˜ ์„ธ๊ณ„์—์„œ ์ตœ์ƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ œ๊ฐ€ ์ด์ „์— ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ์›ํ–ˆ๋˜ ์œ ์šฉํ•œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ( ์ง€์—ฐ๋œ ์—ญ ์ฐธ์กฐ ๋ฐ ์ง€์—ฐ๋œ ๋ถ€์ • ๊ตฌ๋ฌธ) ๋„ ์†Œ๊ฐœ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ง€์—ฐ๋œ ๋‹จ์–ด๊ฐ€ ์ ์ ˆํ•œ ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

let not_empty = some_vec.!is_empty();

let deref = value.*as_ref();

์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„๋Š” ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋งค์šฐ ๋ถ„๋ช…ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์ด bool ์†์„ฑ์„ ๋ถ€์ •ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉ๋˜๋Š” is_not_* ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์ค„์–ด๋“ค๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋ถ€์šธ / ํ•ด์„ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ๋•Œ ๋” ๊น”๋”ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋งˆ์ง€๋ง‰์œผ๋กœ @mehcode์—์„œ ๊ฒŒ์‹œ ํ•œ ์‹ค์ œ ์˜ˆ์ œ์— ์ ์šฉํ–ˆ์œผ๋ฉฐ <-- ๊ฐ€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ฒด์ธ ๋‚ด์—์„œ async ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๊ฐ•์กฐํ•˜๋Š” ๋ฐฉ์‹์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค . ๋ฐ˜๋Œ€๋กœ await ์ ‘๋ฏธ์‚ฌ๋Š” ์ผ๋ฐ˜ ํ•„๋“œ ์•ก์„ธ์Šค ๋˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ (๊ตฌ๋ฌธ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ๋˜๋Š” ํ˜•์‹ํ™” ์—†์ด๋Š” ๊ตฌ๋ถ„ํ•˜๊ธฐ๊ฐ€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

    Ok(user)
}

๊ฒฐ๊ตญ, ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ—‰ํ—‰

๊ธด ๊ธฐ๋‹ค๋ฆผ ์ฒด์ธ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์€ ํ˜•ํƒœ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋‹จ์ˆœํžˆ ์ผ๋ฐ˜ Future ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์˜คํ•ดํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๋ฐฐํƒ€์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ์กฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด and_then ์ ˆ์— ์ž…๋ ฅ ํ•  ํ•„์š”๊ฐ€ FnOnce(T) -> impl Future<_> ,๋ฟ๋งŒ ์•„๋‹ˆ๋ผ์—์„œ FnOnce(T) -> U . ๋ฏธ๋ž˜์— ์ฒด์ธ ์ฝค๋น„๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋Š” ํ›„์œ„์— paranthesis์—†์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค :

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

์ด ๊ฒŒ์‹œ๋ฌผ์—์„œ๋Š” ์ˆ˜์ • ํ›„์˜ ๊ฒฝ์šฐ ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ์— ์ดˆ์ ์„ ๋งž์ถœ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ, ์šฐ๋ฆฌ๋Š” ์ ์–ด๋„ ์–ด๋Š ์ •๋„ ์ž‘๋™ํ•˜๋Š” ์„ธ ๊ฐ€์ง€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์€ ํ˜„์žฌ ๊ตฌ๋ฌธ์—์„œ ์ด๋Ÿฌํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ–๋Š” ํ•˜๋‚˜์˜ ์‚ฌํ›„ ์ˆ˜์ • ํ‘œํ˜„์‹์œผ๋กœ ์˜ˆ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ด๋–ค ์ œ์•ˆ๋„ ํ˜„์žฌ ์šด์˜์ž์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ๊ฐ•ํ•˜๊ฒŒ ๋Š๋‚๋‹ˆ๋‹ค.

  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ( future.await() )
  • ํ•„๋“œ ํ‘œํ˜„์‹ ( future.await )
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ( future(await) )

๊ธฐ๋Šฅ์ƒ์˜ ์ฐจ์ด๋Š” ์ž‘์ง€๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š”์ด ๋ชจ๋“  ๊ฒƒ์„ ๋ฐ›์•„ ๋“ค์ผ ๊ฒƒ์ด๋ฉฐ, ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„ ๋ฏธ์„ธ ์กฐ์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ์˜ ์ธ์œ„์„ฑ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์€ ๋ชจ๋“  ์ฐจ์ด์ ์„ ํ•œ ๋ฒˆ์— ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ€์žฅ ์••์ถ• ๋œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

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

// What we want to do, in macro syntax:
let foo: Foo<_, _, _> = โ€ฆ;
(await!(foo.member))(42)
  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ : foo.member.await()(42)
    ๊ฐ€์žฅ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜๋ฏ€๋กœ ๊ด„์•ฝ๊ทผ์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํšŒ์› : (foo.member.await)(42)
    ์ด๊ฒƒ์ด ์ฝœ ๋Ÿฌ๋ธ” ์ผ ๋•Œ ๊ธฐ๋‹ค๋ฆฐ ๊ฒฐ๊ณผ ์ฃผ์œ„์— ํŒจ๋ž€ ํ…Œ ์‹œ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฝœ ๋Ÿฌ๋ธ”์„ ๋ฉค๋ฒ„๋กœ ๊ฐ–๋Š” ๊ฒƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ํ˜ผ๋™๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ํŒจํ„ด์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ํ•ด์ฒด ํ•  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค : let โ€ฆ { await: value } = foo.member; value(42) ์–ด๋–ป๊ฒŒ ๋“ ?
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ : (foo.member)(await)(42)
    ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๊ตฌ์กฐํ™” (๋ฉค๋ฒ„ ์ด๋™)๋ฅผ ์œ„ํ•ด ํŒจ๋ž€ ํ…Œ ์‹œ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฉค๋ฒ„ ์ด๋™์„ ํ†ตํ•ด ์ž…๋ ฅ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ๋ฅผ ์ฝœ๋Ÿฌ ๋ธ”๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์„ ๋•Œ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.์ด ์„ธ ๊ฐ€์ง€ ์šฐ์„  ์ˆœ์œ„ ํด๋ž˜์Šค๊ฐ€ ์„œ๋กœ ๋ฐ”๋กœ ๋’ค ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ž˜๊ฐ€ ์–ด๋–ป๊ฒŒ ํ–‰๋™ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๊นŒ?

๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ณผ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ๋ฐฉ๋ฒ•์€ self ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค.

๋ฉค๋ฒ„์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์ข‹์€ ๋ณ‘๋ ฌ์€ ์•”์‹œ ์  ๋ฉค๋ฒ„ await ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ์ด๋™ํ•˜์—ฌ ๊ตฌ์กฐํ™”๋˜๊ณ ์ด ์ด๋™์€ ์•”์‹œ ์ ์œผ๋กœ ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ€์žฅ ๋œ ์‚ฐ๋ž€ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๊ฒŒ ํ˜ธ์ถœ์€ ํด๋กœ์ €์˜ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์„ ์–ธ์–ด ์ฝ”ํผ์Šค์— ๊ฐ€์žฅ ๊น”๋”ํ•˜๊ฒŒ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€๋งŒ (๊ตฌ๋ฌธ์—์„œ ํ˜•์‹์˜ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฐ€์žฅ ์œ ์‚ฌ ํ•จ) ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ธ์ •์  ์ธ ์ ์ด๋ฉฐ .await ๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๊ธธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@HeroicKatora libsyntax ์—์„œ foo.await(42) ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ .await ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ผ๊ด€์„ฑ์ด ์—†๊ฑฐ๋‚˜ ad-hoc์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ (foo.await)(42) ๋Š” ๋งˆ๊ฐ์„ ์ถœ๋ ฅํ•˜๋Š” ์„ ๋ฌผ์ด ์กด์žฌํ•˜๋Š” ๋™์•ˆ ๊ทธ๋‹ค์ง€ ํ”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์— ์ตœ์ ํ™”ํ•˜๋ฉด .await ์— () ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๊ท ํ˜•์„ ์ด๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Centril ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋น„์Šทํ•œ ํ–‰๋™์„ ๋ช‡ ๊ฐ€์ง€ ๋ณด๋ฉด ํ•ฉ์„ฑ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์ถ”๋ก ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ .await ์–ด์ƒ‰ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ํŠนํžˆ ์œ„์˜ ์˜ˆ๊ฐ€ ์•”์‹œ ์  ๋ถ„ํ•ด์™€ ์œ ์‚ฌํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค (์ด๋Ÿฌํ•œ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด?). Destructuring์„ ๋ณด๋ฉด ์ฆ‰์‹œ let-bindings ๋“ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๋ฉค๋ฒ„๊ฐ€์—†๋Š” ์›๋ž˜ ์œ ํ˜•์„ ํ•ด์ฒดํ•˜๊ฑฐ๋‚˜ ํŠนํžˆ ์œ ํ˜•์ด impl Future<Output=F> ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. await _ = ๋Œ€์‹ ์— let _ = , funnilyยน).

๊ทธ๋ ‡๋‹ค๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฐฐ์šฐ๋Š” ๋ฐ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์ตœ์ข…์ ์ธ ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์ง€๋ฉด ๊ทธ๊ฒƒ์„ ํ™œ๊ธฐ์ฐจ๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ช…๋ฐฑํ•œ ์•ฝ์ ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.


ยน ํŒจํ„ด์—์„œ ์ด๋ฆ„ ๋’ค์— ? ์„ ํ—ˆ์šฉํ•˜์—ฌ ? ๋ฅผ ํ—ˆ์šฉํ•˜๋ฉด์„œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • await value? = failing_future();

Result ์˜ Ok ๋ถ€๋ถ„๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ๋งฅ๋ฝ์—์„œ๋„ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กญ์ง€ ๋งŒ ์˜คํžˆ๋ ค ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋™์‹œ์— await ์— ๋Œ€ํ•œ ์ ‘๋‘์‚ฌ ๋ฐ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์„ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฐฐ์šฐ๋Š” ๋ฐ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์ตœ์ข…์ ์ธ ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์ง€๋ฉด ๊ทธ๊ฒƒ์„ ํ™œ๊ธฐ์ฐจ๊ฒŒ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ช…๋ฐฑํ•œ ์•ฝ์ ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ชจ๋“  ์†”๋ฃจ์…˜์ด ์–ด๋–ค ์ฐจ์›์ด๋‚˜ ์‚ฌ๋ก€์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ, ์ธ์ฒด ๊ณตํ•™, ์ฒด์ธ ๊ฐ€๋Šฅ์„ฑ, ๊ฐ€๋…์„ฑ, ... ์ด๋Š” ์ •๋„, ์‚ฌ๋ก€์˜ ์ค‘์š”์„ฑ, ์ผ๋ฐ˜์ ์ธ Rust ์ฝ”๋“œ ๋ฐ API์— ๋Œ€ํ•œ ์ ํ•ฉ์„ฑ ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ foo.await(42) ์“ฐ๋Š” ๊ฒฝ์šฐ ...

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

    foo.closure(42);
}

... ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ข‹์€ ์ง„๋‹จ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์„ foo.await(42) ์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋‹ฌ์„ฑ ๊ฐ€๋Šฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ œ๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ, foo.await(42) ๊ฐ€ ์“ฐ์—ฌ์งˆ ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ (foo.await)(42) ์˜๋„ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ MachineApplicable ์—์„œ cargo fix ed๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•. ์‹ค์ œ๋กœ foo.await ์•ˆ์ •ํ™”ํ•˜์ง€๋งŒ foo.await(42) ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ foo.await(42) ๊ฐ€ ์ฒ˜์Œ์—๋Š” ํ•ฉ๋ฒ•์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•  ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์ค‘์ฒฉ์ด ์ž‘๋™ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (์˜ˆ : ํ์‡„ ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜-์ผ๋ฐ˜์ ์ด์ง€ ์•Š์Œ).
```๋…น
struct HasClosure fn _foo ()-> ๊ฒฐ๊ณผ <(), ()> {
let foo : HasClosure <_ i = "27"> = HasClosure {ํด๋กœ์ € : Ok (| x | {})};

foo.closure?(42);

Ok(())

}

์˜ˆ : ํ์‡„ ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜-์ผ๋ฐ˜์ ์ด์ง€ ์•Š์Œ

์ถ”๊ฐ€ ์ ‘๋ฏธ์‚ฌ ? ์—ฐ์‚ฐ์ž๋Š” ๋ชจ๋“  ์ ‘๋ฏธ์‚ฌ ์˜ˆ์—์„œ ๊ตฌ๋ฌธ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ์ด๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์กฐ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค . ๋ฌธ์ œ๋Š” ๋ช…์‹œ ์ ์œผ๋กœ ํ•„๋“œ ์ธ .member ์™€ ๋จผ์ € ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด๋™-๊ตฌ์กฐ ๋ถ„ํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ด๊ฒƒ์ด ์“ฐ๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ์น˜๋กœ ๋ณ€ํ™˜ ๋  ์ˆ˜์žˆ๋Š” ๋‹ค๋ฅธ .member ์‚ฌ์šฉ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ํฌ์ŠคํŠธ๋Š” ๊ทธ ์ ์—์„œ ๊ธ์ •๊ณผ ๋ถ€์ •์— ๋ฌด๊ฒŒ๋ฅผ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : future.await(42) ์— ๋งž๊ฒŒ ์กฐ์ •ํ•˜๋ฉด ์˜๋„ํ•˜์ง€ ์•Š์€ ์ถ”๊ฐ€ ์œ„ํ—˜์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. b) ์šฐ๋ฆฌ๊ฐ€ await ๋…ผ์Ÿ์„์ฃผ๊ณ  ์žํ•˜๋Š” ๋ฏธ๋ž˜์˜ ๋ฐœ์ „์„ ์–ต์ œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Future ์กฐ์ •ํ•˜์—ฌ ๋งˆ๊ฐ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‹œ๊ธ‰ํ•œ ๋ฌธ์ œ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

@novacrazy ๋‹จ์ˆœํžˆ ์ผ๋ฐ˜ Future ๊ฒฐํ•ฉ

Futures 0.3์— ๋Œ€ํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒฝํ—˜์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Œ€๋Š” combinator๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ / ํŠน์ด ์  ์‚ฌ์šฉ์ด async / await ์ผ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Async / await๋Š” ์ปด๋น„ ๋„ค์ดํ„ฐ์— ๋น„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์ต๋ฅ  ํฌ์ธํŠธ์—์„œ ์ฐจ์šฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ฝค๋น„ ๋„ค์ดํ„ฐ๋Š” async / await ์˜ค๋ž˜ ์ „์— ์กด์žฌํ–ˆ์ง€๋งŒ, ์–ด์จŒ๋“  async / await๊ฐ€ ๋ฐœ๋ช…๋˜์—ˆ๊ณ  ๊ทธ๋Ÿด๋งŒ ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

Async / await๋Š” ์—ฌ๊ธฐ์— ๋‚จ์•„ ์žˆ์œผ๋ฏ€๋กœ ์ธ์ฒด ๊ณตํ•™์ ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋ฉ”์„œ๋“œ ์ฒด์ธ ํฌํ•จ).

๋ฌผ๋ก  ์‚ฌ๋žŒ๋“ค์€ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ฝค๋น„ ๋„ค์ดํ„ฐ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ข‹์€ ์ธ์ฒด ๊ณตํ•™์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@cramertj๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ํ† ๋ก ์€ async / await์˜ ๋Œ€์•ˆ์ด ์•„๋‹Œ async / await์— ์ดˆ์ ์„ ๋งž์ถ”๋„๋กํ•ฉ์‹œ๋‹ค.

์‹ค์ œ๋กœ ์‹คํŒจ์‹œ ๋ฐฑ์—… ๋™์ž‘์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ผ๋ถ€ ํ‘œํ˜„์‹์€ ๋Œ€๊ธฐ ์ฒด์ธ์œผ๋กœ ์ž˜ ๋ณ€ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ํฌ๊ฒŒ ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์ด๋ฅผ ํ†ตํ•ด ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์ •์ƒ์ ์ธ ํ–‰๋ณตํ•œ ๊ฒฝ๋กœ์—์žˆ๋Š” ๋ถ€๋ถ„์ด ๋ช…ํ™• ํ•ด์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ async / await์˜ ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค : ๋ฃจํ”„, ๋ธŒ๋žœ์น˜, match , ? , try ๋“ฑ ์–ธ์–ด์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๊ณผ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค await ํ•˜๊ณ  ์ด๊ฒƒ์€ Futures๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

or_else ์กฐํ•ฉ ์‚ฌ์šฉ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์„ฑํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ• :

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

value.unwrap()

๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋กœ ์ด๋™ํ•˜์—ฌ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

value.unwrap()

( @joshtriplett ์˜ ์˜๊ฒฌ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ž…๋‹ˆ๋‹ค ).

๋ช…ํ™•ํ•˜๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด, ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ๊ด„ํ˜ธ์—†์ด ์ฝ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค๋ผ๊ณ  ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์–ธ๊ธ‰, ๊ด„ํ˜ธ๋กœ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ด„ํ˜ธ๋Š” ์„ ํƒ ์ ์ธ ์Šคํƒ€์ผ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค (๋ณต์žกํ•œ ํ•œ ์ค„์งœ๋ฆฌ์—๋งŒ ์œ ์šฉํ•จ).

์–ด๋–ค ์ƒํ™ฉ์—์„œ ๊ด„ํ˜ธ์˜ ๊ตฌ๋ฌธ ํ˜œํƒ์˜ ๋ชจ๋“ ๋Š” ๊ตฌ๋ฌธ์˜ ์•„๋ฌด๋„ ์šฐ๋ฆฌ๊ฐ€์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ํ•  ๊ฒฝ์šฐ์˜ ์งˆ๋ฌธ, ์™„๋ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ๋‹ค์‹œ ์ฝ์€ ํ›„, ์ œ๊ฐ€ await ์ ‘๋‘์‚ฌ๋ฅผ ์˜นํ˜ธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜๋‹ค. ๋‚ด ์˜ˆ์ œ๋Š” await ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋‚˜๋Š” ์ „์ฒด์ ์œผ๋กœ await ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” fut.await ์— ์ต์ˆ™ํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์˜ ์ดˆ๊ธฐ ๋ฐ˜์‘์€ "์ž ๊น, ๊ทธ๊ฒŒ ๋‹น์‹ ์ด ๊ธฐ๋‹ค๋ฆด ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š”? ์ด์ƒ ํ•ด์š”."๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜์ค‘์— ๊ทธ๋“ค์€ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๊ฐ™์€ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค @await ๋” ์ด์ƒ ๋ˆˆ์— ๋„๋Š”, .await .

์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ œ์—์„œ ๋ช‡ ๊ฐ€์ง€ let์„ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

์ด๊ฒƒ์€ ๋˜ํ•œ ? ์–ธ ๋ž˜ํ•‘๋˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค. await some_op()? ์˜ ๊ฒฝ์šฐ some_op() ์ด ์–ธ ๋ž˜ํ•‘๋˜๋Š”์ง€ ๋˜๋Š” ๊ธฐ๋‹ค๋ฆฐ ๊ฒฐ๊ณผ์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŒŒ์šฐ ์•ˆ

์ €๋Š” ์—ฌ๊ธฐ์„œ ์ฃผ์ œ์—์„œ ์ดˆ์ ์„ ์˜ฎ๊ธฐ๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์ด ๊ฑฐํ’ˆ ์†์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ƒ์ ์ธ ๊ตฌ๋ฌธ์„ ์„ ํƒ ํ–ˆ๋”๋ผ๋„ ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” ์ปค์Šคํ…€ ํ“จ์ฒ˜์™€ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์€ Rust์˜ ์ „์ฒด ๋ฐฉํ–ฅ์— ์˜๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์ œ๊ณตํ•˜๋Š” ์˜ˆ์ œ๋Š” ๊ฒฐํ•ฉ ์ž์— ๋น„ํ•ด ์—ฌ์ „ํžˆ ๋”์ฐํ•ด ๋ณด์ด๋ฉฐ ์ƒ์„ฑ๊ธฐ ์˜ค๋ฒ„ ํ—ค๋“œ๋กœ ์ธํ•ด ์•„๋งˆ๋„ ์•ฝ๊ฐ„ ๋Š๋ฆฌ๊ณ  ๋” ๋งŽ์€ ๊ธฐ๊ณ„ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋‹ค๋ฆฌ๋Š” ํ•œ,์ด ๋ชจ๋“  ์ ‘๋‘์‚ฌ / ์ ‘๋ฏธ์‚ฌ์‹œ๊ธธ / ํ‚ค์›Œ๋“œ ์ž์ „๊ฑฐ ์‰๋”ฉ์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์‹ค์šฉ์ ์ด๊ณ  Rust์— ์˜ค๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ์นœ์ˆ™ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. IE : ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ

์˜ฌํ•ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋นจ๋ฆฌ ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 1 ์›”๋„ ๋Œ€๋ถ€๋ถ„ ๋๋‚ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์ง€๋ฉด 2019/2020 ์—๋””์…˜์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” "๋Œ์•„์˜จ ๊ฒƒ์€ 2020 ๋…„์ด๋‹ค"๋ผ๋Š” ๋†๋‹ด์„ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—‰ํ—‰

์ œ๊ฐ€ ๋ณธ ์ผ๋ฐ˜์ ์ธ ํ•ฉ์˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ œ 3 ํŒ์„ ์›ํ•  _ ๊ฐ€์žฅ ์ด๋ฅธ _ ๊ฒƒ์€ 2022 ๋…„์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ถ„๋ช…ํžˆ ๋‹ค๋ฅธ ํŒ์„ ๊ณ„ํšํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 2018 ๋…„ํŒ์€ ํ›Œ๋ฅญํ–ˆ์ง€๋งŒ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (2018 ๋…„ ์—๋””์…˜์˜ ์š”์  ์ค‘ ํ•˜๋‚˜๋Š” async / await๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ๊ฐ€์ ธ ์™€์„œ "์•„๋‹ˆ์š”, ์ง€๊ธˆ 2020 ๋…„ ์—๋””์…˜์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!"๋ผ๊ณ  ์ƒ์ƒํ•ด๋ณด์„ธ์š”.)

์–ด์จŒ๋“  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฐ”๋žŒ์ง ํ• ์ง€๋ผ๋„ ์—๋””์…˜์—์„œ ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ-> ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—๋””์…˜์— ๋Œ€ํ•œ ๊ทœ์น™์€ ์—๋””์…˜ X์—์„œ ๊ฒฝ๊ณ ์—†์ด ์ปดํŒŒ์ผ๋˜๊ณ  ์—๋””์…˜ X + 1์—์„œ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ๊ด€์šฉ์  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ์ด๋Œ์–ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ‚ค์›Œ๋“œ ๋งคํฌ๋กœ๋กœ ์•ˆ์ •ํ™”ํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๊ฒƒ๋„ ๊ฐ™์€ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ ์žˆ๋Š” ์†”๋ฃจ์…˜์„ ๊ณ ์˜์ ์œผ๋กœ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋Œ€๊ธฐ ์ง€์ ์ด ํ•˜๋‚˜ ๋ฟ์ธ ์‹์˜ ๊ฒฝ์šฐ์—๋„ ์ ‘๋ฏธ์‚ฌ ์†”๋ฃจ์…˜์ด ๋” ์ตœ์ ์ž„์„ ๋ณด์—ฌ์ค€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ์•ˆ ๋œ ์ ‘๋ฏธ์‚ฌ ์†”๋ฃจ์…˜์ด ๋‹ค๋ฅธ ๋ชจ๋“  ์†”๋ฃจ์…˜๋ณด๋‹ค ๋ถ„๋ช…ํžˆ ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด 2 ์„ผํŠธ ๋งŒ (๋‚˜๋Š” ์•„๋ฌด๋„ ์•„๋‹ˆ์ง€๋งŒ ๊ฝค ์˜ค๋žซ๋™์•ˆ ํ† ๋ก ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค). ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์†”๋ฃจ์…˜์€ @await postfix ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์€ ์ ‘๋ฏธ์‚ฌ !await ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ:

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

๋ช‡ ๋ฒˆ์˜ ์–ธ์–ด ๋ฐ˜๋ณต ํ›„์— ์šฐ๋ฆฌ ์ž์‹ ์˜ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋Œ€๋‹จ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

... ๋ชจ๋“  ์ƒˆ๋กœ์šด sygils ์ œ์•ˆ

Rust๋Š” ์ด๋ฏธ ๊ตฌ๋ฌธ / sygil ๋ฌด๊ฒ๊ณ , await ํ‚ค์›Œ๋“œ๊ฐ€ ์˜ˆ์•ฝ๋˜์–ด ์žˆ๊ณ , stuff@await (๋˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  sygil)์ด ์ด์ƒํ•˜๊ณ  ๋ชป ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค (์ฃผ๊ด€์ ์ž…๋‹ˆ๋‹ค). ํฐ ์œ„ํ—˜ ์‹ ํ˜ธ ์ธ ์–ธ์–ด์˜ ๋‹ค๋ฅธ ์–ด๋–ค ๊ฒƒ๊ณผ๋„ ํ†ตํ•ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Go๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ์‚ดํŽด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.
... <-... ์ œ์•ˆ

@ I60R : Go๋Š” ์ž„์‹œ ์†”๋ฃจ์…˜์œผ๋กœ ๊ฐ€๋“ ์ฐฌ ๋”์ฐํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ Rust์™€๋Š” ๋‹ฌ๋ฆฌ ์™„์ „ํžˆ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ ๋‹ค์‹œ sygil / syntax ๋ฌด๊ฒ๊ณ ์ด ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ์ž„์‹œ์ ์ž…๋‹ˆ๋‹ค.

@ I60R : Go์—๋Š” ๋”์ฐํ•œ ๊ตฌ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ๊ฐ•ํƒ€ํ•˜์ง€ ์•Š๋„๋กํ•ฉ์‹œ๋‹ค. "X๋Š” ๋”์ฐํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค"๋Š” ๊นจ๋‹ฌ์Œ๊ณผ ํ•ฉ์˜๋กœ ์ด์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Python / JavaScript / Rust ์‚ฌ์šฉ์ž์ด์ž ์ปดํ“จํ„ฐ ๊ณผํ•™ ํ•™์ƒ์œผ๋กœ์„œ ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์ ‘๋‘์–ด await + f.await() ๋‘˜ ๋‹ค ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

  1. Python๊ณผ JavaScript ๋ชจ๋‘ ์ ‘๋‘์‚ฌ await ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์— await ๋‚˜ํƒ€๋‚  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ธฐ ์œ„ํ•ด ์ค„์„ ๊นŠ์ˆ™์ด ์ฝ์–ด์•ผํ•œ๋‹ค๋ฉด ๋งค์šฐ ๋ถˆ์•ˆํ•ฉ๋‹ˆ๋‹ค. Rust์˜ WASM ๊ธฐ๋Šฅ์œผ๋กœ ๋งŽ์€ JS ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ์–ด๋“ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Rust๊ฐ€ ์ด๋ฏธ ๋งŽ์€ ์ƒˆ๋กœ์šด ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ ์นœ์ˆ™ ํ•จ ๊ณผ ํŽธ์•ˆํ•จ ์ด ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  2. ์ ‘๋ฏธ์‚ฌ await ๋Š” ์—ฐ๊ฒฐ ์„ค์ •์—์„œ ํŽธ๋ฆฌํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ .await , @await , f await ๊ฐ™์€ ์†”๋ฃจ์…˜์€ await ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ž„์‹œ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ .await() ์—์„œ future ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Rust๋Š” ์ด๋ฏธ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฒ—์–ด ๋‚ฌ๊ณ  await๋Š” await๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ์ „ํ˜€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค (์ฆ‰, ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ์—๋ฎฌ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์—†์Œ). ๋”ฐ๋ผ์„œ ๊ตฌ๋ฌธ์ด ๋‹ฌ๋ผ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” .await() ์ด ์•„๋งˆ๋„ .await ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ํ™•์‹ ํ–ˆ์ง€๋งŒ,์ด ํฌ์ŠคํŠธ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ๊ทธ ํฌ์ง€์…˜์„ ์•ฝ๊ฐ„ ํ—ค์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” await!(fut) ์ด _ ๊ฐ€์น˜๋กœ fut ๋ฅผ ์†Œ๋น„ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค _. ํ•„๋“œ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒํ•˜๋Š” ๊ฒƒ์€ _bad_์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋™ํ•œ๋‹ค๋Š” ์˜๋ฏธ ๋‚˜ ๋งคํฌ๋กœ ๋‚˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ์ด๋™ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ํ‚ค์›Œ๋“œ ๋ฉ”์„œ๋“œ ๊ตฌ๋ฌธ์€ ๊ฑฐ์˜ ์•”์‹œ ์  ๋Œ€๊ธฐ ๋””์ž์ธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ "๋ช…์‹œ ์  ๋น„๋™๊ธฐ, ์•”์‹œ ์  ๋Œ€๊ธฐ"๋Š” Rust์— ๋Œ€ํ•ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค์‹œ ์†Œ์†ก์„ ์ œ๊ธฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค). async fn() -> T ์ด fn() -> Future<T> ์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. "์•”์‹œ ์  ๋Œ€๊ธฐ"๋™์ž‘์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค

.await() ๊ตฌ๋ฌธ์ด ์•”์‹œ ์  ๋Œ€๊ธฐ ์‹œ์Šคํ…œ (์˜ˆ : Kotlin ์‚ฌ์šฉ)์ฒ˜๋Ÿผ _looks_ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋น„๋ฐฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ๋งˆ๋ฒ•์œผ๋กœ ์ธํ•ด ๊ฑฐ์˜ "์•”์‹œ ์  ๋น„๋™๊ธฐ, ์•”์‹œ ์  ๋Œ€๊ธฐ"์˜ ๋Š๋‚Œ์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. really-a-method-call .await() ๊ตฌ๋ฌธ. UFCS์—์„œ await(fut) ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? UFCS์˜ ๊ฒฝ์šฐ Future::await(fut) ์ž…๋‹ˆ๊นŒ? ์–ธ์–ด์˜ ๋‹ค๋ฅธ ์ฐจ์›์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ชจ๋“  ๊ตฌ๋ฌธ์€ ๊ธฐ๋Šฅ์ ์œผ๋กœ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ ์–ด๋„ ๊ตฌ๋ฌธ ์ ์œผ๋กœ ํ†ต์ผ ๋  ์ˆ˜ ์—†๋‹ค๋ฉด ๋ฌธ์ œ๋ฅผ ์ผ์œผ ํ‚ต๋‹ˆ๋‹ค.

์ ‘๋‘์‚ฌ ์†”๋ฃจ์…˜์˜ ๊ฐœ๋…์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ ‘๋‘์‚ฌ๋ณด๋‹ค ๋” ๋ฐ”๋žŒ์งํ•˜์ง€๋งŒ _individual_ postfix ์†”๋ฃจ์…˜์˜ ์ด์ ์ด ๋™์ผํ•œ ์†”๋ฃจ์…˜์˜ ๋‹จ์ ์„ ๋Šฅ๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์ดˆ๊ธฐ ์ œ์•ˆ์— ๋น„ํ•ด ์ƒ๋‹นํ•œ ์ด์ ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ๋“ค์–ด์ง„ ์ œ์•ˆ์œผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์— ์•ฝ๊ฐ„ ๋†€๋ž์Šต๋‹ˆ๋‹ค.
$ , # , @ , ! , ~ ๋“ฑ์— ๋Œ€ํ•ด ์ค‘์š”ํ•œ ๋…ผ๊ฑฐ์—†์ด ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ๊ทธ๋งŒ ๋‘˜ ์ˆ˜ ์žˆ์„๊นŒ์š”? await ์œผ๋กœ ์ž˜ ์ดํ•ด๋˜๊ณ  ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ž…์ฆ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

https://github.com/rust-lang/rust/issues/57640#issuecomment -455361619์˜ ๊ฒŒ์‹œ๋ฌผ์— ์ด๋ฏธ ๋ชจ๋“  ์ข‹์€ ์˜ต์…˜์ด ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋กœ๋ถ€ํ„ฐ :

  • ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋Š” ๊ดœ์ฐฎ์•„ ๋ณด์ด์ง€๋งŒ ์ ์–ด๋„ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋ฌด์—‡์ธ์ง€๋Š” ๋ถ„๋ช…ํ•˜๋ฉฐ ๋” ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‘ ๊ฐœ์˜ ๊ด„ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋‹จ์ ์€ ์ œ์–ด ํ๋ฆ„ ์ž‘์—…์ด ๋‹ค๋ฅด๋”๋ผ๋„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋ฐ”๋žŒ์งํ•œ ์˜ต์…˜ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๊ฐ”๋˜ ๊ธธ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ์นœ์ˆ™ํ•˜๊ณ  ์ž…์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ์ธ์ ์œผ๋กœ ๊ณต๋ฐฑ์ด์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฌธ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์ด์ƒํ•ด ๋ณด์ธ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
    client.get("url").send() await?.json()? ๊ทธ ์‚ฌ์ด์˜ ๊ณต๋ฐฑ์€ ์ œ์ž๋ฆฌ์—์„œ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด (client.get("url").send() await)?.json()? ๊ฐ€ ์ข€ ๋” ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ทธ๋Ÿฌ๋‚˜ ์ œ์–ด ํ๋ฆ„์€ ์ ‘๋‘์‚ฌ ๋ณ€ํ˜•๋ณด๋‹ค ๋”ฐ๋ฅด๊ธฐ๊ฐ€ ์—ฌ์ „ํžˆ ๋” ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ์ ‘๋ฏธ์‚ฌ ํ•„๋“œ๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. await ์€ ๋งค์šฐ ๋ณต์žกํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. Rust์—๋Š” ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•œ ์†์„ฑ์ด ์—†์œผ๋ฉฐ ํ•„๋“œ ์•ก์„ธ์Šค๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ์ž‘์—…์˜ ๋ณต์žก์„ฑ์— ๋Œ€ํ•ด ์ž˜๋ชป๋œ ์ธ์ƒ์„์ฃผ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • Postfix ๋ฐฉ๋ฒ•์€ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ awaits๊ฐ€์žˆ๋Š” ๋งค์šฐ ๊ธด ๋ฌธ์žฅ์„ ์ž‘์„ฑํ•˜๋„๋ก ์žฅ๋ คํ•˜์—ฌ ์ˆ˜์ต๋ฅ  ํฌ์ธํŠธ๋ฅผ ๋” ์ˆจ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ญ”๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๋‹ค์‹œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์ €๋Š” "์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„"๋‹ค์Œ์— "ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ"๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

Go๋Š” ์ž„์‹œ ์†”๋ฃจ์…˜์œผ๋กœ ๊ฐ€๋“ ์ฐฌ ๋”์ฐํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ Rust์™€๋Š” ๋‹ฌ๋ฆฌ ์™„์ „ํžˆ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ ๋‹ค์‹œ sygil / syntax ๋ฌด๊ฒ๊ณ ์ด ํŠน์ • ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ์ž„์‹œ์ ์ž…๋‹ˆ๋‹ค.

@dpc , <-- ์ œ์•ˆ์„œ๋ฅผ ์™„์ „ํžˆ ์ฝ์œผ๋ฉด์ด ๊ตฌ๋ฌธ์€ Go์—์„œ๋งŒ ์˜๊ฐ์„ ์–ป์—ˆ์ง€๋งŒ ๋ช…๋ นํ˜• ๋ฐ ํ•จ์ˆ˜ ์ฒด์ธ ์ปจํ…์ŠคํŠธ์—์„œ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๋ฉฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ await ๊ตฌ๋ฌธ์ด ์ž„์‹œ ์†”๋ฃจ์…˜์ด ์•„๋‹Œ ๋ฐฉ๋ฒ•์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ €์—๊ฒŒ๋Š” <-- ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๊ตฌ์ฒด์ ์ด๊ณ  ์–ด์„คํ”ˆ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. *reference ๋Œ€์‹  deref reference / reference.deref / etc๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ result? ๋Œ€์‹  try result / result.try / etc๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค *reference result? . ์–ด์จŒ๋“  ์ผ๊ด€์„ฑ ์žˆ๊ณ  ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ–๋Š” ๊ฒƒ๋ณด๋‹ค ๋œ ์ค‘์š”ํ•ด์•ผํ•˜๋Š” JS / Python / etc์— ์ต์ˆ™ํ•œ ๊ฒƒ ์™ธ์—๋Š” await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ์ด์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  <-- ์‹œ๊ธธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ๋‹จ์ ์€ await ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํ‰๋ฒ”ํ•œ ์˜์–ด๋งŒํผ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์œผ๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ๋จผ์ € ๋ฌด์—‡์„ํ•˜๋Š”์ง€ ์ดํ•ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์ด๊ฒƒ์€ await ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์žฅ์„ ์ œ๊ณตํ•˜๊ณ  ๋™์ผํ•œ ๋ฌธ์ œ๋กœ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š๋Š” ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์„ ์ œ์•ˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— @ Matthias247 ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ์ข‹์€ ๋‹ต๋ณ€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์—ญ์‚ฌ์  ์ด์œ ์™€ ํŽธ๊ฒฌ์— ํ˜ธ์†Œํ•˜๋Š” ์ฃผ์žฅ์ด์—†๋Š” <-- ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋น„ํŒ์„ ์ฝ๋Š” ๊ฒƒ์€ ์ •๋ง ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค.

์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•œ ์‹ค์ œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์–ธ๊ธ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜๋‚  ์˜ ์šฐ์„  ์ˆœ์œ„ ์ฐจํŠธ :

์—ฐ์‚ฐ์ž / ํ‘œํ˜„ | ์—ฐ๊ด€์„ฑ
-| -
๊ฒฝ๋กœ |
๋ฉ”์„œ๋“œ ํ˜ธ์ถœ |
ํ•„๋“œ ํ‘œํ˜„์‹ | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
ํ•จ์ˆ˜ ํ˜ธ์ถœ, ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ |
? |
๋‹จํ•ญ - * ! & &mut |
as | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
* / % | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
+ - | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
<< >> | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
& | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
^ | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
\| | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
== != < > <= >= | ๊ด„ํ˜ธ ํ•„์š”
&& | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
\|\| | ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ
.. ..= | ๊ด„ํ˜ธ ํ•„์š”
= += -= *= /= %= &= \|= ^= <<= >>= | ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ
return break ํ์‡„ |

์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„๋Š” await ์•ž์— ? ๋‘์–ด ? ๋ณด๋‹ค ๋” ๋‹จ๋‹จํžˆ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒด์ธ์˜ ? ๋Š”`await๋ฅผ ์ด์ „์˜ ๋ชจ๋“  ๊ฒƒ์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

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

์˜ˆ, ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„๋กœ "๊ทธ๋ƒฅ ์ž‘๋™"ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ญ”์ง€ ํ•œ ๋ˆˆ์— ์•Œ์•„? (์•„๋งˆ๋„) ๋‚˜์œ ์Šคํƒ€์ผ์ธ๊ฐ€์š”? ๊ทธ๋ ‡๋‹ค๋ฉด rustfmt๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„๋Š” await _somewhere_๋ฅผ ? ์•„๋ž˜์— ๋‘ก๋‹ˆ๋‹ค. ๊ทธ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์•„๋งˆ๋„๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์ •ํ™•ํžˆ ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๊ฒŒ ๋ญ”์ง€ ํ•œ ๋ˆˆ์— ์•Œ์•„? rustfmt๋Š” ์ž๋™์œผ๋กœ ์ˆ˜์ง ๋ฐ ์ˆ˜ํ‰ ๊ณต๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๋Š” ์œ ์šฉํ•œ ์Šคํƒ€์ผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?


์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ๋Š” ์–ด๋””์— ์†ํ•ฉ๋‹ˆ๊นŒ? ์•„๋งˆ๋„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด์žˆ๋Š” ํ‚ค์›Œ๋“œ ๋ฉ”์„œ๋“œ์™€ ํ•„๋“œ์‹์ด์žˆ๋Š” ํ‚ค์›Œ๋“œ ํ•„๋“œ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฐ”์ธ๋”ฉํ•ด์•ผํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. await ๊ฐ€ ๋†€๋ผ์šด "์ธ์ˆ˜"๋ฅผ๋ฐ›๋Š” ์ƒํ™ฉ์—์„œ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ๊ตฌ์„ฑ์œผ๋กœ ์ด์–ด์ง€๋Š” ์˜ต์…˜์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๋น„๊ต๋ฅผ ์œ„ํ•ด "ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ"( ์š”์•ฝ ์—์„œ ํ‚ค์›Œ๋“œ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅธ

@ CAD97 ๋ช…ํ™•ํ•˜๊ฒŒ .json() ๋„ ๋ฏธ๋ž˜๋ผ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค (์ ์–ด๋„ reqwests ).

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

๋‚ด๊ฐ€ ๋” ๋ณต์žกํ•œ ๋…น ํ‘œํ˜„์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์žฌ์ƒ (1 await๋ฅผ ๋งŒ ํ•„์š”๋กœ ์‹ฌ์ง€์–ด ์‚ฌ๋žŒ์„ํ•˜์ง€๋งŒ, ๋‚ด 20,000 ๋ฏธ๋ž˜์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๊ฑฐ์˜ ๋ชจ๋“  ๋‹จ์ผ ๋น„๋™๊ธฐ ์‹์„ ์ง์ ‘ ๋‹ค๋ฅธ await๋ฅผ ๋’ค์— ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๊ฒƒ์„ ์ฃผ), ๋” ๋‚ด๊ฐ€ ์‹ซ์–ด Rust์˜ ์ ‘๋‘์‚ฌ.

? ์—ฐ์‚ฐ์ž ๋•Œ๋ฌธ์— _all_์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ญ์ƒ ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์Œ์„ ์ด๋ฃจ๋Š” ์ ‘๋ฏธ์‚ฌ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž _and_ await ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.


๋‚ด ์„ ํ˜ธ๋Š” ์—ฌ์ „ํžˆ postfix ํ•„๋“œ ์ž…๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ ์ œ์–ด ์—ฐ์‚ฐ์ž๋กœ์„œ future.await ๊ฐ€ future await ์ด์ƒ ์ œ๊ณตํ•˜๋Š” ์—„๊ฒฉํ•œ ์‹œ๊ฐ์  ๊ทธ๋ฃนํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  .await()? ๊ณผ ๋น„๊ตํ•˜๋ฉด .await? _weird_ ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜๋ฏ€๋กœ _noticed_ํ•˜๊ณ  ์‚ฌ์šฉ์ž๋Š” ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ UFCS๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ๋ฌป์ง€ ์•Š์Šต๋‹ˆ๋‹ค). .


์ด ์•ˆ์ •๋˜์–ด ํ›„์œ„์— ์ฐฌ์„ฑ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์™€ ๊ฐ™์€ rustfix ์—์„œ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค await!(...) ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ๊ทน๋ช…ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค ๊ฒฐ์ • ๋ฌด์—‡ ์ด๊ฑด. ํ•„์ž๋Š” ( ... ) ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํ•ญ๋ชฉ์„ ๋ž˜ํ•‘ํ•˜์ง€ ์•Š๊ณ  ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์„ ๋ชจํ˜ธํ•˜์ง€ ์•Š๊ฒŒ ๋ฒˆ์—ญ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋จผ์ € "์—ฐ์‡„ ์ปจํ…์ŠคํŠธ์—์„œ await ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์— ๋‹ตํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋Œ€๋‹ต์ด "์˜ˆ"๋ผ๊ณ  ๋ฏฟ๊ธฐ ๋•Œ๋ฌธ์— ํ›„์œ„ ๋ณ€ํ˜•์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ด๋ฉ๋‹ˆ๋‹ค. await!(..) ์ด ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ try!(..) ์ด์•ผ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ "์ฒด์ธ์€ ์ž ์žฌ์ ์œผ๋กœ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์„ ์ˆจ๊ธด๋‹ค"๋Š” ์ฃผ์žฅ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ _ ๋งค์šฐ _ ๋ฌด๊ฑฐ์šธ ์ˆ˜์žˆ๋Š” ๋งŽ์€ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์—ฐ๊ฒฐ์€ ๊ฒŒ์œผ๋ฆ„์„ ์ˆ˜๋ฐ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ ‘๋‘์‚ฌ await ํ‚ค์›Œ๋“œ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ€์žฅ ์นœ์ˆ™ํ•œ ํ‚ค์›Œ๋“œ์ด์ง€๋งŒ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ์ง€ ์•Š๊ณ  ๋Œ€์‹  ์‚ฌ์šฉ์„ฑ, ํŽธ์˜์„ฑ ๋ฐ ๊ฐ€๋…์„ฑ๊ณผ ๊ฐ™์€ ์žฅ๊ธฐ์— ์ง‘์ค‘ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. . @withoutboats ๋Š” "์ต์ˆ™ํ•œ ์˜ˆ์‚ฐ"์—

์ด์ œ ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ๊ฐ™์€ ์ผ์„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฏ€๋กœ ์ ‘๋ฏธ์‚ฌ์™€ ์ ‘๋‘์‚ฌ ๋ณ€ํ˜•์„ ๋ชจ๋‘ ๋„์ž…ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜ต์…˜์„ ์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜•์œผ๋กœ ์ขํ˜”๋‹ค ๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € fut await ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.์ด ๋ณ€ํ˜•์€ ์‚ฌ๋žŒ์ด ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค๊ณ  ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๋™์•ˆ ์ง€์†์ ์ธ ํ˜ผ๋ž€์˜ ์›์ธ์ด ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—์ด ๋ณ€ํ˜•์„ ๋งค์šฐ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. (์ฝ”๋“œ๋Š” ๋Œ€๋ถ€๋ถ„ ์ฝ๊ธฐ ์šฉ์ด๋ผ๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค)

๋‹ค์Œ fut.await , fut.await() ๋ฐ fut.await!() . ๊ฐ€์žฅ ์ผ๊ด€๋˜๊ณ  ๋œ ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ณ€ํ˜•์€ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐœ์˜ ๋ฌธ์ž๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด "ํ‚ค์›Œ๋“œ ๊ธฐ๋Šฅ"๋˜๋Š” "ํ‚ค์›Œ๋“œ ๋ฐฉ๋ฒ•"์—”ํ‹ฐํ‹ฐ๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ์‹œ๊ธธ ๊ธฐ๋ฐ˜ ๋ณ€ํ˜• : fut@await ๋ฐ fut@ . fut@await ๋ณ€ํ˜•์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์‹œ๊ธธ์„ ์†Œ๊ฐœํ•˜๋ฉด await ๋ถ€๋ถ„์ด ์™œ ๊ท€์ฐฎ์„๊นŒ์š”? ํ–ฅํ›„ ํ™•์žฅ fut@something ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋‹จ์ˆœํžˆ ์ค‘๋ณต ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” fut@ ๋ณ€ํ˜•์„ ์ข‹์•„ํ•˜๊ณ  ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์“ฐ๊ณ , ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ๋Š” ์ฝ”๋“œ ๊ฐ•์กฐ ํ‘œ์‹œ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ "@ for await"๋กœ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ ๋งค์šฐ ์ œํ•œ๋œ "์‹œ๊ธธ ์˜ˆ์‚ฐ"์œผ๋กœ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋น„์šฉ์„ ์ง€๋ถˆํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์˜ ์ค‘์š”์„ฑ๊ณผ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š”์ง€๋ฅผ ๊ณ ๋ คํ•  ๋•Œ ์žฅ๊ธฐ์ ์œผ๋กœ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. . ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” ? ๋กœ ํŠน์ • ์œ ์‚ฌ์ ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์šฐ๋ฆฌ๋Š” Rust ๋น„ํ‰๊ฐ€๋“ค์˜ Perl ๋†๋‹ด์— ๋Œ€๋น„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.)

๊ฒฐ๋ก  : ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” "์‹œ๊ธธ ์˜ˆ์‚ฐ"์„ ๋ถ€๋‹ด ํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์œผ๋ฉด fut@ ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ fut.await!() ํ•ฉ๋‹ˆ๋‹ค.

์นœ์ˆ™ํ•จ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•  ๋•Œ, Rust๋Š” ๋‹ค๋ฅธ ํ‹ˆ์ƒˆ ์‹œ์žฅ์— ์žˆ๊ณ  ์ด๋ฏธ ๋งŽ์€๋ฉด์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— JS / Python / C #์— ๋Œ€ํ•œ ์นœ์ˆ™ํ•จ์— ๋„ˆ๋ฌด ์‹ ๊ฒฝ์„ ์จ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์–ธ์–ด์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋‹จ๊ธฐ์ ์ด๊ณ  ๋‚ฎ์€ ๋ณด์ƒ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ํ›„๋“œ ์•„๋ž˜์—์„œ ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ ํ•  ๋•Œ ์ต์ˆ™ํ•œ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ Rust๋ฅผ ์„ ํƒํ•˜๋Š” ์‚ฌ๋žŒ์€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Go์— ๋Œ€ํ•œ ์นœ์ˆ™ ํ•จ์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋น„์Šทํ•œ ํ‹ˆ์ƒˆ ์‹œ์žฅ์— ์žˆ๊ณ  ์ฒ ํ•™์ ์œผ๋กœ๋„ ๋‹ค๋ฅธ ์–ธ์–ด๋ณด๋‹ค Go์— ๋” ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ํŽธ๊ฒฌ์— ์ฐฌ ์ฆ์˜ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๋‘˜ ๋‹ค์˜ ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ๊ธฐ๋Šฅ์„ ๋งน๋ชฉ์ ์œผ๋กœ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ง„์ • ์ด์œ ๊ฐ€์žˆ๋Š” ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

IMO, ์ด๋Ÿฐ ์˜๋ฏธ์—์„œ <-- ๊ตฌ๋ฌธ์ด ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  Rust ํ‘œํ˜„์‹์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—ฐ๊ฒฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ฉ์‹œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

C # ๊ฐœ๋ฐœ ํŒ€ ๊ฒฝํ—˜์„ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

C # ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ฃผ์š” ๊ณ ๋ ค ์‚ฌํ•ญ์€ ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„ await foo?

์ด๊ฒƒ์€ ์ œ๊ฐ€ ์–ธ๊ธ‰ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. 'await'๋กœ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๊ณ  ์›ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์ „์— ์—ฌ๋Ÿฌ ํ˜•ํƒœ๋ฅผ ์‹œ๋„ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ฐœ๊ฒฌ ํ•œ ํ•ต์‹ฌ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” ์šฐ๋ฆฌ์™€์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๊ณ ๊ฐ (๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€)์—๊ฒŒ, ์‚ฌ๋žŒ๋“ค์ด ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์ดํ›„์˜ ๋ชจ๋“  ๊ฒƒ์„ ์‹ค์ œ๋กœ '์ฒด์ธ'ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

expr ๋‚ด๋ถ€์—์„œ 'await'๋กœ '๊ณ„์†'ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝํ–ฅ์€ ๋“œ๋ญ…๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ (await expr) .M ()๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ณด์ง€๋งŒ, await expr.M ()์„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์–‘๋ณด๋‹ค ๋œ ์ผ๋ฐ˜์ ์ด๊ณ  ๋œ ๋ฐ”๋žŒ์งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ณผ

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ 'await'์— ๋Œ€ํ•ด '์•”์‹œ ์ 'ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ด์œ ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ๊ณ , ์ฝ”๋“œ์—์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ์˜ ์ „๋ฉด ์ค‘์•™์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„, ์‹ฌ์ง€์–ด ๋ช‡ ๋…„์ด ์ง€๋‚œ ํ›„์—๋„ ์ด๋Ÿฌํ•œ ๊ฒฝํ–ฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋•Œ๋•Œ๋กœ ์šฐ๋ฆฌ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์žฅํ™ฉํ•œ ๊ฒƒ์„ ๋ช‡ ๋…„ ํ›„ ํ›„ํšŒํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ์ข‹์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์ต์ˆ™ํ•ด์ง€๋ฉด ๋” ๊ฐ„๊ฒฐํ•œ ๊ฒƒ์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. 'await'๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ทธ ํ‚ค์›Œ๋“œ์˜ ๋ฌด๊ฑฐ์šด ํŠน์„ฑ๊ณผ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ •๋ง ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ „์šฉ (ํ‚ค) ๋‹จ์–ด ๋Œ€์‹ ์‹œ๊ธธ์— ๋Œ€ํ•œ ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค.

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

์ˆ˜๋ฐฑ๋งŒ ๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๋ง์„ ์ •๋ง๋กœ ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์–ด๋–ค ๊ฒƒ๋„ ์—ฐ๊ฒฐํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ณ  await ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์›ํ•˜๋ฉฐ ๋‚ด ๊ฒฝํ—˜์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. 6 ๋…„ ๋„˜๊ฒŒ async/await ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ๊ทธ๋Ÿฐ ๊ธฐ๋Šฅ์„ ์›ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Postfix ๊ตฌ๋ฌธ์€ ์ •๋ง ๋‚ฏ์„ค์–ด ๋ณด์ด๋ฉฐ ๊ฒฐ์ฝ” ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. Async ํ†ตํ™”๋Š” ์ •๋ง ๋Œ€๋‹ดํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ํ•œ ์ค„๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค.

expr ๋‚ด๋ถ€์—์„œ 'await'๋กœ '๊ณ„์†'ํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฝํ–ฅ์€ ๋“œ๋ญ…๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ (await expr) .M ()๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ณด์ง€๋งŒ, await expr.M ()์„ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์–‘๋ณด๋‹ค ๋œ ์ผ๋ฐ˜์ ์ด๊ณ  ๋œ ๋ฐ”๋žŒ์งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์‚ฌํ›„ ๋ถ„์„์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๊ณ„์†ํ•˜์ง€ ์•Š๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์—์„œ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( ? ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ฝ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์—์„œ try! ์—ฌ๋Ÿฌ ๋ฒˆ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ? ). ์œ„์˜ ๋‚ด์šฉ์€ ๋Œ€๋ถ€๋ถ„ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  C #์€ Rust๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ํŠธ๋ ˆ์ด ํŠธ ๋ฉค๋ฒ„๋Š” ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋Š” ์š•๊ตฌ๋ฅผ ์ƒ๋‹นํžˆ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ์„ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@ I60R ,

  1. ์นœ์ˆ™ ํ•จ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋น„๊ต์  ์ƒˆ๋กœ์šด ์–ธ์–ด์ด๋ฉฐ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์ด์ฃผ ํ•  ๊ฒƒ์ด๋ฉฐ Rust๊ฐ€ ์นœ์ˆ™ํ•ด ๋ณด์ด๋ฉด Rust๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ๋‚˜๋Š” ์—ฐ๊ฒฐ ๋ฉ”์„œ๋“œ๋ฅผ ํฌ๊ฒŒ ์žฌ๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธด ์ฒด์ธ์„ ๋””๋ฒ„๊ทธํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์–ด๋ ต๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ถ”๊ฐ€ ์˜ต์…˜์œผ๋กœ ๋งŒ ํ—ˆ์šฉ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋งคํฌ๋กœ .await!() ). ์ ‘๋‘์‚ฌ ํ˜•์‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฒด์ธ ๋Œ€์‹  ๋ฉ”์„œ๋“œ๋กœ ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.
let resp = await client.get("http://api")?;
let body: MyResponse = await resp.into_json()?;

๋‹ค์Œ๊ณผ ๊ฐ™์ด :

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

๊ทธ๊ฒƒ์€ ์‚ฌํ›„ ๋ถ„์„์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ๊ณ„์†ํ•˜์ง€ ์•Š๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์—์„œ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋‚ด์šฉ์€ ์œ„์น˜๊ฐ€ ์•„๋‹Œ ์šฐ์„  ์ˆœ์œ„๋งŒ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  C #์€ Rust๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ํŠธ๋ ˆ์ด ํŠธ ๋ฉค๋ฒ„๋Š” ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋Š” ์š•๊ตฌ๋ฅผ ์ƒ๋‹นํžˆ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ์„ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ ‘๋‘์‚ฌ / ์ ‘๋ฏธ์‚ฌ / ์•”์‹œ ์  ํ˜•์‹์ด ๋ชจ๋‘์žˆ๋Š” ๊ฒฝ์šฐ ๋‚ด๋ถ€ C # ํŒ€ ์‹คํ—˜์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ ‘๋ฏธ์‚ฌ ํ˜•ํƒœ ์ „๋ฌธ๊ฐ€๋ฅผ ๋ณผ ์ˆ˜์—†๋Š” ์Šต๊ด€์ด ์•„๋‹Œ ์ œ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@mehcode ๊ท€ํ•˜์˜ ์˜ˆ๋Š” ์ €์—๊ฒŒ ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. reqwest ์˜์‹์ ์œผ๋กœ ์ดˆ๊ธฐ ์š”์ฒญ / ์‘๋‹ต์ฃผ๊ธฐ์™€ ์‘๋‹ต (๋ณธ๋ฌธ ์ŠคํŠธ๋ฆผ)์˜ ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ๋ณ„๋„์˜ ๋™์‹œ ํ”„๋กœ์„ธ์Šค๋กœ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฏ€๋กœ @andreytkachenko๊ฐ€ ๋ณด์—ฌ์ค€ ๊ฒƒ์ฒ˜๋Ÿผ ๋‘ ๋ฒˆ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

reqwest ๋Š” ๋‹ค์Œ API๋ฅผ ์™„์ „ํžˆ ๋…ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋˜๋Š”

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

(ํ›„์ž๋Š” and_then ์ด์ƒ์˜ ๋‹จ์ˆœ ์„คํƒ•์ž…๋‹ˆ๋‹ค).

reqwest s ๋ฐ hyper s์™€ hyper ์˜ ์ตœ์ƒ์˜ API ๊ฒฐ์ •์€ ์ด๋Ÿฌํ•œ ์‚ฌํ•ญ์„ ๋ณ„๋„๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์—์žˆ๋Š” ๋งŽ์€ ์ ‘๋ฏธ์‚ฌ ์˜ˆ์ œ์—์„œ์ด ์ฒด์ธ์„ ์˜ˆ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ •์งํ•˜๊ฒŒ ๋Œ€๋ถ€๋ถ„์˜ postfix await ์˜ˆ์ œ๋Š” ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ (ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์„คํƒ•) ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์œ ์ง€ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

์ ‘๋‘์‚ฌ ํ˜•์‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฐ๊ฒฐํ•˜๋Š” ๋Œ€์‹  ๋ฉ”์„œ๋“œ๋กœ ์ฝ”๋“œ๋ฅผ ์ถ”์ถœํ•˜๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๊นŒ, ๋‚˜์œ ๊ฒƒ์ž…๋‹ˆ๊นŒ? M ๊ฐœ์˜ ํ›„์† ์กฐ์น˜๋กœ ์ด์–ด์งˆ ์ˆ˜์žˆ๋Š” N ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๋Š” N * M ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ฐœ์ธ์ ์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์€ ์กฐ๊ธˆ ๋” ๊ธธ๋”๋ผ๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด :

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

ํ—‰

๋‚˜๋Š” C #์—์„œ Rust ์—์„œ์ฒ˜๋Ÿผ ์ฒด์ธ / ๊ธฐ๋Šฅ์  ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์–ป์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‚˜ ์š”? ์ด๋Š” C # ๊ฐœ๋ฐœ์ž / ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜์„ ํฅ๋ฏธ๋กญ๊ฒŒํ•˜์ง€๋งŒ Rust์— ๋ฐ˜๋“œ์‹œ ์ ์šฉ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ Ocaml ๋˜๋Š” Haskell๊ณผ ๋Œ€์กฐ ๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ถˆ์ผ์น˜์˜ ๊ทผ๋ณธ ์›์ธ์€ ์šฐ๋ฆฌ ์ค‘ ์ผ๋ถ€๋Š” ๋ช…๋ นํ˜• ์Šคํƒ€์ผ์„ ์ฆ๊ธฐ๊ณ  ์ผ๋ถ€๋Š” ๊ธฐ๋Šฅ์  ์Šคํƒ€์ผ์„ ์ฆ๊ธด๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ๋‹ค์•ผ. Rust๋Š” ๋‘˜ ๋‹ค ์ง€์›ํ•˜๋ฉฐ ๋…ผ์Ÿ์˜ ์–‘์ธก์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์— ๋น„๋™๊ธฐ๊ฐ€ ์ž˜ ๋งž๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

@dpc

๋‚˜๋Š” C #์—์„œ Rust ์—์„œ์ฒ˜๋Ÿผ ์ฒด์ธ / ๊ธฐ๋Šฅ์  ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์–ป์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‚˜ ์š”? ์ด๋Š” C # ๊ฐœ๋ฐœ์ž / ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜์„ ํฅ๋ฏธ๋กญ๊ฒŒํ•˜์ง€๋งŒ Rust์— ๋ฐ˜๋“œ์‹œ ์ ์šฉ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ Ocaml ๋˜๋Š” Haskell๊ณผ ๋Œ€์กฐ ๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

LINQ ๋ฐ ๊ธฐ๋Šฅ์  ์Šคํƒ€์ผ์€ C #์—์„œ ๋งค์šฐ ์ธ๊ธฐ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@dpc ,
๊ฐ€๋…์„ฑ์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๋ฉด-๋‚˜๋Š” ๋ช…์‹œ์ ์ธ ์ฝ”๋“œ๋งŒํผ์ด๋‚˜ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๋ฉ”์„œ๋“œ / ํ•จ์ˆ˜ ์ด๋ฆ„์ด ์ž์ฒด ์„ค๋ช…์ด ์ž˜๋˜์–ด ์žˆ์œผ๋ฉด ํ›„์† ์กฐ์น˜๋ฅผ ์ˆ˜ํ–‰ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฒ„ ํ—ค๋“œ์— ๋Œ€ํ•ด์„œ-Rust ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ์ธ๋ผ์ธํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•ฉ๋‹ˆ๋‹ค (์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ #[inline] ).

@dpc

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

๋‚ด ๋Š๋‚Œ์€ ์ด๊ฒƒ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ futures API์˜ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ๋” ์‰ฌ์›Œ ์ง€์ง€๋งŒ ํ•ด๋‹น ์ฒด์ธ์˜ ์œ ํ˜•์€ ์นจํˆฌ ๋ฐ ๋””๋ฒ„๊ทธ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

๋™์ผํ•œ ์ฃผ์žฅ์ด?์— ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์šด์˜์ž? ๋” ๋งŽ์€ ์ฒด์ธ์„ ํ—ˆ์šฉํ•˜๋ฏ€๋กœ ๋””๋ฒ„๊น…์ด ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‹œ๋„ ์ด์ƒ! ๊ทธ๋•Œ? ๊ทธ๋ฆฌ๊ณ  Rust๋Š” ์™œ ๋นŒ๋” ํŒจํ„ด์ด์žˆ๋Š” API๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ Rust๋Š” ์ด๋ฏธ API์—์„œ ์ฒด์ธ์„ ์„ ํ˜ธํ•˜๋Š” ๋งŽ์€ ์„ ํƒ์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋„ค, ๋””๋ฒ„๊น…์ด ๋” ์–ด๋ ค์›Œ ์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฆฐํŠธ ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ํฐ ์ฒด์ธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฆฐํŠธ ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€์— ๋Œ€ํ•œ ์ถฉ๋ถ„ํ•œ ๋™๊ธฐ๋ฅผ ๋ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๊นŒ, ๋‚˜์œ ๊ฒƒ์ž…๋‹ˆ๊นŒ? M ๊ฐœ์˜ ํ›„์† ์กฐ์น˜๋กœ ์ด์–ด์งˆ ์ˆ˜์žˆ๋Š” N ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๋Š” N * M ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ฐœ์ธ์ ์œผ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์€ ์กฐ๊ธˆ ๋” ๊ธธ๋”๋ผ๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

N๊ณผ M์€ ๋ฐ˜๋“œ์‹œ ํฌ์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋‘๊ฐ€ ์ถ”์ถœ์— ํฅ๋ฏธ ๋กญ๊ฑฐ๋‚˜ ์œ ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@andreytkachenko ,

  1. ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์นœ์ˆ™ ํ•จ์ด ์—ฌ๊ธฐ์—์„œ ๊ณผ๋Œ€ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•  ๋•Œ ๋จผ์ € ์‚ฌ๋žŒ๋“ค์€ async-await ์Šคํƒ€์ผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์„ ์ถ”๊ตฌํ•˜์ง€๋งŒ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„๋˜์ง€๋งŒ ๋” ๋‚˜์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค๋ฉด ๋˜ ๋‹ค๋ฅธ ์ด์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  2. ๊ธด ์ฒด์ธ์„ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ฝ”๋“œ ์Šคํƒ€์ผ์ด ์•„๋‹Œ ๋””๋ฒ„๊ฑฐ์˜ ํ•œ๊ณ„์ž…๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ์— ๋Œ€ํ•ด์„œ๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ ๋ช…๋ นํ˜• ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๊ธฐ์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ œํ•œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. async ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์—ฌ์ „ํžˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ธ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  <-- ๋Š” ๋งํ–ˆ๋“ฏ์ด ํ•จ์ˆ˜ ์ฒด์ธ์—์„œ ์ถ”๊ฐ€ ์˜ต์…˜์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๋‹ค.

@skade ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋‹ค๋ฆผ ์ฒด์ธ์ด ๊ธด ๋ชจ๋“  ์˜ˆ์ œ๋Š” ์ฝ”๋“œ ๋ƒ„์ƒˆ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒ์„ฑ๊ธฐ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ƒํƒœ ๋จธ์‹ ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ๊ฒฐํ•ฉ ์ž ๋˜๋Š” ์—…๋ฐ์ดํŠธ ๋œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›จ์”ฌ ๋” ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทน๋‹จ์  ์ธ ์†๊ธฐ ๊ตฌ๋ฌธ์€ ํ˜„์žฌ ๋ฏธ๋ž˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ์–ด๋ ค์šด ๋””๋ฒ„๊น…์„์œ„ํ•œ ๋ ˆ์‹œํ”ผ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์ง๋„์˜ ํŒฌ์ž…๋‹ˆ๋‹ค ๋ชจ๋‘ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ await ๋งคํฌ๋กœ await!(...) / .await!() ,์™€ ํ•จ๊ป˜ async ๋ฐ #[async] ์ƒ์„ฑ ๊ธฐ๋Šฅ , ์—ฌ๊ธฐ ์— ๋‚ด ์˜๊ฒฌ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง„ํ–‰๋˜๋ฉด ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด await! ์— ๋Œ€ํ•ด ๋‹จ์ผ ๋งคํฌ๋กœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ await ํ‚ค์›Œ๋“œ๋Š” async ํ•จ์ˆ˜ ๋‚ด์˜ ํ‚ค์›Œ๋“œ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

@skade ,
๋‚˜์—๊ฒŒ future ์—์„œ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์˜ ํฐ ๋‹จ์ ์€ async ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ˆจ๊ธฐ๊ณ  ์ผ๋ฐ˜ ํ•จ์ˆ˜์™€ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋นŒ๋” ์Šคํƒ€์ผ ์ฒด์ธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ผ์‹œ ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ ํฌ์ธํŠธ๋ฅผ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@ I60R ๊ธด ์ฝœ ์ฒด์ธ์„ ๋””๋ฒ„๊น…ํ•˜๋Š” ๊ฒƒ์€ ๋””๋ฒ„๊ฑฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ ์ค‘ ๋‹ค์ˆ˜๊ฐ€ ์ผ๋ฐ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ทจํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ ํด๋กœ์ €์— ๋ฐ”์ธ๋”ฉ ๋œ ์ผ๋ฐ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ์ •์ง€ ์ง€์ ์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ด์ด ๊ธฐ๋Šฅ์˜ ๋ชฉํ‘œ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ตฌํ˜„์ž๊ฐ€ ๊ฒฐ์ •ํ•  ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ œ์•ˆ ๋œ await ๊ตฌ๋ฌธ์˜ ๋ชจ๋“  ๋ฒ„์ „์—์„œ ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@novacrazy ์ข‹์€ ์ง€์ , ์ด์ œ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์–ธ๊ธ‰

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ ๊ฐ™์•„์š”

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

๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ Rust์—์„œ ํ“จ์ฒ˜๋ฅผ ์ฐพ์•„๋ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@richardanaya ์ด๊ฒƒ์€ ์™„์ „ํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค (๋‹ค๋ฅธ ๊ตฌ๋ฌธ).

Box impl์ฒ˜๋Ÿผ :

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

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒˆ ํ‚ค์›Œ๋“œ await ํ•˜๊ณ  Await ํŠน์„ฑ์„ ์ž…๋ ฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  await ๋ฅผ ๋ฉ”์†Œ๋“œ์™€ ํ‚ค์›Œ๋“œ๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

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

@richardanaya ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ˆ˜๋…„ ์ „์— ์ œ webdev์— async / await๋ฅผ ์ฑ„ํƒํ•œ ์ตœ์ดˆ์˜ ๊ฐœ๋ฐœ์ž ์ค‘ ์ผ๋ถ€์˜€์œผ๋ฉฐ, ์ง„์ •ํ•œ ํž˜ ์€ async / await๋ฅผ ๊ธฐ์กด Promise / Futures์™€

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

let value = result.unwrap();

์ค‘์ฒฉ ๋œ ์„ ๋ฌผ์ด๋‚˜ ์„ ๋ฌผ์˜ ๊ฒฐ๊ณผ ๋˜๋Š” ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ .flatten() ๊ฒฐํ•ฉ๊ธฐ๋Š”์ด๋ฅผ ๋Œ€ํญ ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ํ’€๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ๋‚˜์œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

@XX ์ค‘๋ณต๋˜๊ณ  ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. await ๋Š” async ํ•จ์ˆ˜์—๋งŒ ์กด์žฌํ•˜๋ฉฐ Future / IntoFuture ์„ (๋ฅผ) ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์—์„œ๋งŒ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ƒˆ๋กœ ์ถ”๊ฐ€ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠน์„ฑ.

@novacrazy , @richardanaya

์ด๋Ÿฌํ•œ ์ƒ์„ฑ๊ธฐ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ƒํƒœ ๋จธ์‹ ์„ ๋‚ด๋ถ€์— ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฒฐํ•ฉ ์ž ๋˜๋Š” ์—…๋ฐ์ดํŠธ ๋œ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›จ์”ฌ ๋” ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทน๋‹จ์  ์ธ ์†๊ธฐ ๊ตฌ๋ฌธ์€ ํ˜„์žฌ ๋ฏธ๋ž˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ์–ด๋ ค์šด ๋””๋ฒ„๊น…์„์œ„ํ•œ ๋ ˆ์‹œํ”ผ์ž…๋‹ˆ๋‹ค.

@novacrazy ์ข‹์€ ์ง€์ , ์ด์ œ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์–ธ๊ธ‰

Combinator๋Š” Rusts async / await์—์„œ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์†์„ฑ๊ณผ ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋ธ”๋ก๊ณผ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ๊ฒฐํ•ฉ์ž๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝค๋น„ ๋„ค์ดํ„ฐ ํ† ๋ก ์€ ๋„์›€์ด๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ œ์™ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@ I60R

๋‚˜์—๊ฒŒ ๋ฏธ๋ž˜์— ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํฐ ๋‹จ์ ์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ˆจ๊ธฐ๊ณ  ์ •๊ทœ ํ•จ์ˆ˜์™€ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋นŒ๋” ์Šคํƒ€์ผ ์ฒด์ธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ผ์‹œ ์ค‘๋‹จ ๊ฐ€๋Šฅํ•œ ํฌ์ธํŠธ๋ฅผ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ผ์‹œ ์ค‘๋‹จ ์ง€์ ์„ ์ˆจ๊ธธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐํ•ฉ์ž๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ๋‹ค๋ฅธ ๋ฏธ๋ž˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ ๊ทธ๊ฒƒ๋“ค์€ ๊ธฐ๋‹ค๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

C #์—๋Š” ์ ‘๋‘์‚ฌ await ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ (์ด๋ฏธ ์กด์žฌํ•˜๋Š”) ์ ‘๋ฏธ์‚ฌ ? ์—ฐ์‚ฐ์ž์™€ ๊ฒฐํ•ฉ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•œ ์งˆ๋ฌธ๊ณผ ๋‘ ๊ฐœ์˜ ์œ ์‚ฌํ•œ "์žฅ์‹ ์ž"๋ฅผ ๊ฐ–๋Š” ์ผ๋ฐ˜์ ์ธ ์–ด์ƒ‰ํ•จ์ด ํ‘œํ˜„์˜ ๋ฐ˜๋Œ€ํŽธ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

@ Matthias247 ๋ฐ์ดํ„ฐ๋ฅผ ๋นŒ๋ ค์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ await ๋ฌธ์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ์ข…์ข… ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฒฐํ•ฉ์ž๋Š”์ด๋ฅผ ์œ„ํ•ด ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•˜๋ฉฐ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ์™„์ „ํžˆ ์ตœ์ ํ™”๋ฉ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ง„์ •ํ•œ ํž˜์€ ์‚ฌ๋ฌผ์„ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ์ผ์„ํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ถ€๋ถ„์ ์œผ๋กœ ์ œ๊ฐ€์ด ๋ชจ๋“  ๊ตฌ๋ฌธ ๋ฐ”์ดํฌ ์‰๋”ฉ์„ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์˜จ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ๋•์ง€ ์•Š๊ณ  ์œ ์ง€ ๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•˜๊ณ  ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. 80 %์˜ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ์ด ๋ฌด์—‡์ด๋“ ๊ฐ„์— async / await ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ๋ฏธ๋ž˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ์•ˆ์ •์ ์ด๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์€ API๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ await ๋ฐ / ๋˜๋Š” ํ˜ผํ•ฉ ๋งคํฌ๋กœ await!(...) / .await!() ๊ฐ€ ๊ฐ€์žฅ ์ฝ๊ธฐ ์‰ฝ๊ณ  ์นœ์ˆ™ํ•˜๋ฉฐ ๋””๋ฒ„๊ทธํ•˜๊ธฐ ์‰ฌ์šด ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

๊ท€ํ•˜์˜ ๊ฒŒ์‹œ๋ฌผ์„ ๋ณด์•˜๊ณ  ์‹ค์ œ๋กœ "์ต์ˆ™ ํ•จ"์— ๋Œ€ํ•ด ๋ฐ˜์„ฑ ํ–ˆ์œผ๋ฏ€๋กœ ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์นœ์ˆ™ ํ•จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. await ๊ตฌ๋ฌธ์„ await๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์œ ์‚ฌํ•œ ์–ธ์–ด์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒํ•ฉ๋‹ˆ๋‹ค. Javascript๋Š” ์—ฌ๊ธฐ์—์„œ ๊ฝค ํฌ๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ์„œ์˜ WASM ๊ธฐ๋Šฅ๊ณผ ๋งค์šฐ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋‘ ๋ฒˆ์งธ ์œ ํ˜•์˜ ์นœ์ˆ™ ํ•จ์€ ๋™๊ธฐ ์ฝ”๋“œ๋กœ๋งŒ ์ž‘์—…ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ฝ”๋“œ๋ฅผ ์นœ์ˆ™ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. await์˜ ๊ฐ€์žฅ ํฐ ์ธก๋ฉด์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ์‹์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์ž˜๋ชปํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์ฃผ๋กœ ๋™๊ธฐ์‹ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์™„์ „ํžˆ ์ด์งˆ์ ์œผ๋กœ ๋ณด์ด๋Š” ์ฒด์ธ๋ณด๋‹ค ๊ธธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ๋น„๋™๊ธฐ ์‹œ์ ˆ์— ์ œ๊ฐ€ ์ œ๊ณต ํ•œ ํ•œ ๊ฐ€์ง€๋Š”, ํšŒ๊ณ ์—์„œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ €์—๊ฒŒ ํ›จ์”ฌ ๋” ์œ ์šฉํ–ˆ๋˜ ๊ฒƒ์€ ์•ฝ์† / ๋ฏธ๋ž˜๋ฅผ ํ•จ๊ป˜ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Promise.all (p1 (), p2 ()) ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์‰ฝ๊ฒŒ ์ž‘์—…์„ ๋ณ‘๋ ฌํ™” ํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. then () ์ฒด์ด๋‹์€ ํ•ญ์ƒ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์˜ ๊ณผ๊ฑฐ ์•ฝ์†์˜ ๋ฐ˜ํ–ฅ ์ผ ๋ฟ์ด์—ˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๊ฑฐ์˜ ๊ตฌ์‹์ด๊ณ  ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋น„๋™๊ธฐ ์ฝ”๋“œ์™€ ๋™๊ธฐํ™” ์ฝ”๋“œ์˜ ์ฐจ์ด๋ฅผ ์ตœ๋Œ€ํ•œ ์ตœ์†Œํ™”ํ•˜์‹ญ์‹œ์˜ค."

@novacrazy ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” impl Future ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Future ํŠธ๋ ˆ์ด ํŠธ์— await ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ด ๊ฐ™์ด :

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

@XX ๋‚ด๊ฐ€ ์ดํ•ดํ–ˆ๋“ฏ์ด Rust์˜ async ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๋จธ์‹ ์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ ๋Š” ์ข‹์€ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ await ํ•„์š” async ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋‘๋ฅผ ๋ณ€ํ™˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก, ์ง์žฅ์— ๊ธฐ๋Šฅ์„. await ๋Š” async ๋ถ€๋ถ„ ์—†์ด๋Š” ์ž‘๋™ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Future ์—๋Š” ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ wait ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

@skade ,

๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ ์Šคํƒ€์ผ์ด ์œ ํ˜• ์ถ”๋ก ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฒด์ธ ๋ฐ ๋ช…๋ นํ˜•์œผ๋กœ ์ž‘์„ฑ๋œ ๋™์ผํ•œ ์ฝ”๋“œ์—์„œ ์ฐจ์ด์ ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์€ ์ •ํ™•ํžˆ ๋™์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊ฑฐ๊ฐ€์ด๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ๋””๋ฒ„๊ฑฐ์—์„œ ํ™•์‹คํžˆ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

@skade , @ Matthias247 , @XX

์ฝค๋น„ ๋„ค์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋Šฅ ์ฒด์ธ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ์ •์ง€ ์ง€์ ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ๋‚ด๋ถ€์— ์•”์‹œ ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์•”์‹œ ์ ์œผ๋กœ mut ๋ฅผ ์ทจํ•˜๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๊ทธ๊ฒƒ์€ Rust์—์„œ ๊ฐ€์žฅ ํฐ ํ˜ผ๋ž€์˜ ํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ API๋Š” ์„ ๋ฌผ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ˜๋ฉด ๋‹ค๋ฅธ API๋Š” ์„ ๋ฌผ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋‹จ ์ ์€ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ช…์‹œ ์ ์ด์–ด์•ผํ•˜๋ฉฐ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๊ตฌ๋ฌธ์€

@ I60R let ๋ฐ”์ธ๋”ฉ์€ ์œ ํ˜• ์ถ”๋ก ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ์ง€์ ์ด๋ฉฐ ์˜ค๋ฅ˜๋ณด๊ณ ์— ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

ํ—‰ํ—‰

๊ทธ๋ž˜์„œ await๋Š” ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ํ˜•์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ˜ํ™˜ ์œ ํ˜•์€ impl Future + Async ๋Œ€์‹  impl Future ์ž…๋‹ˆ๋‹ค.

@skade ์ €๋Š” ํ•ญ์ƒ . ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์ด ์ •ํ™•ํžˆ ๋™์ผํ•œ ๋ชฉ์ ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@dpc

๋‚˜๋Š” C #์—์„œ Rust ์—์„œ์ฒ˜๋Ÿผ ์ฒด์ธ / ๊ธฐ๋Šฅ์  ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์–ป์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‚˜ ์š”? ์ด๋Š” C # ๊ฐœ๋ฐœ์ž / ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜์„ ํฅ๋ฏธ๋กญ๊ฒŒํ•˜์ง€๋งŒ Rust์— ๋ฐ˜๋“œ์‹œ ์ ์šฉ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ Ocaml ๋˜๋Š” Haskell๊ณผ ๋Œ€์กฐ ๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Rust๋งŒํผ ๋งŽ์ด ์–ป์Šต๋‹ˆ๋‹ค. LINQ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

async Task<List<IGroping<int, PageMetadata>>> GetPageMetadata(string url, DbSet<Page> pages)
{
    using(var client = new HttpClient())
    using(var r = await client.GetAsync(new Uri(url)))
    {
        var content = await r.Content.ReadAsStringAsync();
                return await pages
                   .Where(x => x.Content == content)
                   .Select(x => x.Metadata)
                   .GroupBy(x => x.Id)
                   .ToListAsync();
    }
}

๋˜๋Š” ๋” ์ผ๋ฐ˜์ ์ธ

let a = await!(service_a);
let b = await!(some_method_on(a, some, other, params));
let c = await!(combine(somehow, a, b));

ํ˜ธ์ถœ์„ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜์— ํ• ๋‹น ํ•œ ๋‹ค์Œ ์–ด๋–ป๊ฒŒ ๋“  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์šฉ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.


ํ•˜๋‚˜์˜ ์ƒํ™ฉ์—์„œ ์„ ๋ฌผ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ†ตํ™” ์ค‘์— ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ๊ฒฝ์šฐ. ์˜ˆ : let a = await!(service_a)? . ์ด๊ฒƒ์€ ์ ‘๋ฏธ์‚ฌ ๋Œ€์•ˆ์ด ๋” ๋‚˜์€ ์œ ์ผํ•œ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด์ ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ชจ๋“  ๋‹จ์ ์„ ๋Šฅ๊ฐ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ด์œ  : impl Add for MyFuture { ... } ๋ฐ let a = await a + b; ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

postfix await ํ‚ค์›Œ๋“œ์˜ ๋งฅ๋ฝ์—์„œ Generalized Type Ascription RFC ์— ๋Œ€ํ•ด ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

let x = (0..10)
    .map(some_computation)
    .collect() : Result<Vec<_>, _>
    .unwrap()
    .map(other_computation) : Vec<usize>
    .into() : Rc<[_]>;

postfix await ํ‚ค์›Œ๋“œ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

ํ˜•์‹์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

foo.iter().map(|x| x.bar()).collect(): Vec<_>.as_ref()
client.get("https://my_api").send() await.unwrap().json() await.unwrap()

Type Ascription RFC์˜ ์•ฝ์„ ์‚ผํ‚ค๋ฉด ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด fut await ๋ฅผ ์‚ผ์ผœ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

BTW, ์ด๊ฒƒ์ด ์œ ํšจํ•œ ๊ตฌ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

fn main() {
    println
    !("Hello, World!");
}

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ ์ฝ”๋“œ์—์„œ๋Š”์ด ๋ฌธ์ œ๊ฐ€ ์ „ํ˜€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ์กฐ๊ธˆ ๋ฒ—์–ด๋‚˜๋„๋ก ํ—ˆ์šฉ ํ•ด์ฃผ์„ธ์š”. @BenoitZugmeyer๊ฐ€ ์ œ์•ˆํ•œ๋Œ€๋กœ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. expr!macro ๋˜๋Š” expr@macro ๋˜๋Š” expr.macro!() ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ ‘๋ฏธ์‚ฌ๋ฅผ ์–ป๋Š” ๋™์•ˆ ์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹Œ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋…์„ ์ถ”์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ ์–ด๋„ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์ž ์žฌ์  ์ธ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ์ƒ๊ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

await ๋ฅผ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋กœ ๋งŒ๋“ค๋”๋ผ๋„ ์—ฌ์ „ํžˆ ๋งˆ๋ฒ•์˜ ๋งคํฌ๋กœ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์˜ˆ compile_error! ). ๊ทธ๋Ÿฌ๋‚˜ @jplatte ์™€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฏธ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ทธ ๊ธธ์„ ๊ฐ€๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ• ๊นŒ์š”? ๋จผ์ € postfix ๋งคํฌ๋กœ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์„ค์ • ํ•œ ๋‹ค์Œ await ๋งˆ๋ฒ•์˜ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋กœ ํ—ˆ์šฉ ํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— ์ •์˜ ๋œ postfix ๋งคํฌ๋กœ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

Lexing

๋ ‰์‹ฑ / ํŒŒ์‹ฑ์˜ ๊ฒฝ์šฐ ์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. expr!macro ๋ฅผ ๋ณด๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” expr! ๋ผ๋Š” ๋งคํฌ๋กœ๊ฐ€ ์žˆ๊ณ  ๊ทธ ๋’ค์— ์ž˜๋ชป๋œ ๋ฌธ์ž macro ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ expr!macro ๋Š” ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋กœ lex๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผํ•˜๋ฉฐ, expr ๋’ค์— ! ์ด์–ด์ง€๊ณ  ๋ฐ”๋กœ ๋’ค์— identifier ์˜ค๋ฉด ํ›„์œ„ ๋งคํฌ๋กœ๊ฐ€๋ฉ๋‹ˆ๋‹ค. expr!macro ํ˜•์‹์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ์œ ์šฉํ• ๊นŒ์š”?

๋จธ๋ฆฟ์†์—์„œ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ƒ๊ฐํ•ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ์ด ๋ชฉ๋ก์ด ๋งค์šฐ ๋„์›€์ด๋˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • stream!await_all : ์ŠคํŠธ๋ฆผ ๋Œ€๊ธฐ ์šฉ
  • option!or_continue : option ๊ฐ€ None์ด๋ฉด ๋ฃจํ”„๋ฅผ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
  • monad!bind : ์ด๋ฆ„์— ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๊ณ  =<<

stream!await_all

์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๋ฏธ๋ž˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ŠคํŠธ๋ฆผ์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

event_stream("ws://some.stock.exchange/usd2eur")
    .and_then(|exchange_response| {
        let exchange_rate = exchange_response.json()?;
        stream::once(UpdateTickerAction::new(exchange_rate.value))
    })

( async -stream-esque ๋ธ”๋ก์—์„œ) ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let exchange_rate = event_stream("ws://some.stock.exchange/usd2eur")
    !await_all
    .json()?;

UpdateTickerAction::new(exchange_rate.value)

option!or_continue

์ด๋ฅผ ํ†ตํ•ด ์˜ต์…˜์„ ํ’€๊ณ  None ์ธ ๊ฒฝ์šฐ ๋ฃจํ”„๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

loop {
    let event = match engine.event() {
        Some(event) => event,
        None => continue,
    }
    let button = match event.button() {
        Some(button) => button,
        None => continue,
    }
    handle_button_pressed(button);
}

๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

loop {
    handle_button_pressed(
        engine.event()!or_continue
            .button()!or_continue
    );
}

monad!bind

์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ƒ๋‹นํžˆ ์†Œ๋ฐ•ํ•œ (์ฆ‰, ํ‘œํ˜„ ์ค‘์‹ฌ) ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋‚˜๋“œ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๊ฒŒํ•ฉ๋‹ˆ๋‹ค. Rust์—๋Š” ์•„์ง ๋ชจ๋‚˜๋“œ์™€ ๊ฐ™์€ ๊ฒƒ์ด ์—†์œผ๋ฉฐ Rust์— ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํŒ๋งคํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ถ”๊ฐ€ ๋  ๊ฒฝ์šฐ์ด ๊ตฌ๋ฌธ์ด ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์—์„œ ๋‹ค์Œ์„ ๊ฐ€์ ธ

nameDo :: IO ()
nameDo = do putStr "What is your first name? "
            first <- getLine
            putStr "And your last name? "
            last <- getLine
            let full = first ++ " " ++ last
            putStrLn ("Pleased to meet you, " ++ full ++ "!")

๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

do {
    putStr("What is your first name? ")!bind;
    let first = getLine()!bind;
    putStr("And your last name? ")!bind;
    let last = getLine()!bind;
    let full = first + " " + &last
    putStrLn("Pleased to meet you, " + &full + "!")!bind;
}

๋˜๋Š” ๋” ์ ์€ let s๋กœ ๋” ๋งŽ์€ ์ธ๋ผ์ธ :

do {
    putStr("What is your first name? ")!bind;
    let first = getLine()!bind;
    putStr("And your last name? ")!bind;
    putStrLn(
        "Pleased to meet you, " + &first + " " + &getLine()!bind + "!"
    )!bind;
}

ํ‰๊ฐ€

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋งค์šฐ ๋ถ„์—ด๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋‘๋‡Œ์˜ ์ˆ˜ํ•™์ž ๋ถ€๋ถ„์€ await ๋Œ€ํ•œ ์ผ๋ฐ˜ํ™” ๋œ ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์‹ถ์–ดํ•˜๋ฉฐ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋‘๋‡Œ์˜ ์‹ค์šฉ์ ์ธ ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋งคํฌ๋กœ ์‹œ์Šคํ…œ์ด ์ด๋ฏธ ๋” ๋ณต์žกํ•œ ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์–ธ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ? ๋ฐ await ์—์„œ ๋งค์šฐ ์œ ์šฉํ•œ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž์˜ ๋‘ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์–ธ๊ธ‰ ํ•œ ๊ฒƒ๋“ค๊ณผ ๋น„์Šทํ•œ ๋ฏธ๋ž˜์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„ ์ฐพ์œผ๋ฉด ์–ด๋–จ๊นŒ์š”? ์ผ๋ฐ˜ํ™”ํ–ˆ๋‹ค๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Rust์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋งค๋ฒˆ ๋˜ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š”๋ฐ, ์ด๋Š” ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ณด๋‹ค ์–ธ์–ด๋ฅผ ๋” ๋ถ€ ํ’€๋ฆด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๋„ˆํฌ๋“ค์€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋‹ˆ?

์•ˆ๋…•ํ•˜์„ธ์š”.

๋‚˜๋Š” ๋งค์šฐ ์œ ์‚ฌํ•œ ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐ ํ•ด๋ƒˆ๊ณ , Rust์˜ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋Š” ์‹œ๊ฐ„ ๋ฌธ์ œ๋ผ๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.
ndarray ์Šฌ๋ผ์ด์‹ฑ์„ ๋‹ค๋ฃฐ ๋•Œ๋งˆ๋‹ค ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

let view = array.slice(s![.., ..]);

๊ทธ๋Ÿฌ๋‚˜ ํ›จ์”ฌ ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค

let view = array.slice![.., ..];
// or like you suggested
let view = array!slice[.., ..];
// or like in PHP
let view = array->slice![.., ..];

_with ๋˜๋Š” _else ์ ‘๋ฏธ์‚ฌ๊ฐ€์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋งŽ์€ ๊ฒฐํ•ฉ์ž๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

opt!unwrap_or(Error::new("Error!"))?; //equal to .unwrap_or_else(||Error::new("Error!"));

@EyeOfPython @andreytkachenko postfix ๋งคํฌ๋กœ๋Š” ํ˜„์žฌ Rust์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ฉฐ IMHO๋Š” ์™„์ „ํ•œ RFC + FCP + Implementation ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ RFC ๋…ผ์˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ์Šน์ธ ๋œ RFC์— ๋Œ€ํ•œ ๋…ผ์˜์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ๋…ผ์˜ํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์‹ค์šฉ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์ด ํฌ๊ฒŒ ์ง€์—ฐ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ๋ฐฉ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ์–ต์ œํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์„œ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜์ง€ _ ์•„๋‹™๋‹ˆ๋‹ค _, ๋…ผ์˜ ๋œ ๋ฌธ์ œ์˜ ์™ธ๋ถ€๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ :์ด ์Šค๋ ˆ๋“œ๋Š” ํŠน๋ณ„ํžˆ await ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ, ์•ž์œผ๋กœ yield ํ‘œํ˜„์‹์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ๋…ผ์˜๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ผ๋ฐ˜ํ™” ํ•  ์ˆ˜์žˆ๋Š” ๊ตฌ๋ฌธ์„๋ณด๊ณ  ์‹ถ์ง€๋งŒ,๋ณด๊ธฐ์—๋Š” ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ  :

  1. ๋งคํฌ๋กœ๋Š” ๋„๋ฉ”์ธ ํŠน์ • ํ•ญ๋ชฉ์— ์ œ๊ณต๋˜๋ฉฐ ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด ํ๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํ•ต์‹ฌ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ณผ์ž‰์ž…๋‹ˆ๋‹ค.
  2. Postfix ๋งคํฌ๋กœ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์—ฐ์‚ฐ์ž ๋˜๋Š” ์ž˜๋ชป๋œ ์ฝ”๋“œ๋กœ ์ด์–ด์ง€๋Š” ๊ธฐํƒ€ ๋น„์ •์ƒ์ ์ธ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰์‹œ ์•…์šฉ๋ฉ๋‹ˆ๋‹ค.
  3. ์ ์ ˆํ•œ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • stream.await_all ์€ combinator์˜ ์™„๋ฒฝํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

    • option.or_continue ๋ฐ _else ๊ฒฐํ•ฉ์ž๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์€ null ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž์˜ ์™„๋ฒฝํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

    • monad.bind ์€ if-let ์ฒด์ธ์˜ ์™„๋ฒฝํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

    • ndarray slicing ๋Š” const ์ œ๋„ค๋ฆญ์˜ ์™„๋ฒฝํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

  4. ๊ทธ๋“ค์€ ์ด๋ฏธ ? ์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌํ˜„

์•ˆ๋…•ํ•˜์„ธ์š”.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋„๋Œ€์ฒด ์™œ ๊ทธ๋“ค์ด ๋ฌถ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ์œ„์˜ println ์˜ˆ์ œ์ฒ˜๋Ÿผ ์‹ค์ œ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Pzixel ๊ฒฐ๊ตญ Generator::resume ๊ฐ€ ๊ฐ’์„ ๊ฐ€์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ yield expr ์€ ๋น„ () ์œ ํ˜•์„ ๊ฐ–๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

@vlaff ์œ ํ˜• Ascription๊ณผ ์ผ์น˜ํ•ด์•ผํ•˜๋Š” await ๋Œ€ํ•œ ์ธ์ˆ˜๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋งค์šฐ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ Type Ascription์€ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹œ๋„๋˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ _this_๊ฐ€ ์„ฑ๊ณตํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์— ๋ฐ˜๋Œ€ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ TA๋Š” ๋ฏธ๋ž˜์˜ RFC์ด๋ฉฐ ์ด๊ฒƒ์€ ์ด๋ฏธ ์ œ์•ˆ ๋œ ๊ตฌ๋ฌธ์œผ๋กœ ํ—ˆ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋…ผ์˜์ž…๋‹ˆ๋‹ค.

๋งŽ์€ ์ฃผ์„์„ ์ฝ๊ณ  ์™œ await! (...)๊ฐ€ ๋งค์šฐ ์ด์ƒ์ ์ธ ๊ฒฝ๋กœ๋กœ ๋‚˜ํƒ€๋‚˜๋Š”์ง€์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์š”์•ฝ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋งคํฌ๋กœ๊ฐ€ ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด ์ฝ”๋“œ์— ๊ฐ€์žฅ ์ต์ˆ™ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.
  2. await! (...) https://github.com/alexcrichton/futures-await ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ž‘์—…์ด ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ ์žฌ ์ž‘์„ฑ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋Š” ํ…Œ์ด๋ธ”์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์–ด์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์—†์œผ๋ฉฐ "๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค!" ๋น„ํ‘œ์ค€ ์ปจํ…์ŠคํŠธ์—์„œ๋Š” RFC์— ๋”ฐ๋ผ ๊ฐ€๋Šฅ์„ฑ์กฐ์ฐจ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  4. ๊ทธ๊ฒƒ์€ ์™„์ „ํžˆ ํ‘œ์ค€์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์ œ๊ณตํ•˜๋ฉด์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์•ˆ์ •์ ์ธ ์‚ฌ์šฉ ํ›„ ์žฅ๊ธฐ์ ์ธ ๋ฐฉํ–ฅ์„ ๊ณ ๋ คํ•  ์‹œ๊ฐ„์„ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๋” ๋งŽ์ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : try! ()).
  5. await์™€ yield๋ฅผ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ๊ณต์‹ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋‹ค๊ฐ€์˜ค๋Š” yield! ()์™€ ์œ ์‚ฌํ•œ ํŒจํ„ด์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  6. ์ฒด์ด๋‹์€ ์›ํ•˜๋Š”๋งŒํผ ๊ฐ€์น˜๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋Œ€๊ธฐ๊ฐ€ ์žˆ์Œ์œผ๋กœ์จ ๋ช…ํ™•์„ฑ์ด ํ–ฅ์ƒ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  7. IDE ๊ตฌ๋ฌธ ํ•˜์ด ๋ผ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  8. ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์‚ฌ๋žŒ๋“ค์€ ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๋งคํฌ๋กœ ์‚ฌ์šฉ์„ ๋ณธ ํ›„ await! (...) ๋งคํฌ๋กœ์— ์˜ํ•ด ๋ฒ„๋ ค์ง€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ธ์ง€ ๊ณผ๋ถ€ํ•˜๊ฐ€ ์ ์Œ)
  9. ์•ˆ์ •ํ™”๋กœ ๋‚˜์•„ ๊ฐ€๊ธฐ์œ„ํ•œ ๋ชจ๋“  ๊ฒฝ๋กœ ์ค‘ ๊ฐ€์žฅ ์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ ๊ฒฝ๋กœ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋‹ค๋ฆฌ๋‹ค! ์—ฌ๊ธฐ์„œ ๋งคํฌ๋กœ๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋ฉฐ ์งˆ๋ฌธ์€ ์—ฐ๊ฒฐ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ƒ๊ฐํ•˜๋ฉดํ• ์ˆ˜๋ก ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋” ์ข‹์•„ ๋ณด์ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

let a = foo await;
let b = bar await?;
let c = baz? await;
let d = booz? await?;
let e = kik? + kek? await? + kuk? await?;
// a + b is `impl Add for MyFuture {}` which alises to `a.select(b)`

๋ชจ๋“  ์ˆ˜์ค€์˜ ์ค‘์ฒฉ์„ ํ—ˆ์šฉํ•˜๊ณ  ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ? ๋ฐ ํ–ฅํ›„ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์ž์™€ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‹ ๊ทœ ์ด๋ฏผ์ž์—๊ฒŒ๋Š” ์•ฝ๊ฐ„ ๋‚ฏ์„ค์–ด ๋ณด์ด์ง€๋งŒ ๋ฌธ๋ฒ• ์ด์ต์ด ๊ทธ๊ฒƒ์„ ๋Šฅ๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ๋œ ์ด์œ ๋Š” await ๊ฐ€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์•„๋‹Œ ๋ณ„๋„์˜ ํ‚ค์›Œ๋“œ ์—ฌ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์ค‘์š”ํ•˜๋ฏ€๋กœ ํ…์ŠคํŠธ์— ์ž์ฒด ํ•˜์ด๋ผ์ดํŠธ์™€ ์œ„์น˜๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@Pzixel , @HeroicKatora , @skade

์˜ˆ๋ฅผ ๋“ค์–ด Python yield ๋ฐ yield from ํ‘œํ˜„์‹์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์™ธ๋ถ€ ํ•จ์ˆ˜๋Š” ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋  ๋•Œ yield ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋  ๊ฐ’์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด @valff๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋”ฐ๋ผ์„œ yield ์—๋Š” ! ๋˜๋Š” () ์ด์™ธ์˜ ์œ ํ˜•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ” ๋ฃจํ‹ด์˜ ์‹œ์ ์—์„œ yield ๋ฐ await ์ผ์‹œ ์ค‘๋‹จํ•˜๊ณ  (๊ฒฐ๊ตญ) ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋“ค์€ ๋‹จ์ง€ ๊ฐ™์€ ๋™์ „์˜ ์–‘๋ฉด์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ๊ฐ€๋Šฅ์„ฑ ์ธ _square-brackets-with-keyword_๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋ถ€๋ถ„์ ์œผ๋กœ ์ด๊ฒƒ์„ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค (๊ตฌ๋ฌธ ๊ฐ•์กฐ๋ฅผ ์œ„ํ•ด yield ์‚ฌ์šฉ) :

let body: MyResponse = client.get("http://api").send()[yield]?.into_json()[yield]?

"์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ"๊ฐ€ ๊ฐ€์žฅ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. future-expression๊ณผ await ๊ตฌ๋ถ„ํ•˜๋Š” ๊ณต๋ฐฑ ์ด์™ธ์˜ ๋ฌธ์ž๊ฐ€์žˆ๋Š” ์ ‘๋ฏธ์–ด๋„ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ์ง€๋งŒ '.' ๊ทธ๊ฒƒ์€ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๊ฒƒ์ด๊ณ  await ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await ๋ฅผ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด await self ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Trait ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ @XX ์ œ์•ˆ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค (์•„๋งˆ๋„ await ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. wait ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ธด ์ฒด์ธ์ด ์ฝ๊ธฐ ์–ด๋ ต ๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค„๋งˆ๋‹ค ๋Œ€๊ธฐํ•˜๊ณ  ์ฒด์ธ์ด ์•„๋‹Œ ๊ฒƒ์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” wait ์ด๋ฏธ ์กด์žฌํ•˜๊ณ  ๋ฏธ๋ž˜๋ฅผ ๋ง‰๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ์ƒ๊ฐ์„ ๊ธ์–ด ๋ผ.

@roland ๋‚˜๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ํƒ€์ž… ๋น„๋ฌธ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•ฉ๋‹ˆ๋‹ค : https://github.com/rust-lang/rust/issues/57640#issuecomment -456023146

@rolandsteiner ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์ž‘์„ฑ

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

๋‚ด๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ธ ๋•Œ :

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

@skade ์˜ค, ๋‹น์‹ ์€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. : stuck_out_tongue :

@Pzixel ๊ฒฐ๊ตญ Generator::resume ๊ฐ€ ๊ฐ’์„ ๊ฐ€์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ yield expr ์€ ๋น„ () ์œ ํ˜•์„ ๊ฐ–๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ yield ์—๋Š” ! ๋˜๋Š” () ์ด์™ธ์˜ ์œ ํ˜•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@valff , @rolandsteiner yield ์ด ์žฌ๊ฐœ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜ ์Šต๋‹ˆ๋‹ค.์ด ๊ฐ’์€ ์ƒ์„ฑ๊ธฐ ๊ตฌ๋ฌธ ๋ฐ / ๋˜๋Š” ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ •์ ์œผ๋กœ ํ˜•์‹ํ™” ๋œ ์–ธ์–ด์— ๋งž์ถ”๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์žฌ๊ฐœ ์ธ์ˆ˜๊ฐ€์žˆ๋Š” ์›๋ž˜ ํ”„๋กœํ†  ํƒ€์ž…์€์ด ์ธ์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ํ‚ค์›Œ๋“œ gen arg ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์€ IMO์—์„œ ์ž˜ ์ž‘๋™ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํ›จ์”ฌ ๋” ๋†’์Šต๋‹ˆ๋‹ค. ์ด ๊ด€์ ์—์„œ yield ๋Š” ์—ฌ์ „ํžˆ () ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ await ๋Œ€ํ•œ ๋…ผ์˜์— ๋งŽ์€ ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ await ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘, ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์žํ•ด์•ผ async (๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๊ธฐ๋Œ€ yield ์ ‘๋‘์‚ฌ๊ฐ€ ๋ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ„ํ•ด). ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ ์œ„์น˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ์ž์ „๊ฑฐ ํ˜๋ฆผ์ด ์‹คํ–‰๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. Rust์˜ ๋‹ค๋ฅธ ์–ด๋–ค ๊ฒƒ๋„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ postfix ํ‚ค์›Œ๋“œ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์–ธ์–ด๋ฅผ ๋„ˆ๋ฌด ์ด์ƒํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ฏธ๋ž˜๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์™œ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฒด์ด๋‹์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒŒ ๋ฌด์Šจ ๋œป์ด์•ผ? ์ƒˆ๋กœ์šด ๋ฏธ๋ž˜๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ๋ฏธ๋ž˜? Rust๊ฐ€ ์ผ๋ฅ˜ ์‹œ๋ฏผ์œผ๋กœ์„œ ๊ทธ ๊ด€์šฉ๊ตฌ๋ฅผ ๊ฐ–๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์ด ์ •๋ง ์ผ๋ฐ˜์ ์ธ ๊ด€์šฉ๊ตฌ์ž…๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ •๋ง๋กœ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ดํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฉ”์„œ๋“œ (์˜ˆ : foo.await() )๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•œ ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ๋ฅผ ์†Œ๊ฐœํ•˜์ง€ ์•Š์œผ๋ฉฐ ์šฐ๋ฆฌ ๋ชจ๋‘ ๊ทธ ์˜๋ฏธ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๊ณผ ์—ฐ๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ •๋ง๋กœ ํ‚ค์›Œ๋“œ / loloperator๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋‚˜์ค‘์— ๊ทธ ์งˆ๋ฌธ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ ์œ„์น˜์—์„œ await ๋ฅผ ์‹ซ์–ด ํ•ฉ๋‹ˆ๋‹ค.

์ ‘๋‘์‚ฌ await ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ด์œ -์ž์—ฐ์–ด์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ "๋‚˜๋Š” ๋‹น์‹ ์˜ ๋„์ฐฉ์„ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JavaScript๋ฅผ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ์•ฝ๊ฐ„ ํŽธ๊ฒฌ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ await ์ฒด์ธ์ด ๊ณผ๋Œ€ ํ‰๊ฐ€๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ–ฅํ›„ ๊ฒฐํ•ฉ ์ž์— ๋น„ํ•ด async/await ์˜ ๊ฐ€์น˜๋Š” if , match ๋“ฑ๊ณผ ๊ฐ™์€ ํ‘œ์ค€ ์–ธ์–ด ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ๊ธฐ๋‹ค๋ฆผ์„ ๊นจ๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

async/await ๋Œ€ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ๋งˆ๋ฒ• ๊ตฌ๋ฌธ์„ ๊ตฌ์„ฑํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์–ธ์–ด์˜ ์ผ๋ถ€์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ์ œ์•ˆ ๋œ ๋ฉ”์†Œ๋“œ ๊ตฌ๋ฌธ (์˜ˆ : foo.await() )์€ IMO๊ฐ€ ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์— ๋„ˆ๋ฌด ์ง๊ตํ•˜๊ณ  ๋„ˆ๋ฌด ๋งˆ์ˆ  ์ ์ž…๋‹ˆ๋‹ค. proc-macro ๊ธฐ๊ณ„๊ฐ€ ์ œ์ž๋ฆฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋’ค์— ์ˆจ๊ฒจ ๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?

ํ•จ์ˆ˜ ๋ฐฉ์–ด์—์„œ async ๋Œ€์‹  await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค๋ฉด :

await fn foo(future: impl Future<Output = i32>) -> i32 {
    future
}

์ด await fn ๋Š” async ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async {
    let n = foo(bar());
}

๊ทธ๋ฆฌ๊ณ  let n = (await foo(bar())); ํƒˆ๋‹นํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ await ํ‚ค์›Œ๋“œ ์™ธ์—๋„ Future await ํŠธ๋ ˆ์ด ํŠธ๋Š” ํ›„์œ„ ์œ„์น˜์—์„œ await ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•œ await ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

async {
    let n = bar().awaited();
}

๋˜ํ•œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฐœ์ „๊ธฐ์™€์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? async / await ์ด (๊ฐ€) ์ƒ์„ฑ๊ธฐ๊ฐ€ ์•ˆ์ •ํ™”๋˜๊ธฐ ์ „์— ๊ตฌํ˜„๋œ๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

@phaazon ์ƒ์„ฑ๊ธฐ๊ฐ€ async / await ๋Œ€ํ•œ ๋‚ด๋ถ€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ Rust์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ธฐ์œ„ํ•œ ํ˜„์žฌ ๊ณ„ํš์€ ์—†์œผ๋ฉฐ ๋น„ ์‹คํ—˜์  RFC๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. (๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์•ˆ์ •๋˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ์ ์–ด๋„ 1 ~ 2 ๋…„ ์ •๋„ ๋‚จ์•˜์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ async / await ๊ฐ€ ์•ˆ์ •๋˜๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์•ฝ๊ฐ„์˜ ๊ฒฝํ—˜).

@XX ํ•จ์ˆ˜ ์ •์˜์—์„œ await ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด async ์˜ ์˜๋ฏธ๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค . ํ‘œ์ค€์„ ๊ณ ์ˆ˜ํ•ฉ์‹œ๋‹ค, ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@phaazon ์ด๊ฒƒ์ด async ์˜๋ฏธ๋ก ์„ ์–ด๋–ป๊ฒŒ ๊นจ๋œจ๋ฆฌ๋Š” ์ง€ ๋” ์ž์„ธํžˆ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” async ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ๊ฐ€ ๋  ๋ฌด์–ธ๊ฐ€๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  await ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ€์ง€๊ณ  ๊ทธ๋ž˜์„œ await ๋Œ€์‹  async ๋‚˜์—๊ฒŒ ์ข€ ์ด์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@phaazon ์•„๋‹ˆ์š”, ๋Œ€์‹  ์•„๋‹™๋‹ˆ๋‹ค. ์ „์ฒด ์˜ˆ :

async fn bar() -> i32 {
    5 // will be "converted" to impl Future<Output = i32>
}

await fn foo(future: impl Future<Output = i32>) -> i32 {
    future // will be "converted" to i32 in async context
}

async {
    let a = await bar(); // correct, a == 5
    let b = foo(bar()); // correct, b == 5
}

let c = foo(bar()); // error, can't call desugaring statement `await foo(bar())`

์œ ํšจํ•œ ๊ฒฝ์šฐ ์ฒด์ธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด await-method๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async {
    let n = first().awaited()?.second().awaited()?;
    // let n = (await (await first())?.second())?;
}

์ œ ์ƒ๊ฐ์—๋Š” ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋„ˆ๋ฌด ๋งˆ๋ฒ•์ ์ด๊ณ  ์–ธ์–ด์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ "๋Š๋‚Œ"์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .await() ๋˜๋Š” .await!() ๋ฉ”์„œ๋“œ ๊ตฌ๋ฌธ์„ ์ฑ„ํƒํ•˜๋ฉด Future ์—๋Š” .await() ๋˜๋Š” .await!() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Œ์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด์น˜์— ๋งž๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์— ๋ณธ ์ ์ด ์—†๋”๋ผ๋„ 5 ๋ถ„ ๋™์•ˆ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ์ž๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ (์ง€๊ธˆ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌ ํ•  ์ธํ”„๋ผ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ์™„์ „ํ•œ ์˜์‚ฌ ์ฝ”๋“œ).

trait AwaitChainable {
    fn await(self) -> impl Future;
}

impl<T: Future> AwaitChainable for T {
    fn await(self) -> impl Future {
        await self
    }
}

๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋ง์€, ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋“  ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋งˆ์ˆ ์ฒ˜๋Ÿผ postfix await๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋”๋ผ๋„ ์œ„์˜ ์˜ˆ์ œ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์šฐ๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ivandardi ์ €๋„ ๊ฐ™์€ ์ƒ๊ฐ์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ์ด ์ •์˜

fn await(self) -> impl Future {
    await self
}

ํ•จ์ˆ˜๊ฐ€ async -context์—์„œ๋งŒ ํ˜ธ์ถœ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@XX ๊ทธ๋ž˜, ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๊นจ์ง„ ์˜์‚ฌ ์ฝ”๋“œ๋ฅผ ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค : PI๋Š” ํ˜„์žฌ ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ๋ฌธ๊ณผ ํŠน์„ฑ์ด ์–ด๋–ป๊ฒŒ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ์ธํ”„๋ผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ.

@XX , @ivandardi ์ •์˜์— ๋”ฐ๋ผ await ๋Š” async ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค.

fn await(self) -> impl Future {
    await self
}

๋ฐ˜๋“œ์‹œ

async fn await(self) -> impl Future {
    await self
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ async ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

await future.await()

๋ชจ๋“  ๋ชฉ์ ์„ ๋ฌด๋„ˆ ๋œจ๋ฆฌ๋Š” ๊ฒƒ์ด์ฃ .

์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ async ์™„์ „ํžˆ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ivandardi ๋‚ด ๋ฒ„์ „์˜์ด ์ง„ํ™” :

fn await(self) -> T { // How to indicate using in async-context only?
    await self
}

```๋…น
await fn await (self)-> T {// ๋น„๋™๊ธฐ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
์ž์‹ ์„ ๊ธฐ๋‹ค๋ฆฌ๋‹ค
}

```rust
await fn await(self) -> T {
    self // remove excess await
}

@CryZe @XX ์™œ ๋‚˜์—๊ฒŒ ์•ผ์œ ํ•˜๋Š”๊ฑฐ์•ผ? ๋‚œ ๊ดœ์ฐฎ์•„.

๋‹น์‹ ์ด ๋ญ˜ ํ•˜๋ ค๋Š”์ง€ @XX (์˜ˆ ๋งŒ๋“ค ๋น„๋™๊ธฐ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์™„์ „ํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค await ์—์„œ ์–ด๋–ป๊ฒŒ ๋“  ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ async ๋ฌธ๋งฅ์„). ์–ธ์–ด ๊ฐœ๋ฐœ์ž๋“ค๋กœ๋ถ€ํ„ฐ ๋งŽ์€ ์ง€์›์„๋ฐ›์ง€ ๋ชปํ•  ๊ฒƒ ๊ฐ™์•„์š”

@EyeOfPython ์ด ์ •์˜๋Š” ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

async fn await(self) -> impl Future {
    await self
}

๋” ๊ฐ€๋Šฅ์„ฑ :

#[call_only_in_async_context_with_derived_await_prefix]
fn await(self) -> impl Future {
    self
}

์ด๊ฒƒ์ด ๊ฐ€์ƒ์˜ ์˜์‚ฌ ๊ตฌ๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ฌด์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๋ฐ˜๋Œ€ ํˆฌํ‘œ์ž…๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ๊ทธ๋“ค์˜ ์š”์ ์€ Rust๊ฐ€ ์–ธ์–ด๊ฐ€ ์ดํ•ดํ•˜๋Š” Drop ๋ฐ Copy์™€ ๊ฐ™์€ ํŠน์ˆ˜ ํŠน์„ฑ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด await ํ‚ค์›Œ๋“œ์ฒ˜๋Ÿผ ์œ ํ˜•๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ์œ ํ˜•์— .await ()๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํˆฌํ‘œ๋Š” ์–ด์จŒ๊ฑฐ๋‚˜ RFC์™€ ๊ด€๋ จ์ด์—†๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์š”์ ์€ ์—… ๋ณดํŠธ / ๋‹ค์šด ๋ณดํŠธ์— ์˜ํ•ด ์‹œ๊ฐํ™”๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ฃผ๊ด€์ ์ธ ๊ฐ์ •์— ๊ธฐ๋ฐ˜ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ๊ด€์ ์ธ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ํ•ด์•ผํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ ๋น„๋™๊ธฐ ๋Œ€๊ธฐ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ๋Š” ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด์ด ์Šค๋ ˆ๋“œ์—์„œ ์ œ์™ธํ•˜๊ณ  ์ „์šฉ RFC๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

@CryZe ํ•ด๋‹น ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ž˜๋ผ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ž˜ ์ „์— async / await๊ฐ€ ๋น„๋™๊ธฐ ์ฝ”๋“œ ๋ณ€ํ™˜๋งŒ์„ ๋ชฉํ‘œ๋กœํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋ผ๋Š” ๊ฒƒ์— ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ฐ”์ธ๋“œ ํ‘œ๊ธฐ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

@ivandari ๊ท€ํ•˜์˜ postfix await๋Š”

@ Matthias247 ๊ทธ๋“ค์ด ์ œ์•ˆํ•˜๋ ค๋Š” ๊ฒƒ์€ postfix๊ฐ€ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ๊ฐ–๋„๋ก ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด Rust๋Š” #, @ ๋˜๋Š” ...์™€ ๊ฐ™์€ ์ž„์˜์˜ ์ƒˆ ๊ธฐํ˜ธ๋ฅผ ๋„์ž… ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.? ์—ฐ์‚ฐ์ž์ด๋ฉฐ ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

let result = some_operation().await()?.some_method().await()?;

๋”ฐ๋ผ์„œ ์•„์ด๋””์–ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ผ๋ฐ˜ await ํ‚ค์›Œ๋“œ (์ด ๊ฒฝ์šฐ์—๋Š” ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ)์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ๋ณด๊ณ  ๋น„๋™๊ธฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” Future ํŠน์„ฑ์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ์ƒ์„ฑ๊ธฐ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ await some_future()? ๋กœ ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ ๋Œ€์‹  ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ ์ ˆํ•œ ๋…ผ๋ฆฌ์  ์ œ์–ด ํ๋ฆ„์„ ๊ฐ–๊ฒŒ๋˜๋ฉฐ ์ด์ƒํ•œ ์ƒˆ ๊ธฐํ˜ธ๋ฅผ ๋„์ž… ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

(๊ทธ๋ž˜์„œ tl; dr : ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ ‘๋ฏธ์‚ฌ ๋Œ€๊ธฐ์ž…๋‹ˆ๋‹ค)

์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์„ ๊ณ ๋ คํ•˜์—ฌ ๋ช…์‹œ ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ์˜ค๋ฅ˜ ๋ฐ ์˜ต์…˜ ๊ฒฐํ•ฉ ์ž์˜ ์œ ๋ณ‘๋ฅ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž๋™ ์—ญ ์ถ”์  ๋Œ€์‹  .map_err()? ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค :

let result = await reqwest::get(..).send();
let response = result.map_err(|e| add_context(e))?;
let parser = await response.json();
let parsed = parser.map_err(|e| add_context(e))?;

๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค (์–ด๋–ค ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ด ๊ณ ๋ ค๋˜๋Š”์ง€๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค) :

let parsed = reqwest::get(..)
    .send() await
    .map_err(add_context)?
    .json() await
    .map_err(add_context)?;

_ํ•˜์ง€๋งŒ _์ด ๊ธฐ๋ณธ ์„œ์‹์—๋Š” ๋‹ค์ค‘ ๋ณ€์ˆ˜ ์ ‘๊ทผ ๋ฐฉ์‹๋ณด๋‹ค ๋งŽ์€ ํ–‰์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์ค‘ ๋Œ€๊ธฐ๊ฐ€์—†๋Š” ํ‘œํ˜„์‹์€ postfix-await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ง ๊ณต๊ฐ„์„ ๋œ ์ฐจ์ง€ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์ง€์—์„œ ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Œ“์•„ ๋‘ ์–ด์„œ ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋” ์œ ์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ ์ธ์ฒด ๊ณตํ•™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„ค, ๊ทธ๊ฒŒ ์ œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์ž…๋‹ˆ๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์„ ํƒํ•  ์ˆ˜์žˆ๋Š” ๋‘ ์„ธ๊ณ„์˜ ์žฅ์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@XX ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜์กดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ์ธก๋ฉด์—์„œ๋Š” ํ”ผ์ƒ์  ์ธ ์ดํ•ด ์ผ์ง€๋ผ๋„ ์ด์ „์— ๊ฒŒ์‹œ ํ•œ ์„ค๋ช…์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@CryZe , @XX ,

์ฒ˜์Œ์—๋Š” ๋ถ€๋“œ๋Ÿฝ์ง€๋งŒ Rust ์ฒ ํ•™๊ณผ๋Š” ์ „ํ˜€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด sort ๋ฐ˜๋ณต์ž์— ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค ๋ฐ˜ํ™˜ ํ•  self ๋ฐ ํœด์‹ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ฒด์ธ ํ• ๋‹น์„ ๋ช…์‹œ ์ ์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์€ ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ตฌ๋ณ„ ํ•  ์ˆ˜์—†๋Š” ์™„์ „ํžˆ ์•”์‹œ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. IMO๋Š” ๊ธฐํšŒ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋„ค, ๊ทธ๊ฒŒ ์ œ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”์ž…๋‹ˆ๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€ ์„ ํƒํ•  ์ˆ˜์žˆ๋Š” ๋‘ ์„ธ๊ณ„์˜ ์žฅ์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™œ ๊ทธ๊ฒƒ์ด ๋ชฉํ‘œ ์—ฌ์•ผํ•ฉ๋‹ˆ๊นŒ? Rust๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์ œ์–ด ํ๋ฆ„ (์˜ˆ : break , continue , if ๋“ฑ)์— ๋Œ€ํ•ด์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ์˜๊ฒฌ์œผ๋กœ๋Š” ๋” ๋ฉ‹์ง€๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ await ๋Š” ๋งค์šฐ ํŠน๋ณ„ํ•˜๋ฉฐ ์ผ๋ฐ˜์ ์ธ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๋ชจ๋‘์—๊ฒŒ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  • ๋””๋ฒ„๊ฑฐ๋Š” ์Šคํƒ์ด ํ’€๋ฆฌ๊ณ  ๋‹ค์‹œ ์„ค์ • ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ…Œํ•‘์ด ๋Œ€๊ธฐ ํ•  ๋•Œ ์ด์ƒํ•˜๊ฒŒ ๋™์ž‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ธฐ์–ตํ•˜๋Š” ํ•œ C # ๋ฐ Javascript์—์„œ ๋น„๋™๊ธฐ ๋””๋ฒ„๊น…์„ ์ž‘๋™ํ•˜๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค์€ ๋””๋ฒ„๊ฑฐ์—์„œ ์ผํ•˜๋Š” ์œ ๋ฃŒ ํŒ€์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค!
  • ๋Œ€๊ธฐ ์ง€์ ์„ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋Š” ๋กœ์ปฌ ๊ฐœ์ฒด๋Š” ์‹ค์ œ OS ์Šคํƒ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ๋“ค์€ ์ƒ์„ฑ ๋œ ๋ฏธ๋ž˜๋กœ ์˜ฎ๊ฒจ ์ ธ์•ผํ•˜๋Š”๋ฐ, ๊ฒฐ๊ตญ ํ•„์š”ํ•œ ํž™ ๋ฉ”๋ชจ๋ฆฌ (๋ฏธ๋ž˜๊ฐ€ ์‚ฌ๋Š” ๊ณณ)์— ์ฐจ์ด๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • await ํฌ์ธํŠธ๋ฅผ ํ†ตํ•œ ์ฐจ์ž…์€ ์ƒ์„ฑ ๋œ ์„ ๋ฌผ์ด !Unpin ์ด์–ด์•ผํ•˜๋Š” ์ด์œ ์ด๋ฉฐ, ๊ธฐ์กด ๊ฒฐํ•ฉ ์ž ๋ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ค‘ ์ผ๋ถ€์— ๋งŽ์€ ๋ถˆํŽธ์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์— ๋นŒ๋ฆฌ์ง€ ์•Š๋Š” async ๋ฉ”์†Œ๋“œ์—์„œ Unpin ์„ ๋ฌผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ž ์žฌ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await ๊ฐ€ ๋ณด์ด์ง€ ์•Š์œผ๋ฉด ๊ฒฐ์ฝ” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • async / await์˜ ํ˜„์žฌ ์ƒํƒœ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ฐจ์šฉ ๊ฒ€์‚ฌ๊ธฐ ๋ฌธ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

C #์— ๋Œ€ํ•ด ์ œ๊ณตํ•˜๋Š” ์˜ˆ์ œ๋Š” ์ „์ ์œผ๋กœ ํ•„์ˆ˜์ ์ด๋ฉฐ Rust์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์  ์Šคํƒ€์ผ์˜ ๊ธด ์ฒด์ธ๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด LINQ ๊ตฌ๋ฌธ์€ DSL ์ผ ๋ฟ์ด๋ฉฐ, ์ œ๊ฐ€ ์กฐ๊ธˆ๋งŒ ์‚ดํŽด๋ณธ foo().bar().x().wih_boo(x).camboom().space_flight(); ์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. C # ์ฝ”๋“œ ์˜ˆ์ œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ธ๊ธฐ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 100 % ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ langue X๊ฐ€ํ–ˆ๋˜ ๊ฒƒ์„ ๋ฐ›์•„ ๋“ค์ผ ์ˆ˜์—†๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ๋˜‘๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

IMO ์ ‘๋‘์‚ฌ ํ‘œ๊ธฐ๋ฒ•์€ ๋ช…๋ นํ˜• ์ฝ”๋”ฉ ์Šคํƒ€์ผ์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust๋Š” ๋‘ ๊ฐ€์ง€ ์Šคํƒ€์ผ์„ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์Šค์ผ€์ด๋“œ

๋‚˜๋Š” ๊ธฐ๋Šฅ์  ์Šคํƒ€์ผ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹น์‹ ์˜ ์˜๊ฒฌ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด-๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ์‹œ๋‹ค.

@ Matthias247 ์•„๋‹ˆ์š”, ์–ผ๋งˆ๋‚˜ ๋ฉ‹์ง„ ์ง€ ๋‹ค๋ฅธ ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Rust๊ฐ€ ์—ฐ๊ฒฐ์„ ๊ถŒ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "์˜ค, ๋‹ค๋ฅธ ์ œ์–ด ํ๋ฆ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์—๋Š” ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ด ์—†๋Š”๋ฐ ์™œ await๊ฐ€ ํŠน๋ณ„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Œ, ๊ทธ๊ฑด ์ž˜๋ชป๋œ ํ‰๊ฐ€์ž…๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ ์ œ์–ด ํ๋ฆ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๋‚ด๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค. Option::unwrap_or ๋Š” postfix match ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Iterator::filter ๋Š” ์ ‘๋ฏธ์‚ฌ if ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ œ์–ด ํ๋ฆ„์ด ์—ฐ๊ฒฐ ๊ตฌ๋ฌธ ์ž์ฒด์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ ํ•ด์„œ ์ด๋ฏธ ์ ‘๋ฏธ์‚ฌ ์ œ์–ด ํ๋ฆ„์ด ์—†๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ด€์ ์—์„œ, await ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ๊ฒƒ๊ณผ ์ผ์น˜ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Iterator ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๋” ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์›์‹œ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€์‹  Future::await_or ์™€ ๊ฐ™์€ await ๊ฒฐํ•ฉ์ž๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“  ์ ‘๋ฏธ์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ์™ธ๋ชจ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ๊ณผ ์‚ถ์˜ ์งˆ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ try!() ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

@dpc

C #์— ๋Œ€ํ•ด ์ œ๊ณตํ•˜๋Š” ์˜ˆ์ œ๋Š” ์ „์ ์œผ๋กœ ํ•„์ˆ˜์ ์ด๋ฉฐ Rust์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์  ์Šคํƒ€์ผ์˜ ๊ธด ์ฒด์ธ๊ณผ ๊ฐ™์€ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. LINQ ๊ตฌ๋ฌธ์€ DSL ์ผ ๋ฟ์ด๋ฉฐ foo (). bar (). x (). wih_boo (x) .camboom (). space_flight (); ์ €๋Š” ์•ฝ๊ฐ„์˜ ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰์„ ํ•ด๋ดค๊ณ , C # ์ฝ”๋“œ ์˜ˆ์ œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ธ๊ธฐ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 100 % ํ•„์ˆ˜๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ langue X๊ฐ€ํ–ˆ๋˜ ๊ฒƒ์„ ๋ฐ›์•„ ๋“ค์ผ ์ˆ˜์—†๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ๋˜‘๊ฐ™์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹ˆ์ง€๋งŒ (์˜ˆ๋ฅผ ๋“ค์–ด polly ์™€ ๊ฐ™์€ ์–ด๋–ค ํ”„๋ ˆ์ž„ ์›Œํฌ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค), ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‘ ์–ธ์–ด ๋ชจ๋‘์—์„œ ๋งŽ์€ ์ฒด์ธ ์ฝ”๋“œ๋ฅผ ๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฅธ ๋งŒ๋“œ๋Š” ์ผ์ด์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ Try ํŠน์„ฑ์ด๋ผ๊ณ ํ•ฉ๋‹ˆ๋‹ค. C #์€ ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ์—†์œผ๋ฏ€๋กœ await ํฌ์ธํŠธ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜ธ์ถœ์ž๋ฅผ ์œ„ํ•ด ์ž๋™์œผ๋กœ ๋ž˜ํ•‘๋˜๊ณ  ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

? ์—ฐ์‚ฐ์ž๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” Rust์˜ ๊ฒฝ์šฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

await ํฌ์ธํŠธ๋ฅผ ๋„˜์–ด์„œ์•ผํ•˜๋Š” ๊ฒฝ์šฐ "๊ฒฐํ•ฉ ๋œ"์—ฐ์‚ฐ์ž await? , ํ™•์žฅ ์–ธ์–ด ๊ทœ์น™ ๋“ฑ์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ await ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ์™ธ๊ณ„์ธ ๊ตฌ๋ฌธ์ด์ง€๋งŒ ๋ˆ„๊ฐ€ ์‹ ๊ฒฝ ์“ฐ๋‚˜์š”?).

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ํ˜„์žฌ postfix๊ฐ€ ๋” ์‹ค์šฉ์ ์ธ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์œ ์ผํ•œ ์ œ์•ˆ์€ await() ๋˜๋Š” await!() ์•„๋‹Œ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ ๋œ ์ „์šฉ ํ‚ค์›Œ๋“œ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

์ •์ƒ์ ์ธ .await () ๋ฉ”์„œ๋“œ๋ฅผ ์ •๋‹นํ™”ํ•˜๋Š” ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋‹ค๋ฅธ ์ฐจ๋‹จ ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. .await () ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด (๋…น์ƒ‰ ์ผ ์ˆ˜ ์žˆ์Œ) ์Šค๋ ˆ๋“œ์˜ ์‹คํ–‰์ด ์ค‘์ง€๋˜๊ณ  ์‹คํ–‰์ค‘์ธ ๋Ÿฐํƒ€์ž„์ด ์–ด๋Š ์‹œ์ ์—์„œ ์Šค๋ ˆ๋“œ ์‹คํ–‰์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Mutex ๋˜๋Š” std ์ฑ„๋„์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์˜๋„์™€ ๋ชฉ์ ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let result = my_channel().recv()?.iter().map(...).collect();

๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฏธ๋ž˜ :

let result = my_future().await()?.iter().map(...).collect();

๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ฐ๊ฐ์˜ recv () / await ()์—์„œ ์‹คํ–‰์„ ์ฐจ๋‹จํ•˜๊ณ  ๋‘˜ ๋‹ค ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฐจ์ด์ ์€ await ()๊ฐ€ OS์˜ ๋ฌด๊ฑฐ์šด ์Šค๋ ˆ๋”ฉ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์‹คํ–‰๊ธฐ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์‹คํ–‰๊ธฐ์˜ ๊ฒฝ์šฐ์—๋Š” ๋งค์šฐ ์ ํ•ฉ ํ•  ์ˆ˜ ์žˆ์Œ). ๋”ฐ๋ผ์„œ ๋งŽ์€ ์–‘์˜ ์—ฐ๊ฒฐ์„ ๋ง‰๋Š” ๊ฒƒ์€ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ ์‹ค์ œ ๋ณดํ‘ธ๋ผ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ ๋‚ด ์š”์ ์€์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๊ด€์ ์—์„œ .recv () ๋˜๋Š” .await ()์— ํฐ ์ฐจ์ด๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์‹คํ–‰์„ ์ฐจ๋‹จํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. . ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์˜๋„์™€ ๋ชฉ์ ์„ ์œ„ํ•ด ๊ฑฐ์˜ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์™„์ „ํ•œ ํ‚ค์›Œ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Mutex ๋ฐ std ์ฑ„๋„์— ๋Œ€ํ•œ recv ๋˜๋Š” lock ํ‚ค์›Œ๋“œ๋„ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ rustc์€ ๋ถ„๋ช…ํžˆ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ๊ธฐ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ์–ธ์–ด ๊ด€์ ์—์„œ ์˜๋ฏธ ์ƒ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์‹ค์ œ OS ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์—ฌ await๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” rustc์— ๋Œ€ํ•œ ๋Œ€์ฒด ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค (๋น„๋™๊ธฐ fn์„ ์ž…๋ ฅํ•˜๋ฉด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ ํ•œ ๋‹ค์Œ awaiting์ด ํ•ด๋‹น ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค). ์ด๋Š” ๋งค์šฐ ์ˆœ์ง„ํ•˜๊ณ  ๋Š๋ฆฐ ๊ตฌํ˜„์ด์ง€๋งŒ ์˜๋ฏธ ์ƒ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ค์ œ rustc๊ฐ€ ์ƒ์„ฑ๊ธฐ๋กœ ๋Œ€๊ธฐํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์˜๋ฏธ ์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์‹ค์ œ๋กœ rustc๊ฐ€ .await () ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์ƒ์„ฑ๊ธฐ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด rustc์˜ ์ตœ์ ํ™” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด .await ()๊ฐ€ ์™„์ „ํ•œ ๋ฐฉ๋ฒ•์ด๊ณ  ์™„์ „ํ•œ ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์ •๋‹นํ™” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ rustc๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋กœ ๋ฐ”๊พธ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@CryZe .recv() ์™€ ๋‹ฌ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ await ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ค‘๋‹จ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ await ์˜†์—์žˆ๋Š” ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํฐ ์ฐจ์ด์ด๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ await ๋ฌต์‹œ์ ์œผ๋กœํ•˜์ง€ ๋ง์•„์•ผํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ€์น˜์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

@ I60R ํ‚ค์›Œ๋“œ๋กœ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ๋œ ๋ช…์‹œ ์ ์ด ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›ํ•œ๋‹ค๋ฉด IDE์—์„œ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ•์กฐ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค์›Œ๋“œ๋ฅผ ์ ‘๋ฏธ์‚ฌ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด ์‹ค์ œ๋กœ ๋†“์น˜๊ธฐ๊ฐ€ ๋œํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค (์ •ํ™•ํžˆ ์‹คํ–‰์ด ์ค‘์ง€๋˜๋Š” ์œ„์น˜์— ์žˆ์Œ).

๋ฏธ์นœ ์•„์ด๋””์–ด : ์•”์‹œ ์  ๋Œ€๊ธฐ . ์ด ์Šค๋ ˆ๋“œ๋Š” ์ด๋ฏธ ์ ‘๋ฏธ์‚ฌ ๋Œ€ ์ ‘๋‘์‚ฌ ํ† ๋ก ์œผ๋กœ ๋„ˆ๋ฌด ๋ฐ”๋น ์„œ ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

@CryZe

์ •์ƒ์ ์ธ .await () ๋ฉ”์„œ๋“œ๋ฅผ ์ •๋‹นํ™”ํ•˜๋Š” ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋‹ค๋ฅธ ์ฐจ๋‹จ ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/issues/57640#issuecomment -456147515๋ฅผ ๋‹ค์‹œ ์ฝ์œผ์‹ญ์‹œ์˜ค.

@ Matthias247 ์ด๊ฒƒ๋“ค์€ ์•„์ฃผ ์ข‹์€ ์ ์ž…๋‹ˆ๋‹ค.

await๋ฅผ ํ•จ์ˆ˜, ๋ฉค๋ฒ„ ๋˜๋Š” ์•”์‹œ ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ์ด ๋ชจ๋“  ์ด์•ผ๊ธฐ๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ–‰๋™์ด ์•„๋‹ˆ๋ผ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

๋†’์€ ์ˆ˜์ค€์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ‚ค์›Œ๋“œ ๋˜๋Š” ๋งคํฌ๋กœ๋ฅผ ํ†ตํ•ด await ํ‘œํ˜„์‹์„ ํŠน์ˆ˜ ์ƒ์„ฑ๊ธฐ yield ํ‘œํ˜„์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ๊ทธ ์ž๋ฆฌ์—์„œ ์ฐจ์šฉ ๋ฐ ๊ธฐํƒ€ ์ž‘์—…์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ช…์‹œ ์  ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•œ ํ‚ค์›Œ๋“œ์ฒ˜๋Ÿผ ๋ณด์ด๊ฑฐ๋‚˜ ๋ถ„๋ช…ํžˆ ๋งคํฌ๋กœ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋งˆ๋ฒ•์˜ ๋ฐฉ๋ฒ•, ํŠน์„ฑ, ํšŒ์› ๋“ฑ์€ ํŠนํžˆ ์‹ ๊ทœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„ˆ๋ฌด๋‚˜ ์‰ฝ๊ฒŒ ์˜คํ•ดํ•˜๊ฑฐ๋‚˜ ์˜คํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ await ๋˜๋Š” ์ ‘๋‘์–ด ๋งคํฌ๋กœ await๋Š”์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์–ธ์–ด๊ฐ€ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ข‹๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ—‰ํ—‰

๋งˆ๋ฒ•์˜ ๋ฐฉ๋ฒ•, ํŠน์„ฑ, ํšŒ์› ๋“ฑ์€ ํŠนํžˆ ์‹ ๊ทœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„ˆ๋ฌด๋‚˜ ์‰ฝ๊ฒŒ ์˜คํ•ดํ•˜๊ฑฐ๋‚˜ ์˜คํ•ดํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ .await!() ๋ณ€ํ˜•์— ๋Œ€ํ•ด ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์— foo.await!() ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ํŠนํžˆ ์ ์ ˆํ•œ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ๊ธฐ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด์‹œํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์˜ ์˜๋ฏธ๋ฅผ ์˜คํ•ด? ๊ธฐ๋ณธ์ ์œผ๋กœํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (mystakes ์œ ํ˜• ๋ฌด์‹œ).

trait Future {
    fn await!(self) -> Self::Item {
        await self
    }
}

AKA await this_foo ๋ฐ this_foo.await!() ๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์˜คํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž์˜ ์ฃผ์ œ์— ๋Œ€ํ•ด : ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐฐ๊ฒฝ์ด์žˆ๋Š” Rust๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๊นŒ? ์ „์ž์˜ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์˜์‹ฌ ์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ, ํ˜ผ๋ž€์—†์ด postfix await (์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ)์˜ ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ ‘๋‘์‚ฌ await ๋งŒ ์ถ”๊ฐ€๋˜๋ฉด ๋‚ด๊ฐ€ ์•„๋Š” ์–ด๋–ค ๊ฒƒ๋„ Rust ์ฝ”๋“œ ํ˜•์‹์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ƒ์„ฑ์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค

foo.bar().baz().quux().await!().melo().await!()

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์„

await (await foo.bar().baz().quux()).melo()

๋ฟก ๋นต๋€จ

.await!() ๋Š” ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ข‹์œผ๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด await!(...) ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

macro_rules! await {
    // prefix
    ($fut:expr) => {...}

    // postfix
    ($self:Self) => { await!($self) }
}

๊ทธ๋Ÿฌ๋‚˜ postfix ๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ๋Š” ํ˜„์žฌ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฏธ๋ž˜์— ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ง€๊ธˆ์€ await!(...) ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ตฌํ˜„ ๋  ๋•Œ ๋‚˜์ค‘์— ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋งคํฌ๋กœ๋ฅผ ๋ชจ๋‘ ๊ฐ–๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด์ง€๋งŒ ์•ž์œผ๋กœ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ๊ตฌํ˜„ํ•  ์˜๋„๊ฐ€ ์—†๋‹ค๋ฉด ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ await ๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ• ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@novacrazy ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋™์˜ ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚˜์˜ ์›๋ž˜ ์ œ์•ˆ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ await!() ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ฐˆ ๋•Œ ์ ‘๋ฏธ์‚ฌ ์–‘์‹์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ์˜ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด์„œ๋„ ๋…ผ์˜ํ•˜๊ณ  ์–ธ์–ด์—์„œ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜๊ธฐ ์ „์— .await!() ์ ‘๋ฏธ์‚ฌ๋ฅผ ์–ธ์–ด์— ์ž„์‹œ๋กœ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋…ผ์˜ํ•˜์‹ญ์‹œ์˜ค. ? ๋ฐ Try ํŠน์„ฑ์—์„œ ์ผ์–ด๋‚œ ์ผ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ํŠน์ˆ˜ ์‚ฌ๋ก€๋กœ ์ถ”๊ฐ€๋˜๊ณ  ๋‚˜์ค‘์— ๋” ์ผ๋ฐ˜์ ์ธ ์‚ฌ๋ก€๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ์ •ํ•  ๋•Œ์ฃผ์˜ํ•ด์•ผ ํ•  ์œ ์ผํ•œ ๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์ด๋ฉฐ, ๋ณ„๋„์˜ ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ await ๋˜๋Š” ์ ‘๋‘์–ด ๋งคํฌ๋กœ await๋Š”์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ• ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ์–ธ์–ด๊ฐ€ ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ _workable_์ด์ง€๋งŒ ๋‘ ๊ฐ€์ง€ ์ฃผ์žฅ ๋งŒ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์„ค๋“๋ ฅ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทธ๊ฒƒ์ด ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

    • ๋ฉ‹์ง€์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” await ๋Œ€์‹  not-running-unless- poll ed ๊ฐ™์€ ์ผ์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด rust๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด

  • ์‚ฌ๋žŒ๋“ค์€ ์ค„ ์‹œ์ž‘ ๋ถ€๋ถ„์— await ๋ฅผ ๋ณด๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

    • ํ•˜์ง€๋งŒ ํ•ญ์ƒ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฒƒ์ด ์œ ์ผํ•œ ๊ณณ์ด๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    • ๊ทธ๊ฒƒ์€๋ณด๊ณ  ๊ทธ๋ƒฅ ์‰ฝ๊ฒŒ๋กœ์˜ await ์ž…๋ ฅ S foo(aFuture.await, bFuture.await) ๊ฐ€์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ ‘๋‘์‚ฌ

    • Rust์—์„œ ์ œ์–ด ํ๋ฆ„์„ ์‚ดํŽด๋ณด๋ฉด ์ด๋ฏธ ? ๋ผ์ธ์˜ _end_๋ฅผ ์Šค์บ”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ญ ๋†“์นœ ๊ฑฐ ์—†๋‹ˆ?

๋…ผ์Ÿ์ด "์•„, ๊ทธ๊ฒƒ๋“ค์€ ๊ฑฐ์˜ ๊ฐ™๋‹ค"์˜€๋‹ค๋ฉด, ๋‚˜๋Š” "๊ธ€์Ž„, ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ดํ•˜๋Š” ์ผ์„ํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ์ข‹์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค"์— ์ ˆ๋Œ€์ ์œผ๋กœ ๋™์˜ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€์žˆ๋Š” ๊ณณ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@scottmcm ์˜ˆ, "์•„, ๊ทธ๋“ค์€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค." ์ ์–ด๋„ ์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ฐ€๋…์„ฑ, ์นœ์ˆ™ ํ•จ, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ์„ฑ๋Šฅ์˜ ์ ์ ˆํ•œ ๊ท ํ˜•์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ ์ฃผ์„์˜ ์ง„์ˆ ์€ await!() ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜์ค‘์— ํ›„์œ„ ๋ฉ”์„œ๋“œ ๋งคํฌ๋กœ ( .await!() )๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ง€๋ฃจํ•œ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ await ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ฐธ์ž…๋‹ˆ๋‹ค

์ง€๋ฃจํ•จ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ์ง€๋ฃจํ•˜๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ตฌ๋ฌธ ์ž์ฒด์—์„œ ๋ฒ—์–ด๋‚˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

f.await() ๊ฐ€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž๋กœ์„œ ์ €๋Š” ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์— ๋ฌธ๋ฒ• ๊ทœ์น™์ด ๋ช‡ ๊ฐœ ๋ฐ–์— ์—†๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ,์ด ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ผ์„ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜๊ฒŒ ์ถ”๋ก  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์ €๊ธฐ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค . Rust์—์„œ async ๋Š” ์ฒ˜์Œ์— ์žˆ๊ณ , await ๋Š” ์˜ˆ์™ธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ f await , ๊ฒŒ์‹œ๋ฌผ ํ‚ค์›Œ๋“œ ํ˜•์‹์€๋ฉ๋‹ˆ๋‹ค. f.await ๋Š” ์˜ˆ์™ธ ์ธ ํ•„๋“œ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. f.await!() ์—๋Š” ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ์–ธ์–ด๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— ์ข‹์€ ์˜ˆ์™ธ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ๋ฌธ์ด ์ผํšŒ์„ฑ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹Œ ๊ทœ์น™ ์ด๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์—†์Šต๋‹ˆ๋‹ค.

  2. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ? ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๋ฉด ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. f()?.map() ๋Š” compute f ()์™€ ๊ฑฐ์˜ ๋น„์Šทํ•˜๋ฉฐ์ด ๊ฒฐ๊ณผ๊ฐ€ ์ข‹์€๊ฐ€์š”? ์—ฌ๊ธฐ์—์„œ ? ๋Š” ๊ทธ ์ž์ฒด๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ f await ์™œ ์ ‘๋ฏธ์‚ฌ์ž…๋‹ˆ๊นŒ?, f.await ๊ฒฝ์šฐ await ํ•„๋“œ, f.await!() ์™œ ๋งคํฌ๋กœ๊ฐ€ ํ•ด๋‹น ์œ„์น˜์— ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ๋ฌป์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์–ธ๋œป๋ณด๊ธฐ์—๋Š” ์„ค๋“๋ ฅ ์žˆ๊ณ  ์ง๊ด€์  ์ธ ๊ฐ๊ฐ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  3. ์ฒซ ๋ฒˆ์งธ ์š”์ ์„ ํ™•์žฅํ•˜๋ฉด Rust๋Š” ์‹œ์Šคํ…œ ์–ธ์–ด๊ฐ€๋˜๊ธฐ๋ฅผ ๊ฐ€์žฅ ์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ์š” ํ”Œ๋ ˆ์ด์–ด ์ธ C / C ++ / Go / Java๋Š” ๋ชจ๋‘ ๋‹ค์†Œ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๋ช…๋ นํ˜• ์–ธ์–ด, C / Python / Java, Haskell ๋“ฑ์œผ๋กœ ๊ฒฝ๋ ฅ์„ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์ž์™€ ์ฐจ์„ธ๋Œ€ ๊ฐœ๋ฐœ์ž๊ฐ€ Rust๋ฅผ ์ฑ„ํƒํ•˜๋„๋ก ์„ค๋“ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Rust๋Š” ๋จผ์ € ๋ช…๋ นํ˜• ์Šคํƒ€์ผ์—์„œ ์ž˜ํ•˜๊ณ  ๊ทธ๋‹ค์Œ์—๋Š” ๊ธฐ๋Šฅ์ ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งค์šฐ ๊ธฐ๋Šฅ์ ์ด์ง€๋งŒ ์ต์ˆ™ํ•œ ๋ช…๋ น ์  ๋Š๋‚Œ์ด ์—†์Šต๋‹ˆ๋‹ค.

  4. ์ฒด์ธ์„ ๋ถ„ํ• ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ค„๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์žฅํ™ฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋ช…์‹œ ์  ์ž…๋‹ˆ๋‹ค.

ํ† ๋ก ์ด ํ•œ ๋ฐฉํ–ฅ์—์„œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ (์ ‘๋‘์‚ฌ ๋Œ€ ์ ‘๋ฏธ์‚ฌ)์œผ๋กœ ์ง€์†์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณผ ๋•Œ await ํ‚ค์›Œ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฐ•ํ•œ ์˜๊ฒฌ์ด ์ƒ๊ฒจ ์™„์ „ํžˆ ํ›„ํ‡ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ํ˜„์žฌ ์Šค๋ ˆ๋“œ์— ๊ฒŒ์‹œ ๋œ ๋ชจ๋“  ์˜๊ฒฌ ์ค‘์—์„œ ๋งค์šฐ ์ข‹์€ ํƒ€ํ˜‘์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋‹ค์Œ ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

// syntax below is exactly the same as with prefix `await`
let response = go client.get("https://my_api").send();
let body: MyResponse = go response.into_json();

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ํŠน์ • ์ƒ๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์˜ค๋ฅ˜์—†์ด ์ผ๋ฐ˜ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

// code below don't compiles because `?` takes precedence over `go`
let response = go client.get("https://my_api").send()?;
let body: MyResponse = go response.into_json()?;

๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์—์„œ๋Š” ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ์ง€์—ฐ๋œ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž ๊ตฌ๋ฌธ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

// now `go` takes precedence over `?` if present
let response = client.get("https://my_api").go send()?;
let body: MyResponse = response.go into_json()?;

๊ทธ๊ฒŒ ๋‹ค์•ผ.


์ด์ œ ๋” ๋งŽ์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

    Ok(user)
}

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

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

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

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

๊ตฌ๋ฌธ ๊ฐ•์กฐ๊ฐ€ ํ™œ์„ฑํ™” ๋œ ์Šคํฌ์ผ๋Ÿฌ ๋ฒ„์ „ ์•„๋ž˜์— ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

    Ok(user)
}

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

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

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

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


IMO์ด ๊ตฌ๋ฌธ์€ ๋ชจ๋“  ์ธก๋ฉด์—์„œ ๋Œ€์•ˆ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

โœ“ ์ผ๊ด€์„ฑ : Rust ์ฝ”๋“œ ๋‚ด๋ถ€์—์„œ ๋งค์šฐ ์œ ๊ธฐ์ ์œผ๋กœ ๋ณด์ด๋ฉฐ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๊นจ์ง€ ์•Š์•„๋„๋ฉ๋‹ˆ๋‹ค.
โœ“ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ์„ฑ : ์ฒด์ธ ๋ฐ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ Rust ๊ธฐ๋Šฅ๊ณผ ์ž˜ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
โœ“ ๋‹จ์ˆœ์„ฑ : ์งง๊ณ  ์„ค๋ช… ์ ์ด๋ฉฐ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ ๋ฉฐ ์ž‘์—…ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
โœ“ ์žฌ์‚ฌ์šฉ ์„ฑ : ์ง€์—ฐ๋œ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž ๊ตฌ๋ฌธ์€ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ๋„ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
โœ“ ๋ฌธ์„œ : ํ˜ธ์ถœ ์ธก ๋””์ŠคํŒจ์น˜๊ฐ€ ์–ด๋”˜๊ฐ€์— ํ๋ฅด๊ณ  ๋ฐ˜ํ™˜ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
โœ“ ์ต์ˆ™ ํ•จ : ์ด๋ฏธ ์ต์ˆ™ํ•œ ํŒจํ„ด์„ ์ œ๊ณตํ•˜์ง€๋งŒ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๊ฐ€ ์ ์Šต๋‹ˆ๋‹ค.
โœ“ ๊ฐ€๋…์„ฑ : ํ‰์ดํ•œ ์˜์–ด๋กœ ์ฝ๊ณ  ๋‹จ์–ด์˜ ์˜๋ฏธ๋ฅผ ์™œ๊ณกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
โœ“ ๊ฐ€์‹œ์„ฑ : ์œ„์น˜๋กœ ์ธํ•ด ์ฝ”๋“œ ์–ด๋”˜๊ฐ€์—์„œ ์œ„์žฅํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
โœ“ ์ ‘๊ทผ์„ฑ : ๋งค์šฐ ์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
โœ“ ์ž˜ ํ…Œ์ŠคํŠธ ๋จ : golang์€ ์š”์ฆ˜ ๋น„์Šทํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ์ธ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
โœ“ ๋†€๋ผ์›€ : ๊ตฌ๋ฌธ์„ ๋‚จ์šฉ ํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜คํ•ดํ•˜๊ธฐ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
โœ“ ๋งŒ์กฑ : ์ ์€ ์–‘์˜ ํ•™์Šต ํ›„์— ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ๊ณผ์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


ํŽธ์ง‘ : @ivandardi ๊ฐ€ ์•„๋ž˜ ์ฃผ์„์—์„œ ์ง€์ ํ–ˆ๋“ฏ์ด ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

1. ์˜ˆ,์ด ๊ตฌ๋ฌธ์€ ๋ˆˆ์œผ๋กœ ํŒŒ์‹ฑํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ต์ง€๋งŒ ๋™์‹œ์— ๊ฐ€๋…์„ฑ ๋ฌธ์ œ๊ฐ€์—†๋Š” ๊ตฌ๋ฌธ์„ ์—ฌ๊ธฐ์—์„œ ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. go ๊ตฌ๋ฌธ ๋‚ด๊ฒŒ๋Š” ์ ‘๋‘์‚ฌ์™€ ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ ๋…„๋Œ€์— ์ ‘๋‘์‚ฌ ์œ„์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๊ธฐ์— ์ ์€ ์•…์„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค await , ์ด์—ฐ ์œ„์น˜๋Š” ์ ‘๋ฏธ์‚ฌ์— ๋น„ํ•ด IMO ๋” ์ฝ๊ธฐ์˜ await ์˜ˆ :

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

await ์€ (๋Š”) ๋ชจํ˜ธํ•ด ๋ณด์ด๊ณ  ๊ธฐ์กด์˜ ๋ชจ๋“  ํ‚ค์›Œ๋“œ์™€ ๋‹ค๋ฅธ ์—ฐ๊ด€์„ฑ์„ ๊ฐ–์ง€๋งŒ ํ–ฅํ›„ ์–ธ์  ๊ฐ€ await ๋ธ”๋ก์„ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋ฉด ์ฐจ๋‹จ๊ธฐ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

2. RFC ์ƒ์„ฑ, "์ง€์—ฐ๋œ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž"๊ตฌ๋ฌธ์˜ ๊ตฌํ˜„ ๋ฐ ์•ˆ์ •ํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์ง€๋งŒ ๋น„๋™๊ธฐ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ฃผ๋œ ๋™๊ธฐ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3. "์ง€์—ฐ๋œ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž"๊ตฌ๋ฌธ ํ‚ค์›Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธด ํ‚ค์›Œ๋“œ๋Š” ๊ฐ€๋…์„ฑ์— ์ข‹์ง€ ์•Š์€ ๋ณ€์ˆ˜์™€ ๋ฉ”์†Œ๋“œ ์‚ฌ์ด์˜ ๊ณต๊ฐ„์„ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค.
  • ๊ธด ํ‚ค์›Œ๋“œ๋Š” ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ด์ƒํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค.
  • long ํ‚ค์›Œ๋“œ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ๋™๊ธฐํ™” ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธธ ์›ํ•  ๋•Œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ƒ์„ธํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  await ๋Œ€์‹  go ๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ 2022 ๋…„ ๋ฒ„์ „์—์„œ ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๊นŒ์ง€๋Š” ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ ๋‚˜ ์—ฐ์‚ฐ์ž๊ฐ€ ๋ฐœ๋ช… ๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฒฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. await ๋„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

go ๋Œ€์‹  await ์‚ฌ์šฉ ๋œ ์Šคํฌ์ผ๋Ÿฌ ๋ฒ„์ „ ์•„๋ž˜์— ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

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

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

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

    Ok(user)
}

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

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

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

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


๋ฐ˜๋Œ€ํ‘œ๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

  • ๋‚ด๊ฐ€ ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋Š” ์ตœ๊ณ ์˜ ์—ฐ์„ค์ž๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋‹ค๊ณ 
  • ๋‹น์‹ ์˜ ์˜๊ฒฌ์ด ํŽธ๊ฒฌ์ด ์•„๋‹ˆ๋ผ๋Š” ์‚ฌ์‹ค, ๊ทธ ๊ตฌ๋ฌธ์˜ ๊ธฐ์›์—์„œ ๋งŽ์€ ํŽธ๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•„๋ž˜์— ํƒ€๋‹นํ•œ ์ด์œ ๋ฅผ ์ž…๋ ฅ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋‹น์‹ ์˜ ์ด์œ ๋Š” ์ฆ‰๊ฐ์ ์ธ ๊ฐ์ •์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์—ฌ๊ธฐ์„œ ์žฅ๊ธฐ์ ์ธ ๊ธฐ๋Šฅ์„ ๋””์ž์ธํ•˜๋ ค๊ณ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—

@ I60R

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ถˆ๋งŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ˆˆ์œผ๋กœ ๋ถ„์„ํ•˜๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์–ธ๋œป ๋ณด๋ฉด ์šฐ๋ฆฌ๊ฐ€ db.go ์—์„œ ์ผ์น˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ๊ฒƒ์ด ์žˆ๊ณ  "oooh, ok, load is a method of db"๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. IMO๋Š” ๊ตฌ๋ฌธ์ด ์ฃผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋Š” ๊ทธ ์‚ฌ์ด์— ๊ณต๋ฐฑ๊ณผ ํ‚ค์›Œ๋“œ ์ค‘๋‹จ์—†์ด ํ•ญ์ƒ ์ž์‹ ์ด ์†ํ•œ ๊ฐ์ฒด์— ๊ฐ€๊นŒ์›Œ ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ๋กœ, ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ "์ง€์—ฐ๋œ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž ๊ตฌ๋ฌธ"์ด ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ•˜๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด ๋จผ์ € ์–ธ์–ด๋กœ ์ผ๋ฐ˜ํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋น„๋™๊ธฐ ์ฝ”๋“œ์—๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ "์™œ ํ›„์œ„ ๋งคํฌ๋กœ๊ฐ€ ์•„๋‹Œ๊ฐ€?"์— ๋Œ€ํ•œ ๋…ผ์˜๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋„ˆ๋ฌด.

์…‹์งธ, ํ‚ค์›Œ๋“œ๊ฐ€ ์ „ํ˜€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await ํ‚ค์›Œ๋“œ๋Š” 2018 ๋…„ ๋ฒ„์ „์„ ์œ„ํ•ด ์˜ˆ์•ฝ๋˜์—ˆ์œผ๋ฏ€๋กœ go ํ‚ค์›Œ๋“œ๋Š” ์ œ์•ˆ๋˜๊ธฐ ์ „์— ๋” ๊นŠ์€ crates.io ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ์ด๋ฅผ ๊ฑฐ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ† ๋ก ์ด ํ•œ ๋ฐฉํ–ฅ์—์„œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ (์ ‘๋‘์‚ฌ ๋Œ€ ์ ‘๋ฏธ์‚ฌ)์œผ๋กœ ์ง€์†์ ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณด๋ฉด await ํ‚ค์›Œ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฐ•ํ•œ ์˜๊ฒฌ์ด ์ƒ๊ฒจ ์™„์ „ํžˆ ํ›„ํ‡ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” (๋ฐ˜) ์•”์‹œ ์  ๊ธฐ๋‹ค๋ฆผ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์„ ๊ฒƒ์ด์ง€๋งŒ, ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์ „์ฒด ์š”์ ์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ˆจ๊ธฐ๊ณ ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Rust ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํž˜๋“  ํŒ๋งค๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. io one์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@dpc ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ unsafe ์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

await ๋ธ”๋ก ์•ˆ์˜ ๋ชจ๋“  ๊ฒƒ์ด ์ž๋™์œผ๋กœ ๋Œ€๊ธฐํ•˜๋Š” ๊ณณ. ๋Œ€์‹  ์ „์ฒด ์ฒด์ธ์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒด์ธ์— ๋Œ€ํ•œ postfix await์˜ ํ•„์š”์„ฑ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์‹œ์— ๊ทธ ํ˜•์‹์ด ๋ฐ”๋žŒ์งํ•œ ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ •๋ง ์ข‹์€ ์ด์œ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@dpc ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์š”์ ์€ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋” ์ ‘๊ทผํ•˜๊ธฐ ์‰ฝ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž ์žฌ์ ์œผ๋กœ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์„ ์ˆจ๊ธฐ๋ฉด ์•ˆ๋˜๋ฉฐ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์ธ ๋ฏธ๋ž˜๋ฅผ ํ™œ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์–ด๋Š ์–ธ์–ด๋กœ๋„ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์™€ ๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ํ˜ผ๋™ํ•˜๋Š” ์‚ฌ๋žŒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ˆœ์ „ํžˆ ์ƒํƒœ ๋จธ์‹ ์„ ์†์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์šด ํ˜•์‹์œผ๋กœ ์ž‘์—… ์‹œํ€€์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ @ivandardi ์˜ ์˜ˆ์ œ์—์„œ ๋Œ€๊ธฐ ๋Š” Future ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ์ด๋ฏธ ๋ณด์—ฌ ์ฃผ์—ˆ ๋“ฏ์ด ์—ฌ์ „ํžˆ ๋งค์šฐ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Future ์žก๊ณ  ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๋ช…ํ™•ํ•˜๊ณ , ์นœ์ˆ™ํ•˜๊ณ , ์ฝ๊ธฐ ์‰ฝ๊ณ , ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ await ๋˜๋Š” ๋งคํฌ๋กœ await!() , ์ž ์žฌ์ ์œผ๋กœ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ .await!() ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

@novacrazy ์ด์ƒ์ ์ธ ๊ตฌ๋ฌธ์„ ์„ ํƒ ํ–ˆ๋”๋ผ๋„ ์ผ๋ถ€ ์ƒํ™ฉ์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํ“จ์ฒ˜ ๋ฐ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์€ Rust์˜ ์ „์ฒด ๋ฐฉํ–ฅ์— ์˜๋ฌธ์„ ์ œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ฒฐํ•ฉ์ž๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

? ์™€ ๊ฐ™์€ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ƒˆ ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ? ํ•˜์ง€๋งŒ (๊ฒฐํ•ฉ ์ž๋ณด๋‹ค ๋‚ซ๊ธฐ ๋•Œ๋ฌธ์—) ์˜ต์…˜ / ๊ฒฐ๊ณผ ๊ฒฐํ•ฉ์ž๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค or_else ๋Š” ์—ฌ์ „ํžˆ ์ •๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.)

ํŠนํžˆ async / await๋Š” map ๋ฐ and_then ์™„์ „ํžˆ ๋Œ€์ฒด ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ํŽ‘ํ‚ค ํ•œ Future ๊ฒฐํ•ฉ์ž๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์ œ๊ณตํ•˜๋Š” ์˜ˆ๋Š” ๊ฒฐํ•ฉ ์ž์— ๋น„ํ•ด ์—ฌ์ „ํžˆ ๋”์ฐํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ํ‘œ์ค€ Rust ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ช…ํ™•์„ฑ์€ ๊ฑฐ์˜ ์บ๋ฆญํ„ฐ ์ˆ˜์— ๊ด€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์ •์‹ ์  ๊ฐœ๋…๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

await ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ข‹์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

some_op().await?
    .another_op().await?
    .final_op().await

์›๋ณธ๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

some_op()
    .and_then(|v| v.another_op())
    .and_then(|v2| v2.final_op())

์ƒ์„ฑ๊ธฐ ์˜ค๋ฒ„ ํ—ค๋“œ๋Š” ์•„๋งˆ๋„ ์•ฝ๊ฐ„ ๋Š๋ฆฌ๊ณ  ๋” ๋งŽ์€ ๊ธฐ๊ณ„ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

async / await์—์„œ ์ถ”๊ฐ€ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ƒ์„ฑ๊ธฐ์™€ async / await๋Š” ๋ชจ๋‘ ์ œ๋กœ ๋น„์šฉ๊ณผ ๊ณ ๋„๋กœ ์ตœ์ ํ™”๋˜๋„๋ก ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ, async / await๋Š” ํ“จ์ฒ˜ ์ปด๋น„ ๋„ค์ดํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณ ๋„๋กœ ์ตœ์ ํ™” ๋œ ์ƒํƒœ ๋จธ์‹ ์œผ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒ์„ฑ๊ธฐ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ƒํƒœ ๋จธ์‹ ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค

ํ“จ์ฒ˜ ์ปด๋น„ ๋„ค์ดํ„ฐ ๋Š” ๋˜ํ•œ ํ›„๋“œ ์•„๋ž˜์— "์ŠคํŒŒ๊ฒŒํ‹ฐ ์ƒํƒœ ๋จธ์‹ "์„ ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ด๋Š” ์ •ํ™•ํžˆ ๊ทธ๋“ค์ดํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทผ๋ณธ์ ์œผ๋กœ async / await์™€ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

[๋ฏธ๋ž˜์˜ ๊ฒฐํ•ฉ ์ž]๋Š” ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ํผ ๋œจ๋ฆฌ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํŠนํžˆ async / await๋Š” Future ๊ฒฐํ•ฉ ์ž๋ณด๋‹ค ๋น ๋ฅผ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์ง€๋ฉด 2019/2020 ์—๋””์…˜์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋งํ–ˆ๋“ฏ์ด, ์—๋””์…˜์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•  ๋•Œ๋งˆ๋‹ค ๋งŒ๋“œ๋Š” ์ž„์˜์˜ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ช‡ ๋…„๋งˆ๋‹ค (๊ฐ€์žฅ ๋น ๋ฅด๋ฉด) ๋งŒ ๋ฐœ์ƒํ•˜๋„๋ก ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@Centril์ด ์ง€์ ํ–ˆ๋“ฏ์ด ๋‚˜์ค‘์— ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์  ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

ํ† ๋ก ์˜ ์†๋„๋Š” ์ง€๊ธˆ ์ƒ๋‹นํžˆ ๋†’์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์†๋„๋ฅผ ๋Šฆ์ถ”๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๋”ฐ๋ผ ์žก์„ ์ˆ˜ ์žˆ๋„๋กํ•˜๊ธฐ ์œ„ํ•ด ์ผ์‹œ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์ž ๊ฐ”์Šต๋‹ˆ๋‹ค. ํ•˜๋ฃจ ์•ˆ์— ์ž ๊ธˆ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋•Œ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฑด์„ค์ ์œผ๋กœ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋„๋ก ๋…ธ๋ ฅํ•˜์‹ญ์‹œ์˜ค.

ํ•˜๋ฃจ ํ›„ ๋ฌธ์ œ ํ’€๊ธฐ ... ์ด๋ฏธ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์ฃผ์ œ์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค (์˜ˆ : ์•”์‹œ ์  ๋Œ€๊ธฐ ๋˜๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋‹ค๋ฅธ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•  ์ˆ˜์žˆ๋Š” ๊ณณ์ด ์•„๋‹™๋‹ˆ๋‹ค ..).

์ด๊ฒƒ์€ ๊ธด ์Šค๋ ˆ๋“œ ์˜€์œผ๋ฏ€๋กœ ๊ทธ ์•ˆ์— ๋ฌปํ˜€์žˆ๋Š” ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋Œ“๊ธ€ ์ค‘ ์ผ๋ถ€๋ฅผ ๊ฐ•์กฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@mehcode ๋Š” ์ ‘๋‘์‚ฌ ๋ฐ ์ ‘๋ฏธ์‚ฌ ์œ„์น˜์— await ๋œ ๊ด‘๋ฒ”์œ„ํ•œ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/57640#issuecomment -455846086

@Centril ์€ await!(expr) ๋ฅผ ์•ˆ์ •ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์˜๋„์ ์œผ๋กœ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์„ค๋“๋ ฅ์žˆ๊ฒŒ ์ฃผ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/57640#issuecomment -455806584

@valff ๋Š” expr await ์ ‘๋ฏธ์–ด ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ์ด ๊ฒƒ์ž„์„ ์ƒ๊ธฐ ์‹œ์ผฐ ์Šต๋‹ˆ๋‹ค . https://github.com/rust-lang/rust/issues/57640#issuecomment -456023146

@quodlibetor ๋Š” ์˜ค๋ฅ˜ ๋ฐ ์˜ต์…˜ ๊ฒฐํ•ฉ ์ž์˜ ๊ตฌ๋ฌธ ํšจ๊ณผ๊ฐ€ Rust์— ๊ณ ์œ ํ•˜๋‹ค๋Š” https://github.com/rust-lang/rust/issues/57640#issuecomment -456143523

ํ•˜๋ฃจ๊ฐ€ ๋๋‚˜๋ฉด lang ํŒ€์ด ์—ฌ๊ธฐ์—์„œ ์ „ํ™”๋ฅผ ๊ฑธ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•ฉ์˜๋กœ ์ด์–ด์งˆ ์ˆ˜์žˆ๋Š” ๊ณตํ†ต ๊ธฐ๋ฐ˜์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด postfix ๊ตฌ๋ฌธ์˜ ํ•ต์‹ฌ ๋ฌธ์ œ์— ๋Œ€ํ•ด lang ํŒ€ ๊ตฌ์„ฑ์›์˜ ๋ช…์‹œ๋œ ์ž…์žฅ์„ ์š”์•ฝํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • @Centril ์€ ํ›„์œ„ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ง€์›์„ ํ‘œ๋ช…ํ•˜๊ณ ์ด ํ‹ฐ์ผ“์˜ ๋‹ค์–‘ํ•œ ๋ณ€ํ˜•์„ ํƒ์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. Centril์€ ํŠนํžˆ await!(expr) ์•ˆ์ •ํ™”๋ฅผ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

  • @cramertj ๋Š” postfix ๊ตฌ๋ฌธ ๋ฐ ํŠนํžˆ expr await postfix ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ง€์› ์„

  • @joshtriplett ์€ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์— ํ‘œํ˜„ ํ–ˆ์œผ๋ฉฐ ์ ‘๋‘์‚ฌ ๋ฒ„์ „ ๋„ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

  • @scottmcm ์€ ํ›„์œ„ ๊ตฌ๋ฌธ์— ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค .

  • @withoutboats ๋Š” ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์•ˆ์ •ํ™”ํ•˜๊ณ  ๋Š” expr await ์ ‘๋ฏธ์–ด ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ์ด "์‹ค์ œ ๊ธฐํšŒ"๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ํ•ฉ๋‹ˆ๋‹ค.

  • @aturon , @eddyb , @nikomatsakis ๋ฐ @pnkfelix ๋Š” ์•„์ง ๋ฌธ์ œ # 57640 ๋˜๋Š” # 50547์—์„œ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ž…์žฅ์„ ํ‘œํ˜„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ / ์•„๋‹ˆ์˜ค์— ๋Œ€ํ•œ ๋‹ต์„ ์•Œ์•„ ๋‚ด๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ :

  • ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?
  • ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?
  • ์ง€๊ธˆ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ๋‚˜์ค‘์— ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ์•Œ์•„ ๋‚ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€์žฅ ๋ฐ›์•„๋“ค์ด๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ฒฝ์Ÿ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์„ ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์œ ์šฉํ•จ๊ณผ ๋ถ„๋ช…ํ•จ์ž…๋‹ˆ๋‹ค. await!() ์— ๋Œ€ํ•œ ์ฃผ์žฅ์€ ์ƒ๋‹นํžˆ ๊ฐ•๋ ฅํ•ด์„œ ๋ฐฐ์ œ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Useful ๋˜๋Š” Obvious ๊ตฌ๋ฌธ์„ ์›ํ•˜๋Š”์ง€ ์•Œ์•„ ๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋œ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์— ๊ด€ํ•ด์„œ๋Š” ๋” ๊นŒ๋‹ค ๋กญ์Šต๋‹ˆ๋‹ค. ๊ณต๋ฐฑ์ด์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ await ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ธ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ฝ”๋“œ์˜ ํ˜•์‹์— ๋”ฐ๋ผ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ํ˜•์‹์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ ๊ณต๋ฐฑ์ด์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ await ํ‚ค์›Œ๋“œ๊ฐ€ ์ •๋ง ๋‚˜๋น  ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋จผ์ € ๋ชจ๋“  Rust ์ฝ”๋“œ๊ฐ€ rustfmt๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํฌ๋งท๋˜๊ณ  rustfmt๊ฐ€ ํ•œ ์ค„์— ๋งž๋”๋ผ๋„ ํ•ญ์ƒ ๋‹ค๋ฅธ ์ค„๋กœ ๋ฌถ์ธ awaits๋ฅผ ๋ถ„ํ• ํ•ด์•ผํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ตฌ๋ฌธ์€ ๋งค์šฐ ๊ดœ์ฐฎ์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ ๋ฌธ์ œ์™€ ํ•œ ์ค„ ์ฒด์ธ ์ค‘๊ฐ„์—์žˆ๋Š” ๊ณต๋ฐฑ๊ณผ์˜ ํ˜ผ๋™ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‘ ๊ตฌ๋ฌธ์˜ ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์ ์–ด ๋‘ ๊ตฌ๋ฌธ์ด ์„œ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ํ•˜๋‚˜๊ฐ€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. postfix ๋˜๋Š” prefix await ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด๋„ ์ฝ”๋“œ ์‹คํ–‰ ๋ฐฉ๋ฒ•์ด ๋ณ€๊ฒฝ๋˜์–ด์„œ๋Š” ์•ˆ๋˜๋ฏ€๋กœ ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์‚ฌ๊ณ  ๊ณผ์ •๊ณผ ํ‘œ๋ฉด ๊ตฌ๋ฌธ ์ œ์•ˆ์— ์ ‘๊ทผํ•˜๊ณ  ํ‰๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด. await ,
๋‹ค์Œ์€ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค (์ค‘์š”ํ•œ ์ˆœ์„œ์—†์ด).

  1. await ์€ (๋Š”) ํ–ฅํ›„ ์–ธ์–ด ๋””์ž์ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ตฌ๋ฌธ์€ ์ตœ๊ณ  ์ˆ˜์ค€์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  3. Awaiting์€ Rust์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ? ๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋กœ ์ž˜ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฏธ์žˆ๋Š” ์„ธ๋ถ„ํ™”๊ฐ€ ์•„๋‹ ์ˆ˜์žˆ๋Š” ์ž„์‹œ let ๋ฐ”์ธ๋”ฉ์„ ๊ฐ•์š”ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  4. await ํฌ์ธํŠธ์— ๋Œ€ํ•ด grep ๊ฐ€ ์‰ฌ์›Œ์•ผํ•ฉ๋‹ˆ๋‹ค.
  5. ๋Œ€๊ธฐ ์ง€์ ์„ ํ•œ ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  6. ๊ตฌ๋ฌธ์˜ ์šฐ์„  ์ˆœ์œ„๋Š” ์ง๊ด€์ ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  7. ๊ตฌ๋ฌธ์€ IDE ๋ฐ ๊ทผ์œก ๋ฉ”๋ชจ๋ฆฌ์™€ ์ž˜ ๊ตฌ์„ฑ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  8. ๊ตฌ๋ฌธ์€ ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์›Œ์•ผํ•ฉ๋‹ˆ๋‹ค.
  9. ๊ตฌ๋ฌธ์€ ์“ฐ๊ธฐ์— ์ธ์ฒด ๊ณตํ•™์ ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ชฉํ‘œ ์ค‘ ์ผ๋ถ€๋ฅผ ์ •์˜ํ•œ (์•„๋งˆ๋„ ์žŠ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...) ๋‹ค์Œ์€ ์ด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ œ์•ˆ์— ๋Œ€ํ•œ ์š”์•ฝ ๋ฐ ํ‰๊ฐ€์ž…๋‹ˆ๋‹ค.

  1. await ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ์œ ์ง€ํ•˜๋ฉด await!(expr) ๋˜๋Š” expr.await!() ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ๋งคํฌ๋กœ ๊ธฐ๋ฐ˜ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด await ๋ฅผ ๋งคํฌ๋กœ๋กœ ํ•˜๋“œ ์ฝ”๋”ฉํ•˜๊ณ  ์ด๋ฆ„ ํ™•์ธ๊ณผ ํ†ตํ•ฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ (์ฆ‰, use core::await as foo; ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅ ํ•ด์ง) await ๊ฐ€ ํ‚ค์›Œ๋“œ๋กœ ์™„์ „ํžˆ ํฌ๊ธฐ๋ฉ๋‹ˆ๋‹ค.

  2. ๋‚˜๋Š” ๋งคํฌ๋กœ๊ฐ€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ๊ตฌ๋ฌธ์„ ๋ฐœ๋ช…ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ๋งคํฌ๋กœ์— ๋Œ€ํ•ด ๋ช…๋ฐฑํžˆ ์ผ๋ฅ˜๊ฐ€ ์•„๋‹Œ ๋Š๋‚Œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์  ์ธ ์š”์ ์€ ์•„๋‹ˆ์ง€๋งŒ ์ด๋Ÿฌํ•œ ์–ธ์–ด์˜ ์ค‘์‹ฌ ๊ตฌ์กฐ์—์„œ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ด‘ํƒ์ด์—†๋Š” ์ธ์ƒ์„์ค๋‹ˆ๋‹ค. ํ‹€๋ฆผ์—†์ด .await ๋ฐ .await() ๊ตฌ๋ฌธ์€ ์ตœ๊ณ ์˜ ๊ตฌ๋ฌธ๋„ ์•„๋‹™๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งคํฌ๋กœ์ฒ˜๋Ÿผ 2 ๋“ฑ๊ธ‰์€ ์•„๋‹™๋‹ˆ๋‹ค.

  3. ์—ฐ๊ฒฐ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋ ค๋Š” ์š•๊ตฌ ๋กœ ์ธํ•ด ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฉ”์„œ๋“œ ์ฒด์ธ๊ณผ ํŠนํžˆ ? ๋ฉ๋‹ˆ๋‹ค.

  4. ์ ‘๋ฏธ์‚ฌ, ์ ‘๋‘์‚ฌ, ๋งคํฌ๋กœ ๋“ฑ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Grepping์ด ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค.์‹œ๊ธธ ๊ธฐ๋ฐ˜ ๊ตฌ๋ฌธ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ (์˜ˆ : # , @ , ~ , grepping์ด ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ํฌ์ง€ ์•Š์ง€๋งŒ .await await ๋ฐ await ๋ณด๋‹ค await ๊ฐ€ ์ฃผ์„์— ๋‹จ์–ด๋กœ ํฌํ•จ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋Ÿด ๊ฐ€๋Šฅ์„ฑ์€ ๋” ์ ๊ธฐ ๋•Œ๋ฌธ์— grepํ•˜๊ธฐ๊ฐ€ ์•ฝ๊ฐ„ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. .await

  5. ์‹œ๊ธธ์€ ํ•œ ๋ˆˆ์— ์ฐพ๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ await ๋Š”๋ณด๊ธฐ ์‰ฝ๊ณ  ํŠนํžˆ ๊ตฌ๋ฌธ์ด ๊ฐ•์กฐ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. .await ๋˜๋Š” ๊ธฐํƒ€ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์€ ํ•œ ๋ˆˆ์—๋ณด๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๊ฑฐ๋‚˜ await ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๊ฐ€๋…์„ฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ œ์•ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ ์ƒ๊ฐ์— @scottmcm ์€ ๊ฒฐ๊ณผ์˜ ๋ฏธ๋ž˜๊ฐ€ ์ผ๋ฐ˜์ ์ด๋ฉฐ .await? ๊ฐ€ ๊ทธ ์ž์ฒด๋กœ ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋Œ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€์  ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Scott์€ ์ ‘๋‘์‚ฌ await ๊ฐ€ ์ •์› ๊ฒฝ๋กœ ๋ฌธ์žฅ์œผ๋กœ ์ด์–ด์ง€๊ณ  ์‹ ์ค‘๊ฐ„์—์žˆ๋Š” ์ ‘๋‘์‚ฌ๊ฐ€ ์ ‘๋ฏธ์‚ฌ๋ณด๋‹ค ๋” ์ฝ๊ธฐ ์–ด๋ ต๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•ฉ๋‹ˆ๋‹ค. ? ์—ฐ์‚ฐ์ž์˜ ์ถœํ˜„์œผ๋กœ, Rust ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ด๋ฏธ ์ œ์–ด ํ๋ฆ„์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ค„ ๋ ์„

  6. .await ๋ฐ .await() ์˜ ์šฐ์„  ์ˆœ์œ„๋Š” ์™„์ „ํžˆ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์—์„œ ์ฃผ๋ชฉํ•  ๋งŒํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ์•ก์„ธ์Šค ๋ฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋Œ€์‘์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋Š” ์•„๋งˆ๋„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ณผ ๋™์ผํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œํŽธ, await ์ ‘๋‘์‚ฌ๋Š” ? (์˜ˆ : await (expr?) )์™€ ๊ด€๋ จํ•˜์—ฌ ์ผ๊ด€์„ฑ ์žˆ๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋ฉฐ ์œ ์šฉํ•˜์ง€ ์•Š์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ–๊ฑฐ๋‚˜ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ผ๊ด€์„ฑ์ด์—†๊ณ  ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : (await expr)? ). ์‹œ๊ธธ์€ ์›ํ•˜๋Š” ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ? ์—์„œ ์ง๊ด€ ๊ฐ€์ ธ ์˜ค๊ธฐ).

  7. 2012 ๋…„์— @nikomatsakis ๋Š” Simon Peyton Jones๊ฐ€ "์ ์˜ ํž˜"์„ ๋ถ€๋Ÿฌ์›Œํ•˜๋ฉฐ ๊ทธ๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‚˜ ๋ถ„์•ผ๋ฅผ ์ขํž ์ˆ˜์žˆ๋Š” IDE ๋งˆ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ถ€๋Ÿฌ์›Œํ•œ๋‹ค๊ณ  ํ•œ ๋ฒˆ ์–ธ๊ธ‰ํ–ˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค (p. 56) . ์ ์˜ ํž˜์€ ๋งŽ์€ ์ธ๊ธฐ์žˆ๋Š” ์–ธ์–ด (์˜ˆ : Java, C #, C ++, ..)์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— "์ ์— ๋„๋‹ฌ"ํ•˜๋Š” ๊ฒƒ์ด ๊ทผ์œก ๋ฉ”๋ชจ๋ฆฌ์— ์Šค๋ฉฐ๋“ค๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์Šต๊ด€์ด ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•œ ์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ์€ Re # er๊ฐ€ ํฌํ•จ ๋œ Visual Studio์˜ @scottmcm ์œผ๋กœ ์ธํ•œ ์Šคํฌ๋ฆฐ ์ƒท์ž…๋‹ˆ๋‹ค.
    Re#er intellisense

    C #์—๋Š” await ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด๊ฒƒ์€ ์œ ํšจํ•œ ๊ตฌ๋ฌธ์ด ์•„๋‹Œ ์ž๋™ ์™„์„ฑ ๋ชฉ๋ก์— ํ‘œ์‹œ ๋  ์ •๋„๋กœ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ .await ๊ฐ€ ํ‘œ๋ฉด ๊ตฌ๋ฌธ์ด ์•„๋‹ ๋•Œ .aw ๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ์ €๋ฅผ ํฌํ•จํ•˜์—ฌ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IDE ๊ฒฝํ—˜์˜ ์ด์ ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. await expr ๋ฐ expr await ๊ตฌ๋ฌธ์€ ์ด๋Ÿฌํ•œ ์ด์ ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  8. Sigils๋Š” ์•„๋งˆ๋„ ์นœ์ˆ™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ await ๋Š” C #, JS ๋“ฑ์— ์ต์ˆ™ํ•ด์ง€๋ฉด ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust๋Š” await ์™€ ? ๋ฅผ ๋ณ„๊ฐœ์˜ ์—ฐ์‚ฐ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. await expr ์—์„œ expr.await ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋„ ์ŠคํŠธ๋ ˆ์นญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ณ€ํ™”๋Š”์‹œ๊ธธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ๊ธ‰์ง„์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์•ž์„œ ์–ธ๊ธ‰ ํ•œ ๋‹ท ํŒŒ์›Œ๋กœ ์ธํ•ด expr. ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ž๋™ ์™„์„ฑ ํŒ์—…์˜ ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์œผ๋กœ await ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด .await ์„ ํ•™์Šต ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  9. ์‹œ๊ธธ์€ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฌ์šฐ ๋ฉฐ ์ธ์ฒด ๊ณตํ•™์ ์œผ๋กœ๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ .await ๋Š” ์ž…๋ ฅํ•˜๋Š” ๋ฐ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ let ๋ฌธ์œผ๋กœ ๋ถ„๋ฆฌ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์ธ์ฒด ๊ณตํ•™๋„ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ await ๋˜๋Š” ๋” ๋‚˜์˜์ง€๋งŒ await!(..) ์€ ์ ๋ ฅ๊ณผ ์—ฐ๊ฒฐ ๋Šฅ๋ ฅ์ด ๋ชจ๋‘ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. .await , .await() ๋ฐ .await!() ๋น„๊ตํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ์ œ์•ˆ์ด ๊ฐ€์žฅ ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ๊ตฌ๋ฌธ์ด ๋ชจ๋“  ๋ชฉํ‘œ๋ฅผ ๋™์‹œ์— ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์ ํ•ฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ์ถฉ์•ˆ์„ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๊ฐ€์žฅ ๋งŽ์€ ์ด์ ๊ณผ ๊ฐ€์žฅ ์ ์€ ๋‹จ์ ์ด์žˆ๋Š” ๊ตฌ๋ฌธ์€ .await ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ๊ทธ๊ฒƒ์€ ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๊ณ , ํ‚ค์›Œ๋“œ๋กœ await ๋ฅผ ๋ณด์กดํ•˜๊ณ , ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•˜๊ณ , ์ ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ํ•™์Šต ๊ฐ€๋Šฅํ•˜๊ณ  ์ธ์ฒด ๊ณตํ•™์ ์ด๋ฉฐ ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฝ๊ธฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค (ํŠนํžˆ ์ข‹์€ ์„œ์‹ ๋ฐ ๊ฐ•์กฐ ํ‘œ์‹œ).

@Centril ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์ ‘๋ฏธ์‚ฌ ๋งŒ ๊ธฐ๋‹ค๋ฆฌ์‹œ ๊ธธ ๋ฐ”๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, .await ์ด ํ•„๋“œ ์•ก์„ธ์Šค๋ผ๋Š” ์ด์ค‘์„ฑ์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ• ๊นŒ์š”? .await ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋„๋ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๊ด„ํ˜ธ๊ฐ€์žˆ๋Š” .await() ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ์•”์‹œํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ, .await ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด "ํ•„๋“œ ์•ก์„ธ์Šค"์‹๋ณ„์ž์ผ๊นŒ์š”?

๋จผ์ € ์ ‘๋ฏธ์‚ฌ ๋งŒ ๊ธฐ๋‹ค๋ฆฌ์‹œ ๊ธธ ๋ฐ”๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋„ค. ์ ์–ด๋„ ์ง€๊ธˆ์€.

๋‘˜์งธ, .await ์ด ํ•„๋“œ ์•ก์„ธ์Šค๋ผ๋Š” ์ด์ค‘์„ฑ์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ• ๊นŒ์š”?

์•ฝ๊ฐ„์˜ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์˜ ํž˜์—๋Š” ํฐ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ถ„์€ ํŠนํžˆ ํ‚ค์›Œ๋“œ๊ฐ€ ๊ฐ•์กฐ๋˜๊ณ  ๊ตฌ๋ฌธ์ด ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋ฐฐ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Scott์ด ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด .await? ๊ฐ€ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด์–ด์„œ ์ƒํ™ฉ์„ ๋”์šฑ ์™„ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ์œ„ํ•œ ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ ํ•ญ๋ชฉ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ await ์šฐ๋ฆฌ๋Š” ๋ง์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ ํ•œ ๋งŽ์€์ฒ˜๋Ÿผ rustdoc์—์„œ fn .

.await ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ์š”, ์•„๋‹ˆ๋ฉด ๊ด„ํ˜ธ๊ฐ€์žˆ๋Š” .await() ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์ž‘์—…์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Œ์„ ์•”์‹œํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ผฌ๋ฆฌ๊ฐ€์—†๋Š” .await ์„ ์„ ํ˜ธํ•œ๋‹ค () ; ๋์— () ๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ถˆํ•„์š”ํ•œ ์†Œ๊ธˆ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€์ด ๋ฐฉ๋ฒ•์„ ๋” ๋งŽ์ด ์ฐพ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์„ธ ๋ฒˆ์งธ๋กœ .await ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉด "ํ•„๋“œ ์•ก์„ธ์Šค"์‹๋ณ„์ž์ผ๊นŒ์š”?

await ๋Š” ํ‚ค์›Œ๋“œ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์•„๋งˆ๋„ ๋‹น์‹ ์ดํ•˜์ง€ ์˜ค๋ฅ˜๋กœ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ libsyntax์„ ๋ณ€๊ฒฝํ•  ๊ฒƒ await ํ›„ . ๋‹ค์Œ๊ณผ AST ๋‹ค๋ฅด๊ฒŒ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋Œ€ํ‘œํ•˜๊ฑฐ๋‚˜ HIR์— ๋‚ด๋ฆด ๋•Œ ...ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ๊ตฌํ˜„ ์„ธ๋ถ€์ž…๋‹ˆ๋‹ค .

๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ‘

์ด ์‹œ์ ์—์„œ ํ•ต์‹ฌ ๋ฌธ์ œ๋Š” ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์„ ์ถ”๊ตฌํ• ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ๋ฐฉํ–ฅ์ด๋ผ๋ฉด ํ™•์‹คํžˆ ์šฐ๋ฆฌ๋Š” ์–ด๋Š ๋ฐฉํ–ฅ์œผ๋กœ ์ขํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ์„ ์ฝ์œผ๋ฉด ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„์ง€์ง€ํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ๋ณด๋‹ค ํ•ฉ๋ฆฌ์ ์ธ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์„ ๋ฐ›์•„ ๋“ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ๋กœ ๋“ค์–ด ์˜ค๋ฉด ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ด ์•ฝํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 4 ๋ช…์˜ lang ํŒ€์›์˜ ๋ช…ํ™•ํ•œ ์ง€์›๊ณผ 5 ๋ถ„์˜ 1 (๋‹ค๋ฅธ 4 ๋ช…์€ ์ง€๊ธˆ๊นŒ์ง€ ์นจ๋ฌต)์˜ ๊ฐœ๋ฐฉ์„ฑ์„ ๋Œ์–ด ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‹ฌ๊ณ ์žˆ๋Š” ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ƒ๋‹นํ•œ ์ง€์›์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ postfix ๋ฌธ๋ฒ•์˜ ์ง€์ง€์ž๋“ค์€ ์ด๊ฒƒ์ด Rust๋ฅผ์œ„ํ•œ ์ตœ์„ ์˜ ๊ฒฝ๋กœ๋ผ๊ณ  ํ™•์‹ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ง€์ง€๋ฅผ ๋˜๋Œ๋ฆฌ๋ ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ์ง„ํ–‰๋œ ์ฃผ์žฅ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊นŠ์€ ๋ฌธ์ œ ๋˜๋Š” ์„ค๋“๋ ฅ์žˆ๋Š” ๋ฐ˜๋ฐ•์ด ํ•„์š”ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์ด ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ,์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณธ @withoutboats ์™€ ๋‹ค๋ฅธ 4 ๋ช…์˜ lang ํŒ€ ๊ตฌ์„ฑ์›์˜ ์˜๊ฒฌ์„ ๋“ค์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ๊ฒฌํ•ด๋Š” ์•„๋งˆ๋„์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ด๋Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ ค ์‚ฌํ•ญ์ด์žˆ๋Š” ๊ฒฝ์šฐ์ด๋ฅผ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์šฐ์„ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์ด ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์˜ ๊ฒฝ์šฐ๋ฅผ ํ™•์‹ ํ•œ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์–ด๋Š ๊ฒƒ์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. @Centril ์ด ์ด๋ฏธ ๋Œ“๊ธ€์„ ์œผ๋ฏ€๋กœ ์ฒญ๊ฒฐ์„ ์œ„ํ•ด ๊ฒŒ์‹œ๋ฌผ์„ ์ˆจ๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@ivandardi ๊ฒŒ์‹œ๋ฌผ์˜ ๋ชฉํ‘œ (1)๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ, ๋‚ด ์ดํ•ด๋Š” await๊ฐ€ ์—ฌ์ „ํžˆ ํ‚ค์›Œ๋“œ์ด๋ฏ€๋กœ ํ•„๋“œ ์•ก์„ธ์Šค๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. loop {} ๊ฐ€ ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ํ‘œํ˜„์‹์ด ์•„๋‹Œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ๋ถ„๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ฐ•์กฐ ํ‘œ์‹œ ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : https://github.com/rust-lang/rust-enhanced/issues/333์ด Sublime์—์„œ ๋Œ€๊ธฐ ์ค‘์ž…๋‹ˆ๋‹ค).

๋‚ด ํ•œ ๊ฐ€์ง€ ๊ด€์‹ฌ์‚ฌ๋Š” await ๊ตฌ๋ฌธ์„ ๋‹ค๋ฅธ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ ์ฑ„ 2015 ๋ฒ„์ „ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 2015๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Š” ๋“ฑ) 2015 ๋…„ ์—๋””์…˜์— await ํ•„๋“œ๊ฐ€ ์—†์„ ๋•Œ ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜๊ฐ€์žˆ๋Š” ํ•œ (์žˆ์„ ๊ฒฝ์šฐ ๊ฒฝ๊ณ ) (Centril์˜ ๋ฉ‹์ง„ ์ฃผ์žฅ๊ณผ ํ•จ๊ป˜) ํ‚ค์›Œ๋“œ ํ•„๋“œ (๋˜๋Š” ๋ฐฉ๋ฒ•)์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ๊ฑฑ์ •์„ ์—†์• ์ค๋‹ˆ๋‹ค.

์•„, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ์ •ํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” rustfmt๊ฐ€ ์–ด๋–ป๊ฒŒ ํฌ๋งท์„ ๋๋‚ผ ๊ฒƒ์ธ์ง€์ž…๋‹ˆ๋‹ค.

let val = await future;
let val = await returns_future();
let res = client.get("https://my_api").await send()?.await json()?;
  1. await -ํ™•์ธ
  2. ์ผ๋“ฑ์„-์ˆ˜ํ‘œ
  3. ์ฒด์ด๋‹-ํ™•์ธ
  4. Grepping-ํ™•์ธ
  5. ๋น„์‹œ๊ธธ-ํ™•์ธ
  6. ์šฐ์„  ์ˆœ์œ„-ยน ํ™•์ธ
  7. ๋„ํŠธ ํŒŒ์›Œ-ยฒcheck
  8. ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์›€-ยณ ํ™•์ธ
  9. ์ธ์ฒด ๊ณตํ•™์ -์ ๊ฒ€

ยน ์šฐ์„  ์ˆœ์œ„ : await ๋’ค์— ๊ณต๋ฐฑ์ด ์žˆ์œผ๋ฉด ์ง€์—ฐ๋œ ์œ„์น˜์—์„œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ์ฝ”๋“œ์—์„œ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค : client.get("https://my_api").await_send()?.await_json()? . ๋ชจ๋“  ์˜์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์ œ์•ˆ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

ยฒDot power : ๋‹ค์Œ์— . , ? ๋˜๋Š” ; ๋ฅผ ์ž…๋ ฅ ํ•œ ํ›„ await ๋ฅผ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด IDE์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ยณ ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์›€ : ์ ‘๋‘์‚ฌ ์œ„์น˜์—์„œ๋Š” ์ด๋ฏธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. deffered ์œ„์น˜ ์—์„œ ๊ตฌ๋ฌธ์ด ์•ˆ์ •ํ™” ๋œ ํ›„์—๋Š” ๋ช…๋ฐฑ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๊ทธ๋Ÿฌ๋‚˜์ด ๊ตฌ๋ฌธ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๋งค์šฐ ์ผ๊ด€์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์†์„ฑ ์•ก์„ธ์Šค์™€ ํ˜ผ๋™ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ? ์™€ ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ญ์ƒ ๋™์ผํ•œ ํ˜•์‹์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
  • ์ธ๊ฐ„์˜ ์–ธ์–ด์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ฒด์ธ์—์„œ ๊ฐ€๋ณ€ ์ˆ˜ํ‰ ๋ฐœ์ƒ์— ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค *

* ์„ค๋ช…์€ ์Šคํฌ์ผ๋Ÿฌ ์•„๋ž˜์— ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.


์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ async ์ด๊ณ  ์ˆ˜ํ‰ ์ถ•์—์„œ await ์˜ ๋‹ค์Œ ๋ฐœ์ƒ ์œ„์น˜๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

let res = client.get("https://my_api")
    .very_long_method_name(param, param, param).await?
    .short().await?;

์ง€์—ฐ๋œ ๋ณ€ํ˜•์˜ ๊ฒฝ์šฐ ๊ฑฐ์˜ ํ•ญ์ƒ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

let res = client.get("https://my_api")
    .await very_long_method_name(param, param, param)?
    .await short()?;

. ๋Œ€๊ธฐ์™€ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‚ฌ์ด์—? ์ฒ˜๋Ÿผ
get().await?.json()

2019 ๋…„ 1 ์›” 23 ์ผ ์ˆ˜์š”์ผ, 05:06 I60R < [email protected] ์ž‘์„ฑ :

๋ฐœ = ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค;
let res = client.get ( "https : // my_api") .await send () ?. await json () ?;

  1. ์‚ฌ์šฉ ๋Œ€๊ธฐ-ํ™•์ธ
  2. ์ผ๋“ฑ์„-์ˆ˜ํ‘œ
  3. ์ฒด์ด๋‹-ํ™•์ธ
  4. Grepping-ํ™•์ธ
  5. ๋น„์‹œ๊ธธ-ํ™•์ธ
  6. ์šฐ์„  ์ˆœ์œ„-ยน ํ™•์ธ
  7. ๋„ํŠธ ํŒŒ์›Œ-ยฒcheck
  8. ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์›€-ยณ ํ™•์ธ
  9. ์ธ์ฒด ๊ณตํ•™์ -์ ๊ฒ€

ยน ์šฐ์„  ์ˆœ์œ„ : ๊ณต๋ฐฑ์€ ์ง€์—ฐ๋œ ์œ„์น˜์—์„œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€
๋‹ค์Œ ์ฝ”๋“œ์—์„œ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. client.get ( "https : // my_api
") .await_send () ?. await_json () ?. ๋ชจ๋“  ์˜์–ด ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ํ›จ์”ฌ ๋”
๋‹ค๋ฅธ ๋ชจ๋“  ์ œ์•ˆ๋ณด๋‹ค ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

ยฒDot ์ „์› : IDE๋กœ ์ด๋™ํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ์ง€์›์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์ดํ›„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์˜ ์™ผ์ชฝ. ๋˜๋Š”? ๋‹ค์Œ์— ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค
๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค

ยณ ๋ฐฐ์šฐ๊ธฐ ์‰ฌ์›€ : ์ ‘๋‘์‚ฌ ์œ„์น˜์—์„œ๋Š” ์ด๋ฏธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์œ„์น˜ ์—์„œ ๊ทธ ๊ตฌ๋ฌธ์ด

์•ˆ์ •๋œ

ํ•˜์ง€๋งŒ์ด ๊ตฌ๋ฌธ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€
์ผ๊ด€๋œ:

  • ์†์„ฑ ์•ก์„ธ์Šค์™€ ํ˜ผ๋™ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๊ฒƒ์€ ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€?
  • ํ•ญ์ƒ ๋™์ผํ•œ ํ˜•์‹์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.
  • ์ธ๊ฐ„์˜ ์–ธ์–ด์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์—์„œ ๊ฐ€๋ณ€ ์ˆ˜ํ‰ ๋ฐœ์ƒ์— ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    ์ฒด์ธ*

* ์„ค๋ช…์€ ์Šคํฌ์ผ๋Ÿฌ ์•„๋ž˜์— ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ๊ธฐ๋Šฅ์ด ๋น„๋™๊ธฐ์ธ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
๊ฐ€๋กœ ์ถ•์—์„œ ๋‹ค์Œ ๋ฒˆ await๋Š” ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?

let res = client.get ( "https : // my_api")

.very_long_method_name(param, param, param).await?

.short().await?;

์ง€์—ฐ๋œ ๋ณ€ํ˜•์˜ ๊ฒฝ์šฐ ๊ฑฐ์˜ ํ•ญ์ƒ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

let res = client.get ( "https : // my_api")

.await very_long_method_name(param, param, param)?

.await short()?;

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/57640#issuecomment-456693759 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AIA8Ogyjc8LW6teZnXyzOCo31-0GPohTks5vGAoDgaJpZM4aBlba
.

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์–ด๋–ป๊ฒŒ rustfmt๊ฐ€ ํฌ๋งท์„ ๋๋‚ผ ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ https://github.com/rust-dev-tools/fmt-rfcs ์˜ ๋„๋ฉ”์ธ ์ด๋ฏ€๋กœ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ณ ์ • ์„ฑ๊ณผ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์„ ํƒํ•˜๋“  ์ผ๊ด€๋œ ๋ฌด์–ธ๊ฐ€๊ฐ€์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

@ I60R

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

๋ฌด๋ฃŒ ๊ธฐ๋Šฅ ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๊ณ  ์žˆ๋‹ค๋ฉด ์‹ค์ œ๋กœ ์ ‘๋‘์‚ฌ await ์ž…๋‹ˆ๋‹ค.

์ €๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ C # ์–ธ์–ด ํŒ€์˜ ๊ฒฝํ—˜์„ ๋„ˆ๋ฌด ๋นจ๋ฆฌ ํ›ผ์†ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋งˆ์ดํฌ๋กœ ์†Œํ”„ํŠธ๋Š” ์‚ฌ์šฉ์„ฑ ์—ฐ๊ตฌ์— ๋งŽ์€ ๊ณ ๋ ค๋ฅผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์—์„œ ํ•œ ์ค„์˜ ์ฝ”๋“œ์™€ Rust๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“  ์–ธ์–ด์™€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜์žˆ์„๋งŒํผ ํŠน๋ณ„ํ•˜๋‹ค๋Š” ์ „์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ ์ „์ œ์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ ํ•œ LINQ ๋ฐ ํ™•์žฅ ๋ฉ”์„œ๋“œ๊ฐ€ C #์— ๋„๋ฆฌ ํผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ .await ๊ฐ€ ํ‘œ๋ฉด ๊ตฌ๋ฌธ์ด ์•„๋‹ ๋•Œ .aw ๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์€ ์ €๋ฅผ ํฌํ•จํ•˜์—ฌ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

~ ๋‹ค๋ฅธ ์–ธ์–ด์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ์—๊ฒŒ๋Š” ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ~ ๊ทธ ์™ธ์—๋Š” ์™„๋ฃŒ ํŒ์—…์— await ๋ฐ Future ๋ฉ”์„œ๋“œ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์‹ญ๋‹ˆ๊นŒ?

[...] ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ํ•œ ์ค„์˜ ์ฝ”๋“œ์™€ Rust๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“  ์–ธ์–ด์™€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜์žˆ์„๋งŒํผ ํŠน๋ณ„ํ•˜๋‹ค๋Š” ์ „์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ „์ œ์— ๋™์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค ...]

@lnicola ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ๋†“์นœ ๊ฒฝ์šฐ๋ฅผ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค (๋งŽ์€ ๋Œ“๊ธ€์—์„œ ๋†“์น˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค) : https://github.com/rust-lang/rust/issues/57640#issuecomment -455846086

์‹ค์ œ ์ƒ์‚ฐ ์ฝ”๋“œ์˜ ๋ช‡ ๊ฐ€์ง€ ์‹ค์ œ ์˜ˆ์ œ.

์œ„ ์˜ @Centril ์˜ ์˜๊ฒฌ์„ ๊ฐ์•ˆํ•  ๋•Œ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๊ฒฝํ•ฉ์˜ ์ ‘๋ฏธ์‚ฌ ์˜ต์…˜์€ expr await postfix ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ๊ณผ expr.await postfix ํ•„๋“œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค (์•„๋งˆ๋„ postfix ๋ฉ”์„œ๋“œ ๊ตฌ๋ฌธ์€ ์•„์ง ๋‚˜์˜ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

postfix ํ‚ค์›Œ๋“œ์™€ ๋น„๊ตํ•  ๋•Œ @Centril ์€ postfix ํ•„๋“œ๊ฐ€ "์ ์˜ ํž˜"(IDE๊ฐ€ ์ž๋™ ์™„์„ฑ์œผ๋กœ ๋” ์ž˜ ์ œ์•ˆ ํ•  ์ˆ˜ ์žˆ์Œ)์˜ ์ด์ ์„ ์ œ๊ณตํ•˜๋ฉฐ grep์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์•ž์˜ ์ ์€ ์ฃผ์„์—์„œ ๋‹จ์–ด ์‚ฌ์šฉ๊ณผ์˜ ๋ช…ํ™•์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ @cramertj ๋Š” ์ด๋Ÿฌํ•œ ๊ตฌ๋ฌธ์ด ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด๋‚˜ ํ•„๋“œ ์•ก์„ธ์Šค๊ฐ€ ์•„๋‹˜์„ ๋ถ„๋ช…ํžˆ ํ•ด์ค€๋‹ค๋Š” ์ ์—์„œ ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธ ํ•œ๋‹ค๊ณ  ์ฃผ์žฅ ํ–ˆ์Šต๋‹ˆ๋‹ค. @withoutboats ๋Š” postfix ํ‚ค์›Œ๋“œ๊ฐ€ ๊ฐ€์žฅ ์นœ์ˆ™ํ•œ postfix ์˜ต์…˜ ์ด๋ผ๊ณ  ์ฃผ์žฅ ํ–ˆ์Šต๋‹ˆ๋‹ค.

"์ ์˜ ํž˜"๊ณผ ๊ด€๋ จํ•˜์—ฌ IDE๋Š” ์—ฌ์ „ํžˆ await ๋ฅผ ์  ๋‹ค์Œ์— ์™„์„ฑ์œผ๋กœ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์™„์„ฑ์ด ์„ ํƒ๋˜๋ฉด ์ ์„ ์ œ๊ฑฐํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ์Šค๋งˆํŠธ ํ•œ IDE (์˜ˆ : RLS ํฌํ•จ)๋Š” Future๋ฅผ ์•Œ์•„ ์ฐจ๋ฆฌ๊ณ  ๊ณต๋ฐฑ ๋’ค์— await ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

postfix ํ•„๋“œ ๋ฐ ๋ฉ”์„œ๋“œ ์˜ต์…˜์€ postfix ํ‚ค์›Œ๋“œ์™€ ๋น„๊ตํ•˜์—ฌ ๋ชจํ˜ธํ•จ์œผ๋กœ ์ธํ•ด ์ด์˜๋ฅผ ์ œ๊ธฐ ํ•  ์ˆ˜์žˆ๋Š” ๋” ํฐ ํ‘œ๋ฉด์ ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. postfix ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ postfix ํ•„๋“œ / ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์ง€์› ์ค‘ ์ผ๋ถ€๋Š” ๋ฉ”์†Œ๋“œ ์ฒด์ธ์— ๊ณต๋ฐฑ์ด ์žˆ๋‹ค๋Š” ์•ฝ๊ฐ„์˜ ๋ถˆํŽธ ํ•จ์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฏ€๋กœ postfix ํ‚ค์›Œ๋“œ ( foo.bar() await ๋Œ€ํ•œ @valff ์˜ ๊ด€์ฐฐ ์„ ๊ฒ€ํ† ํ•˜๊ณ  ์ฐธ์—ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค foo.bar() await )๋Š” ์ผ๋ฐ˜ํ™” ๋œ ์œ ํ˜• ์ง€์ • ( foo.bar() : Result<Vec<_>, _> )๋ณด๋‹ค ๋” ๋†€๋ผ์šด ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ ๋œ ๋ง‰๊ฐ„ ์ดํ›„์— ์—ฐ๊ฒฐ์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

@ivandardi , @lnicola ,

๋ฌด๋ฃŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์˜ˆ์ œ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์ตœ๊ทผ ๋Œ“๊ธ€์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์˜ˆ์ œ๋ฅผ ์›ํ•˜๋ฉด ์ด์ „ ๋Œ“๊ธ€ ์—์„œ ๋งˆ์ง€๋ง‰ ์Šคํฌ์ผ๋Ÿฌ๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

future.await? ๋Œ€ future await? ํ† ๋ก ์„

๋„ˆ๋ฌด ๋งŽ์ด ๋…ผ์˜๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ์‹œ๊ฐ์  ์ธ ๊ทธ๋ฃนํ™” ๋˜๋Š” ๋ฉ”์†Œ๋“œ ์ฒด์ธ์˜ grepping์ž…๋‹ˆ๋‹ค.

(๊ตฌ๋ฌธ ๊ฐ•์กฐ๋ฅผ ์œ„ํ•ด await ๋Œ€์‹  match )

post(url).multipart(form).send().match?.error_for_status()?.json().match?

๋น„๊ตํ•˜์ž๋ฉด

post(url).multipart(form).send() match?.error_for_status()?.json() match?

๋‚˜๋Š” ์‹œ๊ฐ์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์ฒด์ธ์„ ์Šค์บ” ํ•  ๋•Œ await ๋ช…ํ™• I๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์‹๋ณ„ send().await? ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ณผ ๊ธฐ๋‹ค๋ฆฌ๊ณ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ send() .

๊ทธ๋Ÿฌ๋‚˜ ๋‘ ๋ฒˆ์งธ ์ฒด์ธ์—์„œ await ์‹œ๊ฐ์ ์œผ๋กœ ์Šค์บ”ํ•˜๋ฉด ๋จผ์ € await?.error_for_status() (๊ฐ€) ํ‘œ์‹œ๋˜๊ณ  ์ด๋™, ์•„๋‹ˆ์š”, ๋ฐฑ์—… ํ•œ ๋‹ค์Œ send() await ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


์˜ˆ, ์ด๋Ÿฌํ•œ ๋™์ผํ•œ ์ธ์ˆ˜ ์ค‘ ์ผ๋ถ€๊ฐ€ Generalized Type Ascription์— ์ ์šฉ๋˜์ง€๋งŒ ์•„์ง ํ—ˆ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ํƒ€์ž… ์–ด ์Šคํฌ๋ฆฝ ์…˜์„ ์ข‹์•„ํ•˜์ง€๋งŒ _general_ ํ‘œํ˜„ ์ปจํ…์ŠคํŠธ์—์„œ (๋ชจํ˜ธํ•œ) ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„์ด ํ† ๋ก ์—์„œ๋Š” ์ฃผ์ œ๋ฅผ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ await ๊ธˆ์•ก์€ ์œ ํ˜• ์ง€์ • ๊ธˆ์•ก๋ณด๋‹ค ํ›จ์”ฌ ๋” ํฐ ๋ณ€ํ™”๊ฐ€ ์žˆ์Œ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค.

Generalized Type Ascription์€ ๊ณ ์œ  ํ•œ ์—ฐ์‚ฐ์ž : ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜•์„ ํ• ๋‹น ๋œ ํ‘œํ˜„์‹์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ดํ•ญ ์—ฐ์‚ฐ์ž์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ์ด๋ฅผ ์ฝ์œผ๋ฉด ๋‘ ํ‘œํ˜„์‹์ด ๋‹จ์ผ ํŠธ๋ฆฌ์ž„์„ (์‹œ๊ฐ์ ์œผ๋กœ) ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. future await ์—๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์œผ๋ฉฐ ์ฒซ ๋ฒˆ์งธ ๊ฐ€ ํ‚ค์›Œ๋“œ ์ธ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์—ฐ์‚ฐ์ž๋กœ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์€ ๋‘ ์ด๋ฆ„์„ ๊ฑฐ์˜ ๋ณผ ์ˆ˜์—†๋Š” ์Šต๊ด€์—์„œ future_await ๋กœ ์‰ฝ๊ฒŒ ์ฐฉ๊ฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ์™ธ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์›ํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์„ ์˜์–ด์™€ ๋น„๊ตํ•˜์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์„œ ํ•˜์ดํ”ˆ ( - )์€ ๋ณ„๋„์˜ ๊ฒƒ์œผ๋กœ ์‰ฝ๊ฒŒ ํ•ด์„ ๋  ์ˆ˜์žˆ๋Š” ๋‹จ์–ด๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ C # ์–ธ์–ด ํŒ€์˜ ๊ฒฝํ—˜์„ ๋„ˆ๋ฌด ๋นจ๋ฆฌ ํ›ผ์†ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์„œ "๋„ˆ๋ฌด ๋น ๋ฅด๋‹ค"์™€ "๋ถˆ์‹ "์ด ๊ณตํ‰ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. async / await RFC ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•œ ๋™์ผํ•œ ์ผ์ด ์—ฌ๊ธฐ์—์„œ ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ˆ˜ํ–‰ ๋œ ์ด์œ ๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•˜๊ณ  ๊ท ํ˜•์ด ์šฐ๋ฆฌ์—๊ฒŒ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‚˜์˜ค๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. C # ํŒ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์‹œ ์ ์œผ๋กœ ์–ธ๊ธ‰๋˜๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค.

await ์˜ ์•„์ด๋””์–ด๋Š” ์‹ค์ œ๋กœ ๋ฏธ๋ž˜๊ฐ€ ์•„๋‹Œ ๊ฒฐ๊ณผ๋ฅผ ์›ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ await ๊ตฌ๋ฌธ์€ 'ref'๊ตฌ๋ฌธ๊ณผ ๋น„์Šทํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

let future = task()
๊ทธ๋Ÿฌ๋‚˜
let await result = task()

๊ทธ๋ž˜์„œ ์ฒด์ธ์„ ์œ„ํ•ด ๋‹น์‹ ์€

task().chained_method(|future| { /* do something with future */ })

๊ทธ๋Ÿฌ๋‚˜

task().chained_method(|await result| { /* I've got the result */ })
- foo.await             // NOT a real field
- foo.await()           // NOT a real method
- foo.await!()          // NOT a real macro

๊ทธ๋“ค์€ ๋ชจ๋‘ ์ฒด์ด๋‹๊ณผ ์ž˜ ์ž‘๋™ํ•˜๋ฉฐ ๋ชจ๋‘ ์‹ค์ œ ํ•„๋“œ / ๋ฐฉ๋ฒ• / ๋งคํฌ๋กœ๊ฐ€ ์•„๋‹Œ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ await ๋Š” ํ‚ค์›Œ๋“œ๋กœ์„œ ์ด๋ฏธ ํŠน๋ณ„ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ํŠน๋ณ„ํ•˜๊ฒŒ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๊ฐ€์žฅ ๋‹จ์ˆœํ•œ foo.await ์„ ํƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. () ๋ฐ !() ๋ชจ๋‘ ์—ฌ๊ธฐ์—์„œ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค.

๋ฆฌ๊ณ 

- foo await        // IS neither field/method/macro, 
                   // and clearly seen as awaited thing. May be easily chained. 
                   // Allow you to easily spot all async spots.

ํ—‰

await์— ๋Œ€ํ•œ ์ฒซ ๋ฒˆ์งธ ์ฒด์ธ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์Šค์บ” ํ•  ๋•Œ send (). await๋ฅผ ๋ช…ํ™•ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. send ()์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฏธ๋ž˜๊ฐ€ ์–ด๋””์—์„œ ๊ฑด์„ค๋˜๊ณ  ์–ด๋””๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋Š”์ง€๋ณด๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ์ŠคํŽ˜์ด์Šค ๋ฒ„์ „์„ ๋” ์ข‹์•„ํ•œ๋‹ค. ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค, IMHO

image

์  ๋ถ„๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ณผ ๋งค์šฐ ๋น„์Šทํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ฐ•์กฐ ํ‘œ์‹œ๋Š” ๋งŽ์€ ๋„์›€์ด๋˜์ง€ ์•Š์œผ๋ฉฐ ํ•ญ์ƒ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ฒด์ธ์ด ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ( ? ์ œ์™ธํ•˜์ง€๋งŒ foo await? ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค).

post(url).multipart(form).send().match?

vs

post(url).multipart(form).send() match?

ํ›„์ž๊ฐ€ ํ›จ์”ฌ ๋” ๋‚ ์”ฌํ•ด ๋ณด์ด๋Š” ๊ณณ.

๋”ฐ๋ผ์„œ future await ๋ฐ future.await ์ขํ˜”๋‹ค๋ฉด ๋งˆ๋ฒ•์˜ "์ "์„ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋…ผ์Ÿ์„ ๋ฉˆ์ถ”๊ณ  ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์„ ํƒ์  ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ•ด๋กญ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Rust์—๋Š” ๊ทธ๋Ÿฌํ•œ ์˜ˆ์ œ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ž˜ ์•Œ๋ ค์ง„ ๊ฒƒ์€ ๋งˆ์ง€๋ง‰ sperator ( ; ๋˜๋Š” , ๋˜๋Š” (A,B,) ์—์„œ์™€ ๊ฐ™์ด ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ์ดํ›„์˜ ๋ชจ๋“  ๊ฒƒ)๋Š” ๋Œ€๋ถ€๋ถ„ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์™œ ์šฐ๋ฆฌ๊ฐ€ ์ ์„ ์„ ํƒ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ์ด์œ ๋ฅผ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Nightly์—์„œ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ƒํƒœ๊ณ„๊ฐ€ ์ž์‹ ์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ฒƒ์„ ๊ฒฐ์ •ํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€์‹œ๊ธฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์„ ํ˜ธํ•˜๋Š” ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฐํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ Stable์— ๋„์ฐฉํ•˜๊ธฐ ์ „์— ์ปค๋ฎค๋‹ˆํ‹ฐ ์‚ฌ์šฉ์„ ๊ฒ€ํ† ํ•˜๊ณ  ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผํ• ์ง€ ์•„๋‹ˆ๋ฉด ๋‘˜ ๋‹ค ๋‚จ๊ฒจ ๋‘˜์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋งคํฌ๋กœ๊ฐ€์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ์ผ๋ฅ˜๋ผ๊ณ  ๋Š๋ผ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฐœ๋…์— ์™„์ „ํžˆ ๋™์˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ (์ฒ˜์Œ์—๋Š” ๊ทธ๋Ÿฌํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค) await!() ๋Œ€ํ•œ ์ด์ „ ์˜๊ฒฌ ์„ ๋‹ค์‹œ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. await!() (์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ์— ๊ด€๊ณ„์—†์ด) "์‹ค์ œ ๋งคํฌ๋กœ"๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ๊ฒฐ๊ตญ ๋„ˆ๋ฌด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด์ด ๊ธฐ๋Šฅ์ด ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์•ˆ์ •ํ™”๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Rust์— ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“ ์ด ์Šค๋ ˆ๋“œ๋ฅผ ํ•˜๋ฃจ ๋™์•ˆ ์ž ๊ทธ๋Š” ๊ฒƒ์€ ๋งŽ์€ ๋„์›€์ด๋˜์—ˆ์œผ๋ฉฐ ์ง€๊ธˆ ๊ตฌ๋…์„ ์ทจ์†Œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด ์š”์  ์ค‘ ํ•˜๋‚˜์— ์ง์ ‘ ๋‹ต์žฅํ•˜๋Š” ๊ฒฝ์šฐ ์–ธ์ œ๋“ ์ง€ ์ €๋ฅผ ์–ธ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.

. ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋‚ด ์ฃผ์žฅ์€ await ์ด ํ•„๋“œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ํ•„๋“œ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์•„์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ ๋ฐ ๊ตต์€ ๊ธ€๊ผด์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํŠน์ˆ˜ ํ•„๋“œ ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์‚ฌ์šฉ์ž ์ง€์ • ์„œ์‹๋„ . ๋’ค์— ๋‹จ์–ด๊ฐ€ ์˜ค๋Š” ๊ฒƒ์€ ํ•„๋“œ ์•ก์„ธ์Šค์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ํ•„๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ๊ฐ•์กฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ IDE ํ†ตํ•ฉ์„ ์œ„ํ•ด . ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Intellij IDEA์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ ์™„์„ฑ ๊ธฐ๋Šฅ ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ . ์™„์„ฑ์œผ๋กœ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

await ๋ฅผ ์ œ์–ด ํ๋ฆ„ ํ‚ค์›Œ๋“œ๋กœ ์ธ์‹ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. await ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด . ์—†๋Š” ๋ณ€ํ˜•์„ ๊ณ ๋ คํ•ด์•ผํ•˜๋ฉฐ ์ค‘๋‹จ ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ์ฐจ๋‹จ ์ง€์ ์„ ๋” ์ž˜ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

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

๋” ๋งŽ์€ ์˜ˆ

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

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

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

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

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

๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ

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

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

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

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

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

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


์ด๊ฒƒ์€ ๋˜ํ•œ ํ˜•์‹์— ๋Œ€ํ•œ @ivandardi ํฌ์ธํŠธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” postfix์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์˜ˆ์ œ๊ฐ€ ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ๋ฐ˜๋Œ€ ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธด ๊ธฐ๋‹ค๋ฆผ ์ฒด์ธ์€ ์ž˜๋ชป๋œ ๋Š๋‚Œ์„ ์ฃผ๋ฏ€๋กœ ํ–ฅํ›„ ๊ฒฐํ•ฉ ์ž์—๊ฒŒ ์ฒด์ธ์„ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ต (๊ตฌ๋ฌธ ๊ฐ•์กฐ๋ฅผ ์œ„ํ•ด match ๋ฅผ await ์‚ฌ์šฉ) :

post(url)?.multipart(form).send()?.match?.error_for_status()?.json().match?

...์—

let value = await post(url)?.multipart(form).send()?.error_for_status()
                 .and_then(|resp| resp.json()) // and then parse JSON

// now handle errors

์ค‘๊ฐ„์— ๊ธฐ๋‹ค๋ฆผ์ด ๋ถ€์กฑํ•œ ๊ฒƒ์„ ์•„์‹œ๋‚˜์š”? ์—ฐ๊ฒฐ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋‚˜์€ API ์„ค๊ณ„๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. send() ๊ฐ€ 200์ด ์•„๋‹Œ ์ƒํƒœ ๋ฉ”์‹œ์ง€๋ฅผ ํ•˜๋“œ ์˜ค๋ฅ˜๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๊ฐ€์žˆ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • Future๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ถ”๊ฐ€ ๋Œ€๊ธฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ๋‹น์žฅ ์ ์–ด๋„ reqwest ์—์„œ๋Š” ์ œ์ž๋ฆฌ์—์„œ ์‹คํ–‰๋˜๊ณ  ์ƒˆ๋กœ์šด ๋ฏธ๋ž˜๊ฐ€ ์•„๋‹Œ ํ‰๋ฒ”ํ•œ Result ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ฒด์ด๋‹ awaits๋Š” ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” ๊ฐ•๋ ฅํ•œ ์ฝ”๋“œ ๋ƒ„์ƒˆ ์ด๋ฉฐ .await ๋˜๋Š” .await() ๋Š” ๋งŽ์€ ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. .await ํŠนํžˆ ๋ณ€์ˆ˜ ๋ฉค๋ฒ„ ์•ก์„ธ์Šค๊ฐ€ ๋งˆ์ˆ ์ฒ˜๋Ÿผ ํŠน๋ณ„ํ•œ ๋™์ž‘์„ ํ•  ์ˆ˜์žˆ๋Š” Python ๋˜๋Š” PHP์—์„œ ๋‚˜์˜จ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

await ๋Š” "๊ณ„์†ํ•˜๊ธฐ ์ „์— ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ "๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์ด๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ช…๋ฐฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๋Š” ๋ง ๊ทธ๋Œ€๋กœ and_then ๊ฒฐํ•ฉ ์ž์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ž ์žฌ์  ์ธ ๋ฐฉ๋ฒ•์€ async / await ํ‘œํ˜„์‹๊ณผ ํ“จ์ฒ˜๋ฅผ ๋ฐ˜๋ณต์ž์ฒ˜๋Ÿผ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ชจ๋‘ ๊ฒŒ์œผ๋ฅธ ๋งŽ์€ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ , (๊ตฌ๋ฌธ์„ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค for-in ๋ฐ˜๋ณต์ž๋ฅผ ๋“ค์–ด, await ์„ ๋ฌผ์— ๋Œ€ํ•œ). ๋ฐ˜๋ณต์ž๊ฐ€ ์—ฌ๊ธฐ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ๋ฌธ ํ™•์žฅ์„ ์ œ์•ˆํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋น„๋™๊ธฐ ์ž‘์—… / ๋ฏธ๋ž˜๋Š” ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋ฉฐ ํ•œ ๋ฒˆ๋งŒ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๊ฝค ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ•จ์ˆ˜์˜ ์ฒ˜์Œ ๋ช‡ ๊ฐœ์˜ ๋“ค์—ฌ ์“ฐ๊ธฐ๋ฅผ ์ˆ˜์ง์œผ๋กœ ํ›‘์–ด๋ณด๊ณ  ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜๋Š” ์œ„์น˜๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋น„์ „์€ ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์œผ๋ฉฐ, ๋ผ์ธ์˜ ๋์—์„œ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ์ค‘๊ฐ„์— ๊ฐ‡ํ˜€ ์žˆ์œผ๋ฉด ์ผ์ด ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ ์ ธ์„œ ์›์‹œ ์„ ๋ฌผ์„ ์™„์ „ํžˆ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋‚˜ ๋Œ“๊ธ€์„ ๋‹ฌ๊ธฐ ์ „์—์ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์–ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค .

Async / await๋Š” ํŽธ๋ฆฌํ•จ์ด ์•„๋‹™๋‹ˆ๋‹ค . ๊ฒฐํ•ฉ์ž๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค .

๊ฒฐํ•ฉ ์ž๋กœ ํ•  ์ˆ˜์—†๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ "๋Œ€์‹  ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ž"๋ผ๋Š” ์ œ์•ˆ์€ ์ฃผ์ œ๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ด๋ฉฐ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋…ผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ค‘๊ฐ„์— ๊ธฐ๋‹ค๋ฆผ์ด ๋ถ€์กฑํ•œ ๊ฒƒ์„ ์•„์‹œ๋‚˜์š”? ์—ฐ๊ฒฐ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋‚˜์€ API ์„ค๊ณ„๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ ๋น„๋™๊ธฐ ์˜ˆ์ œ์—์„œ๋Š” ์˜ˆ์œ ์ฒด์ธ์„ ์–ป์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ์˜ˆ :

req.into_body().concat2().and_then(move |chunk| {
    from_slice::<Update>(chunk.as_ref())
        .into_future()
        .map_err(|_| {
            ...
        })
        .and_then(|update| {
            ...
        })
        .and_then(move |(user, file_id, chat_id, message_id)| {
            do_thing(&file_id)
                .and_then(move |file| {
                    if some_cond {
                        Either::A(do_yet_another-thing.and_then(move |bytes| {
                            ...

                            if another_cond {
                                ...
                                Either::A(
                                    do_other_thing()
                                        .then(move |res| {
                                            ...
                                        }),
                                )
                            } else {
                                Either::B(future::ok(()))
                            }
                        }))
                    } else {
                        Either::B(future::ok(()))
                    }
                })
                .map_err(|e| {
                    ...
                })
        })
        // ...and here we unify both paths
        .map(|_| {
            Response::new(Body::empty())
        })
        .or_else(Ok)
})

์กฐํ•ฉ๊ธฐ๋Š” ์—ฌ๊ธฐ์„œ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค‘์ฒฉ์€ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๋‘ ๋ฒˆ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค). ๋์— Either:A(Either:A(Either:A(...))) ํ†ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

OTOH ๋Š” async / await๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค .

@Pauan ์ด async/await ์€ (๋Š”) ๋น„์Šทํ•ด ๋ณด์ด์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•ด์•ผ ํ•  ๋” ์ค‘์š”ํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


๋‚ด ๋Œ“๊ธ€์— ๋ฐ˜๋Œ€ ํˆฌํ‘œ๋ฅผํ•œ๋‹ค๊ณ ํ•ด์„œ ๊ฒฐํ•ฉ์ž๊ฐ€ ๋” ํŽธ๋ฆฌํ•ด์ง€์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

type ascription comment๋ฅผ ์ฝ์œผ๋ฉด์„œ await ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ๋ณด์ผ์ง€ ์ƒ๊ฐํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด .await ๋˜๋Š” .await() ๋ฅผ ํ˜ผ๋™ํ•˜๋Š” ๋ฉค๋ฒ„ ํ•„๋“œ / ๋ฉ”์†Œ๋“œ ์•ก์„ธ์Šค๋กœ ์˜ˆ์•ฝ ํ•œ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ "ascription"๊ตฌ๋ฌธ์ด ์˜ต์…˜์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : "give me what await ๋ฐ˜ํ™˜ ").

๊ตฌ๋ฌธ ๊ฐ•์กฐ๋ฅผ ์œ„ํ•ด await ์— yield ์‚ฌ์šฉ

let result = connection.fetch("url"):yield?.collect_async():yield?;

์œ ํ˜• ์ง€์ •๊ณผ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ :

let result = connection.fetch("url") : yield?
    .collect_async() : yield Vec<u64>?;

์žฅ์  : ์—ฌ์ „ํžˆ ๋ฉ‹์ง€๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค (IMHO), ํ•„๋“œ / ๋ฉ”์†Œ๋“œ ์•ก์„ธ์Šค์™€ ๊ตฌ๋ฌธ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
๋‹จ์  : ์œ ํ˜• ์ง€์ • (?)๊ณผ ์ž ์žฌ์  ์ธ ์ถฉ๋Œ, ์ด๋ก ์ ์œผ๋กœ ๋‹ค์ค‘ ์ง€์ • ๊ฐ€๋Šฅ :

foo():yield:yield

ํŽธ์ง‘ : ๊ฒฐํ•ฉ ๋œ ์˜ˆ์—์„œ 2 ๊ฐœ์˜ ๋น„๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ๋…ผ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

let result = connection.fetch("url") : yield?
    .collect_async() : yield : Vec<u64>?;

@Pauan ํ•ด๋‹น ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ๊ณผ๋„ํ•˜๊ฒŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถ€์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐํ•ฉ์ž๋Š” ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด await ๊ตฌ๋ฌธ๊ณผ ํ•จ๊ป˜ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ฌธ์ œ๋Š” ํ•ญ์ƒ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ํ“จ์ฒ˜๊ฐ€ 'static ์—ฌ์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์ง€๋งŒ, ํ•ด๋‹น ๊ฒฐํ•ฉ ์ž์—์„œ ์ฐธ์กฐ๋กœ ๋ณ€์ˆ˜๋ฅผ ์บก์ฒ˜ ํ•œ ๊ฒฝ์šฐ 'static ๊ฐ€ ์•„๋‹Œ 'static ๋‹น์‹ ์ดํ•˜์ง€์—์žˆ๋Š” FN ๋ฏธ๋ž˜ํ•˜๋ฉด ๋น„๋™๊ธฐ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค 'static . ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```๋…น
// ์Šฌ๋ผ์ด์Šค : & [T]

let x = await future.and_then (| i | if slice.contains (i) {async_fn (slice)});

๊ทธ๋ž˜์„œ ์ €๋Š” ์ „ํ˜€ ์ฃผ์„์„ ๋‹ฌ์ง€ ์•Š์„ ๊ณ„ํš ์ด์—ˆ์ง€๋งŒ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์ž‘์„ฑํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ์ฝ์–ด์•ผํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๋ฉ”๋ชจ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ ‘๋‘์‚ฌ await ์€ ๋ˆˆ์— ๋„๊ธฐ ํ›จ์”ฌ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•  ๋•Œ ( async fn ๋‚ด๋ถ€) ๋˜๋Š” ์™ธ๋ถ€ (์ผ๋ถ€ ๋งคํฌ๋กœ ๋ณธ๋ฌธ์˜ ํ‘œํ˜„์—์„œ) ๋‘˜ ๋‹ค์ž…๋‹ˆ๋‹ค.
  • await ์ ‘๋ฏธ์–ด๋Š” ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๊ฐ€ ๊ฑฐ์˜ ๋˜๋Š” ์ „ํ˜€์—†๋Š” ์ฒด์ธ์—์„œ ์ž˜ ๋ˆˆ์— ๋„๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํด๋กœ์ € ๋˜๋Š” ๋‹ค๋ฅธ ์ œ์–ด ๊ตฌ์กฐ์™€ ์œ ์‚ฌํ•˜๊ฒŒ๋˜๋ฉด awaits ๋Š” ๋ˆˆ์— ๋„์ง€ ์•Š๊ฒŒ๋˜๊ณ  ๊ฐ„๊ณผํ•˜๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  • .await ์˜์‚ฌ ํ•„๋“œ๊ฐ€ ๋งค์šฐ ์ด์ƒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•œ ๋‹ค๋ฅธ ๋ถ„์•ผ์™€๋Š” ์ „ํ˜€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • IDE ๊ฐ์ง€ ๋ฐ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์„ ๋•Œ ๊ฐ€๋…์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋ฌธ๋ฒ•์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ตœ๊ทผ ๋…ผ์˜์™€ ๋„๊ตฌ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด IDE / ํŽธ์ง‘๊ธฐ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” await!() ๋งคํฌ๋กœ๊ฐ€ "์ผ๋ฅ˜๋ผ๊ณ  ๋Š๋ผ์ง€ ์•Š๋Š”๋‹ค"๋Š” ๊ฐ์ •์„ ๊ณต์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งคํฌ๋กœ๋Š” Rust์—์„œ ์™„์ „ํžˆ ์ผ๋ฅ˜ ์‹œ๋ฏผ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ "์‚ฌ์šฉ์ž ์ฝ”๋“œ์—์„œ ๊ตฌ๋ฌธ ๋ฐœ๋ช…"์„ ์œ„ํ•ด์„œ๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋งŽ์€ "๋‚ด์žฅ"๋งคํฌ๋กœ๋Š” ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋‹จ์ˆœํ•œ ๊ตฌ๋ฌธ์ƒ์˜ ์ด์œ ๋กœ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. format!() ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์ •์ ์œผ๋กœ ํ˜•์‹์„ ๊ฒ€์‚ฌํ•˜๋Š” ํ˜•์‹ ๋ฌธ์ž์—ด์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. include_bytes!() ๋˜ํ•œ ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋‹จ์ˆœํ•œ ๊ตฌ๋ฌธ์ƒ์˜ ์ด์œ  ๋•Œ๋ฌธ์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด๋ถ€์—์„œ ํŠน๋ณ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๋ฌธ ํ™•์žฅ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์–ธ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์ผ์ข…์˜ ๋‚ด ์š”์ ์ž…๋‹ˆ๋‹ค. ๋งคํฌ๋กœ๋Š” ๊ท ์ผํ•˜๊ณ  ๋†€๋ผ์šด ๋ฐฉ๋ฒ•์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์„ ๋„์ž…ํ•˜๊ณ  ์ˆจ๊ธฐ๋Š” ์™„๋ฒฝํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค

๊ทธ๋ž˜์„œ ์ €๋Š” ํŠน๋ณ„ํ•œ ํ‚ค์›Œ๋“œ์˜ ํ•„์š”์„ฑ์„ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ‚ค์›Œ๋“œ๊ฐ€ ๋˜๋ ค๋ฉด ๊ทธ์ € ๊ทธ์ € ๊ทธ์ € ํ‚ค์›Œ๋“œ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋กœ ์œ„์žฅํ•œ ๋™๊ธฐ๋ฅผ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ํ•„๋“œ ์•ก์„ธ์Šค๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์›๊ฒฉ์œผ๋กœ ํ•„๋“œ ์•ก์„ธ์Šค ์™€ ๋„

@ H2CO3 await! ๋งคํฌ๋กœ๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์†์„ฑ์„ ์ œ์™ธํ•˜๊ณ  ๋ชจ๋“  ๋ฐ”๋žŒ์งํ•œ ๋ฐฉ์‹์œผ๋กœ ์ข‹์Šต๋‹ˆ๋‹ค.

  1. ์ถ”๊ฐ€ ์ค‘๊ด„ํ˜ธ๋Š” ๋‹น์‹ ์ด ์•„์ง ์ˆ˜์ฒœ ๊ฐœ๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ ์ •๋ง ์งœ์ฆ๋‚ฉ๋‹ˆ๋‹ค. Rust๋Š” ๊ฐ™์€ ์ด์œ ๋กœ if/while/... ๋ธ”๋ก์—์„œ ์ค‘๊ด„ํ˜ธ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•˜์ง€ ์•Š์€ ATM์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.
  2. async ๊ฐ€ ํ‚ค์›Œ๋“œ ์ธ ๋น„๋Œ€์นญ. Async๋Š” ๋ฉ”์„œ๋“œ ๋ณธ๋ฌธ์— ํ•˜๋‚˜์˜ ๋งคํฌ๋กœ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜ ์œ„์— #[async] ์†์„ฑ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†์„ฑ์ด ๋ธ”๋ก ๋“ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€๋งŒ await ํ‚ค์›Œ๋“œ ๋ฐœ์ƒ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€์น˜๋ฅผ ์ œ๊ณต

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜ ์œ„์— #[async] ์†์„ฑ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋žซ๋™์•ˆ ๊ทธ๋žฌ๊ณ , ๊ทธ๊ฒƒ์ด ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด๋‹ˆ ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. #[async] ์†์„ฑ์€ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์ง€๋งŒ ์ด์ œ๋Š” ์†์„ฑ๊ณผ ์œ ์‚ฌํ•œ ์ ˆ์ฐจ ์  ๋งคํฌ๋กœ๊ฐ€ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐ˜๋ฉด ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋ฅผ ๋„์ž…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ์—๋„ ๊ตฌ๋ฌธ ์ ์œผ๋กœ๋‚˜ ์˜๋ฏธ ์ ์œผ๋กœ ๋‚˜๋จธ์ง€ ์–ธ์–ด์™€๋„ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ํŠน๋ณ„ํžˆ ์ฒ˜๋ฆฌ) ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด.

@ H2CO3 ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ await ๋ฅผ ๋งคํฌ๋กœ ๋กœ ์‚ฌ์šฉ ํ•˜๋Š” ๋ชฉ์ ์ด๋‚˜ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚ด๋ถ€์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด ํ๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋‚ด์žฅ ๋งคํฌ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@ I60R ์žฅ์ ์€ ๋‚˜๋จธ์ง€ ์–ธ์–ด์™€์˜ ํ†ต์ผ์„ฑ์ด๋ฏ€๋กœ ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ์ž์ฒด์ ์œผ๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๋ชจ๋“  ์ง์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ์„  ์ˆœ์œ„์™€ ๊ทธ๋ฃนํ™”๋Š” ๋งคํฌ๋กœ ํ˜ธ์ถœ์—์„œ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์ด ์™œ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚ด์žฅ ๋งคํฌ๋กœ๊ฐ€์žˆ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ์‚ฌ์‹ค ๊ฑฐ์˜ ๋ชจ๋“  ๋‚ด์žฅ ๋งคํฌ๋กœ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์› ์—†์ด๋Š” (ํ•ฉ๋ฆฌ์ ์œผ๋กœ / ํšจ์œจ์ ์œผ๋กœ / ๋“ฑ) ๋‹ฌ์„ฑ ํ•  ์ˆ˜์—†๋Š” "์ด์ƒํ•œ"์ผ์„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. await!() ๋Š” ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์ƒˆ๋กœ์šด ์นจ์ž…์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด์ „์— ์•”์‹œ ์  await๋ฅผ ์ œ์•ˆํ–ˆ๊ณ  ์ตœ๊ทผ์—๋Š” non-chainable await๋ฅผ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๋ช…์‹œ ์  ๊ธฐ๋‹ค๋ฆผ์„ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (๋ณ€๊ฒฝ๋˜๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒโ€ฆ). ๊ทธ๋Ÿฌ๋‚˜ ๋ช…์‹œ ์„ฑ์˜ ์„ธ๋ถ„์„ฑ์€ ์ƒ์šฉ๊ตฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ฆ‰, ๋™์ผํ•œ ํ‘œํ˜„์‹์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•„์š”ํ•˜๋ฉด ์ƒ์šฉ๊ตฌ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).

[ ๊ฒฝ๊ณ  : ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œ์•ˆ์€ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์ง€๋งŒ ์ง„์‹ฌ์œผ๋กœ ๊ธฐํšŒ๋ฅผ์ฃผ์‹ญ์‹œ์˜ค.]

๋Œ€๋ถ€๋ถ„์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํƒ€ํ˜‘ํ•˜๊ณ  "๋ถ€๋ถ„ ์•”์‹œ ์  ๋Œ€๊ธฐ"๋ฅผ ํ—ˆ์šฉํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์‹ ์ฒด์ธ ๋‹น ํ•œ ๋ฒˆ ์ฝ๋Š” ๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ๋ช…์‹œ ์ ์ผ๊นŒ์š”?

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

์ด๊ฒƒ์€ ๊ฐ’ ๊ตฌ์กฐํ™”์™€ ๋น„์Šทํ•œ ๊ฒƒ์œผ๋กœ, ์ด๊ฒƒ์„ ํ‘œํ˜„ ๊ตฌ์กฐํ™”๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

// Value de-structuring
let (a, b, c) = ...;

// De-sugars to:
let _abc = ...;
let a = _abc.0;
let b = _abc.1;
let c = _abc.2;
// Expression de-structuring
await response = client.get("https://my_api").send()?.json()?;

// De-sugards to:
// Using: prefix await with explicit precedence
// Since send() and json() return impl Future but ? does not expect a Future, de-structure the expression between those sub-expressions.
let response = await (client.get("https://my_api").send());
let response = await (response?.json());
let response = response?;



md5-26395496ff0c677f1051cf90a7c11b94



```rust
// If needed, given that the compiler knows these expressions creating a, b are independent,
// each of the expressions would be de-structured independently.
await (a, b) = (
    client.get("https://my_api_a").send()?.json()?,
    client.get("https://my_api_b").send()?.json()?,
);
// De-sugars to:
// Not using await syntax like the other examples since await can't currently let us do concurrent polling.
let a: impl Future = client.get("https://my_api_a").send();
let b: impl Future = client.get("https://my_api_b").send();
let (a, b) = (a.poll(), b.poll());
// return if either a or b is NotReady;

let a: impl Future = a?.json();
let b: impl Future = b?.json();
let (a, b) = (a.poll(), b.poll());
// return if either a or b is NotReady;
let (a, b) = (a?, b?);

๋˜ํ•œ ํ•ต์‹ฌ ์•„์ด๋””์–ด์˜ ๋‹ค๋ฅธ ๊ตฌํ˜„์— ๋งŒ์กฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. "ํ‘œํ˜„ ์ฒด์ธ ๋‹น ํ•œ ๋ฒˆ ์ฝ๋Š” ๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ๋ช…์‹œ์ ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค." ์ƒ์šฉ๊ตฌ๋ฅผ ์ค„์ด๋ฉด์„œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ€์žฅ ์นœ์ˆ™ํ•œ ์ ‘๋‘์‚ฌ ๊ธฐ๋ฐ˜ ๊ตฌ๋ฌธ์œผ๋กœ ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@yazaddaruvala ์œ„ ์˜ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์—ˆ ์œผ๋‹ˆ ์กฐ์‹ฌํ•˜์„ธ์š”.

๋Œ€๋ถ€๋ถ„์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํƒ€ํ˜‘ํ•˜๊ณ  "๋ถ€๋ถ„ ์•”์‹œ ์  ๋Œ€๊ธฐ"๋ฅผ ํ—ˆ์šฉํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์‹ ์ฒด์ธ ๋‹น ํ•œ ๋ฒˆ ์ฝ๋Š” ๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ๋ช…์‹œ ์ ์ผ๊นŒ์š”?

  1. ๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ์•”์‹œ์ ์ธ ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Rust ๋„ค์ดํ‹ฐ๋ธŒ ์ ‘๊ทผ ๋ฐฉ์‹์€ "๋ชจ๋‘ ๋ช…์‹œ ์ "์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์บ์ŠคํŠธ u8-> u32๋„ ๋ช…์‹œ ์ ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  2. ๋” ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” Vec<Future> ๋ฌด์—‡์„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
await response = client.get("https://my_api").send()?.json()?.parse_as::<Vec<String>>()?.map(|x| client.get(x))?;

๋ชจ๋“  ์ค‘์ฒฉ ๋œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด await ์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ข‹์•„, ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ ํ•œ ์ค„์˜ ์ฝ”๋“œ์— ๋Œ€ํ•ด await ์ž‘์—…์„ ํ•  ์ˆ˜์žˆ์„ ๊ฒƒ์ด๋‹ค (๊ทธ๋ž˜์„œ ์ค‘์ฒฉ ๋œ mapFunc ๋Š” ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค). ๊ทธ๋Ÿฌ๋‚˜์ด ๋™์ž‘์„ ๊นจ๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ์‰ฝ๋‹ค. await๊ฐ€ ํ•˜๋‚˜์˜ ์ฝ”๋“œ ๋ผ์ธ์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋ฉด "extract value"์™€ ๊ฐ™์€ ๋ฆฌํŒฉํ† ๋ง์œผ๋กœ ์ธํ•ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

๋‚˜๋Š” ๋‹น์‹ ์ด ์ถ”๊ตฌํ•˜๋Š” ๊ฒƒ์ด ? ๋ณด๋‹ค ์šฐ์„ ํ•˜๋Š” ์ ‘๋‘์‚ฌ await๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๊นŒ? let ํ‚ค์›Œ๋“œ ๋Œ€์‹  await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ชจ๋“  impl Future <_ i = "7"> await์™€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์•„๋ž˜์˜ ์„ธ ๋ฌธ์žฅ์ด ๋™์ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

// foo.bar() -> Result<impl Future<_>, _>>
let a = await foo.bar()?;
let a = await (foo.bar()?);
await a = foo.bar()?;

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ๋‘ ๋ฌธ์žฅ์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

// foo.bar() -> impl Future<Result<_, _>>
await a = foo.bar()?;
let a = await (foo.bar())?;

๊ตฌ๋ฌธ์ด ์ด์ƒ์  ์ผ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ "์•”์‹œ ์  ์ปจํ…์ŠคํŠธ ๋Œ€๊ธฐ"๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ์˜ ๋ฌธ์ œ๊ฐ€ ๋œ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ํ•„์š”ํ•  ๋•Œ await๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜๋ฅผ๋ณด๋‹ค ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ƒ๊ฐ์—, ์งง์€ ํ•œ ์ค„ ์ ‘๋‘์‚ฌ await๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฐ ๋งŽ์€ ์ธ๊ฐ„ ์–ธ์–ด์™€ ์œ ์‚ฌํ•˜๋‹ค๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ await๊ฐ€ ์ ‘๋ฏธ์‚ฌ ์—ฌ์•ผํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ๊ฐ€๋” Await!() ๋งคํฌ๋กœ (๋˜๋Š” ์œ ์‚ฌํ•œ ํ˜•์‹์ด ํ‚ค์›Œ๋“œ์™€ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š”)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜์–ด ๋ฌธ์žฅ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊นŠ์ด์žˆ๋Š” ์ต์ˆ™ ํ•จ์€ ์ฝ”๋“œ ์ฝ๊ธฐ / ์“ฐ๊ธฐ์˜ ์ •์‹ ์  ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ๋” ๊ธด ์—ฐ์‡„ ํ‘œํ˜„์— ๋Œ€ํ•œ ์ ‘๋ฏธ์‚ฌ ํ˜•์‹์—๋Š” ๋ช…ํ™•ํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ, ๊ฐ๊ด€์  ์‚ฌ์‹ค์— ๊ธฐ๋ฐ˜ํ•˜์ง€ ์•Š์€ ๋ช…์‹œ ์  ๊ด€์ ์€ ์ ‘๋‘์‚ฌ์˜ ์ธ๊ฐ„ ๋ณต์žก์„ฑ์ด ๊ตฌ์–ด์— ์˜ํ•ด ๋ณด์กฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํ˜•์‹ ๋งŒ ๊ฐ–๋Š” ๋‹จ์ˆœ์„ฑ ์ด์ ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ๊ฐ–๋Š” ์ž ์žฌ์  ์ธ ์ฝ”๋“œ ๋ช…ํ™•์„ฑ์„ ๋Šฅ๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ ์–ด๋„ ํ˜„์žฌ ์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ฒƒ์„ ์„ ํƒํ•˜๋„๋ก ์‹ ๋ขฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

ํ—‰

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ถ€๋ถ„์ ์œผ๋กœ ์•”์‹œ์ ์ธ ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Rust ๋„ค์ดํ‹ฐ๋ธŒ ์ ‘๊ทผ ๋ฐฉ์‹์€ "๋ชจ๋‘ ๋ช…์‹œ ์ "์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ณด์ง€ ์•Š๋Š”๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•ญ์ƒ ๋ช…์‹œ์ ์ด๊ณ  ์•”์‹œ์ ์ธ ํƒ€ํ˜‘์ด๋ผ๊ณ  ๋ด…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

  • ํ•จ์ˆ˜ ๋ฒ”์œ„์—๋Š” ๋ณ€์ˆ˜ ์œ ํ˜•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ณ€์ˆ˜ ์œ ํ˜•์€ ๋กœ์ปฌ ๋ฒ”์œ„ ๋‚ด์—์„œ ์•”์‹œ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • Clousure ์ปจํ…์ŠคํŠธ๋Š” ์•”์‹œ ์ ์ž…๋‹ˆ๋‹ค.

    • ์ด๋ฏธ ์ง€์—ญ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ถ”๋ก  ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ.

  • ๋Œ€์ถœ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ‰์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ทธ๋Ÿฌ๋‚˜ ๋กœ์ปฌ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ถ”๋ก  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ํ•จ์ˆ˜ ์ˆ˜์ค€์—์„œ ์ˆ˜๋ช…์€ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฐ’์ผ ๋•Œ ๋ช…์‹œ์ ์ผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ๋” ๋งŽ์€ ๊ฒƒ์ด ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ์˜ ๋ชจ๋“  ์ด์ ๊ณผ ํ•จ๊ป˜ ์‹ / ๋ฌธ๋‹น ํ•œ ๋ฒˆ๋งŒ await ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ช…์‹œ ์  ๋ฐ ๊ฐ์†Œ ๋œ ์ƒ์šฉ๊ตฌ ์‚ฌ์ด์˜ ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ธ ์ ˆ์ถฉ์•ˆ์ž…๋‹ˆ๋‹ค.

๋” ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Vec์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ํ•ด์•ผ ํ•  ์ผ?

await response = client.get("https://my_api").send()?.json()?.parse_as::<Vec<String>>()?.map(|x| client.get(x))?;

๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ค๋ฅ˜๋ฅผํ•ด์•ผํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•œ๋‹ค. ์ถ”๋ก  ํ•  ์ˆ˜์—†๋Š” ์—„์ฒญ๋‚œ ์œ ํ˜•์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ, Vec<impl Future> ๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ๋Š”์ด ์Šค๋ ˆ๋“œ์˜ ๊ตฌ๋ฌธ์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

// Given that json() returns a Vec<imple Future>,
// do I use .await on the `Vec`? That seems odd.
// Given that the client.get() returns an `impl Future`,
// do I .await inside the .map? That wont work, given Iterator methods are not `async`
client.get("https://my_api").send().await?.json()[UNCLEAR]?.parse_as::<Vec<String>>()?.map(|x| client.get(x)[UNCLEAR])?;

๋‚˜๋Š” Vec<impl Future> ๊ฐ€ ํ˜•ํŽธ์—†๋Š” ์˜ˆ๋ผ๊ณ  ์ฃผ์žฅํ•˜๊ฑฐ๋‚˜, ์ œ์•ˆ ๋œ ๋ชจ๋“  ๊ตฌ๋ฌธ์„ ๋™์ผํ•œ ํ‘œ์ค€์œผ๋กœ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•œํŽธ, ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ "partial-implicit await"๊ตฌ๋ฌธ์€ ์ผ๋ฐ˜์ ์ธ ์ ‘๋ฏธ์‚ฌ ๋˜๋Š” ์ ‘๋‘์‚ฌ await let (a, b) = (client.get("a") await?, client.get("b") await?); ์‚ฌ์šฉํ•˜๋Š” await (a, b) = (client.get("a")?, client.get("b")?); ์™€ ๊ฐ™์€ ๋” ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ํ˜„์žฌ ์ œ์•ˆ๋ณด๋‹ค ๋” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. -์•”์‹œ ์  ๋ฒ„์ „์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ ์ ˆํ•˜๊ฒŒ ๊ณ ๋ คํ•˜์—ฌ ๋™์‹œ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์›๋ž˜ ๊ฒŒ์‹œ๋ฌผ์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ).

2011 ๋…„์— C #์˜ async ๊ธฐ๋Šฅ์ด ์•„์ง ํ…Œ์ŠคํŠธ ์ค‘์ด์—ˆ์„ ๋•Œ ์ €๋Š” await ๊ฐ€ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž์ธ์ง€ ๋ฌผ์—ˆ๊ณ  C # Language PM์œผ๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. Rust๊ฐ€ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ๊ทธ ์‘๋‹ต์„ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š” ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ 'await'๊ฐ€ ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž ๋Œ€์‹  ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž์ž…๋‹ˆ๊นŒ? :

๋‹น์‹ ์ด ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, await ํ‘œํ˜„์‹์˜ ๊ตฌ๋ฌธ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ๊ฑฐ๊ธฐ์— ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „์— ํฐ ํ† ๋ก ์˜ ํฌ์ธํŠธ์˜€์Šต๋‹ˆ๋‹ค :-). ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ๋งŽ์ด ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ (HP caluclators ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด Forth ์ฐธ์กฐ)์— ๋Œ€ํ•ด ์›์น™์ ์œผ๋กœ๋Š” ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์‹ค์ œ๋กœ๋Š” ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ์ˆ˜ํ•™ ํ‘œ๊ธฐ๋ฒ•์ด ์šฐ๋ฆฌ๋ฅผ ์–ด๋ฆด ๋•Œ ์„ธ๋‡Œํ•˜๋Š” ๋ฐฉ์‹ ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ...

์šฐ๋ฆฌ๋Š” ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž (๋ง ๊ทธ๋Œ€๋กœ ๋ช…๋ นํ˜•- "do this!")๊ฐ€ ๊ฐ€์žฅ ์ง๊ด€์ ์ด๋ผ๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋‹จํ•ญ ์—ฐ์‚ฐ์ž๋Š” ์ด๋ฏธ ์ ‘๋‘์‚ฌ์ด๋ฉฐ await๊ฐ€ ๊ทธ์— ๋งž๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ, ๋ณต์žกํ•œ ํ‘œํ˜„์‹์—์„œ ๋น ์ ธ ๋‚˜๊ฐ€์ง€ ๋งŒ, ์˜ˆ๋ฅผ ๋“ค์–ด ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ํ‰๊ฐ€ ์ˆœ์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋จผ์ € ์ธ์ˆ˜ (์˜ค๋ฅธ์ชฝ์— ์žˆ์Œ)๋ฅผ ํ‰๊ฐ€ ํ•œ ๋‹ค์Œ ํ•จ์ˆ˜ (์™ผ์ชฝ์— ์žˆ์Œ)๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, C #์˜ ํ•จ์ˆ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ๋ฌธ์—๋Š” ์ด๋ฏธ ๊ด„ํ˜ธ๊ฐ€ ๋‚ด์žฅ๋˜์–ด์žˆ๋Š” ๋ฐ˜๋ฉด await์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ await์— ๋Œ€ํ•ด ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ๋ณด๊ณ  ์ฑ„ํƒํ•œ ๊ฒƒ์€ ๋งŽ์€ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์„ ํ˜ธํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค

var bResult = await A().BAsync();
var dResult = await bResult.C().DAsync();
dResult.E()

๋˜๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ๋ณดํ†ต ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ‘œํ˜„์„ ์ œ์™ธํ•˜๊ณ ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ await๋ฅผ ํ”ผํ•˜๊ณ  (์ฆ‰, ๋ชจ๋‘ ๋™์ผํ•œ ํ•จ์ˆ˜ ๋‚˜ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ์ธ์ˆ˜์ž…๋‹ˆ๋‹ค. ์•„๋งˆ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค) await ํ‘œํ˜„์„ ๊ด„ํ˜ธ๋กœ ๋ฌถ์ง€ ์•Š๊ณ  ๋‘ ์ž‘์—… ๋ชจ๋‘์— ์ถ”๊ฐ€ ๋กœ์ปฌ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. .

๋ง์ด ๋˜๋‚˜?

Mads Torgersen, C # ์–ธ์–ด PM


C # ๊ฐœ๋ฐœ์ž๋กœ์„œ์˜ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์€ ๊ตฌ๋ฌธ์ด ์—ฌ๋Ÿฌ ๋ฌธ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ํ•˜๊ณ  ์ด๋กœ ์ธํ•ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ๋™๊ธฐ ์ฝ”๋“œ๋ณด๋‹ค ์ฝ๊ณ  ์“ฐ๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด์ƒ‰ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋ณด์ง€ ์•Š๋Š”๋‹ค. ํ•ญ์ƒ ๋ช…์‹œ์ ์ด๊ณ  ์•”์‹œ์ ์ธ ํƒ€ํ˜‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋ช…์‹œ ์ ์ž…๋‹ˆ๋‹ค. ์ฃผ์ œ btw์— ๋Œ€ํ•œ ์ข‹์€ ๊ธฐ์‚ฌ๋ฅผ ๋งํฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ค๋ฅ˜๋ฅผํ•ด์•ผํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•œ๋‹ค. ์ถ”๋ก  ํ•  ์ˆ˜์—†๋Š” ์—„์ฒญ๋‚œ ์œ ํ˜•์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ Vec์˜ ์˜ˆ๋Š”์ด ์Šค๋ ˆ๋“œ์˜ ๊ตฌ๋ฌธ์œผ๋กœ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™œ ๊ทธ๊ฒƒ์ด ์˜ค๋ฅ˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? Vec<impl future> ) ๊ฐ–๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•จ๊ป˜ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ์—†์ด ์ถ”๊ฐ€ ์ œํ•œ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” Vec์ด์ข‹์ง€ ์•Š์€ ์˜ˆ์ด๊ฑฐ๋‚˜ ์ œ์•ˆ ๋œ ๋ชจ๋“  ๊ตฌ๋ฌธ์„ ๋™์ผํ•œ ํ‘œ์ค€์œผ๋กœ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์‚ฌ๊ฑด์„ ์กฐ์‚ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. "์•„, ์•Œ๋‹ค์‹œํ”ผ, ์•„๋ฌด๋„์ด ๊ธ€์„ ์“ฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—"์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ๋””์ž์ธ์€ ์ฃผ๋กœ ์—ฃ์ง€ ์ผ€์ด์Šค์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@chescock ๋™์˜ํ•˜์ง€๋งŒ ์ „์— ๋งํ–ˆ๋“ฏ์ด Rust๋Š” C #๊ณผ ๋งค์šฐ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. C #์—์„œ๋Š” ์ ˆ๋Œ€๋กœ (await FooAsync()).Bar() ๋ฅผ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Rust์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ? ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. C #์—์„œ๋Š” ๋น„๋™๊ธฐ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ „ํŒŒ๋˜๋Š” ์•”์‹œ ์  ์˜ˆ์™ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust์—์„œ๋Š” ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ๋ช…์‹œ ์ ์œผ๋กœ ํ•จ์ˆ˜ ๊ฒฐ๊ณผ์— ? ๋ฅผ ์จ์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์‚ฌ์šฉ์ž์—๊ฒŒ

let foo = await bar();
let bar = await foo?.baz();
let bar = bar?;

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ด์ƒํ•ฉ๋‹ˆ๋‹ค

let foo = await? bar();
let bar = await? foo.baz();

ํ›จ์”ฌ ๋” ์ข‹์•„ ๋ณด์ด์ง€๋งŒ await ๋ฐ ? doint (await expr)? ์ƒˆ๋กœ์šด ์กฐํ•ฉ์„ ๋„์ž…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด await?&@# ํ•˜๊ณ  ๋ชจ๋“  ์กฐํ•ฉ์ด ๋ชจ๋‘ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„ ๋ณต์žกํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” await๋ฅผ ์ ‘๋ฏธ์‚ฌ๋กœ ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ˜„์žฌ ์–ธ์–ด์— ๋งž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

let foo = bar() await?;
let bar = foo.baz() await?;

์ด์ œ await? ๋Š” ๋‘ ๊ฐœ์˜ ๋ถ„๋ฆฌ ๋œ ํ† ํฐ์ด์ง€๋งŒ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. await?&@# ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด์— ํ•ดํ‚นํ•˜์ง€ ์•Š์•„๋„๋ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ ‘๋‘์‚ฌ ๋ฐฉ์‹๋ณด๋‹ค ์•ฝ๊ฐ„ ์ด์ƒํ•ด ๋ณด์ด์ง€๋งŒ Rust / C # ์ฐจ์ด์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ฆฌ ๋œ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์งˆ ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ๋ช…์‹œ ์  ๋Œ€๊ธฐ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•œ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด C # ๊ฒฝํ—˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋งน๋ชฉ์ ์œผ๋กœ ๊ฐ™์€ ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๊ณ  Rust / C # ์ฐจ์ด์ ์„ ๋ฌด์‹œํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์˜ค๋žซ๋™์•ˆ ์ ‘๋‘์‚ฌ await ์˜ ์ง€์ง€์ž ์˜€๊ณ  C # ์–ธ์–ด ๊ฐœ๋ฐœ์ž๋ฅผ ์ฃผ์ œ์— ์ดˆ๋Œ€ํ•˜๊ธฐ๋„ํ–ˆ์ง€๋งŒ (๊ทธ๋ž˜์„œ 2011 ๋…„ ์ดํ›„์˜ ์ •๋ณด๋ณด๋‹ค ๋” ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„), ์ด์ œ๋Š” await ์ ‘๋‘์‚ฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ผ๊ฐ„์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ฉด ๋‚˜์ค‘์— ๋‹ค์‹œ ์ž‘์—… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐํ•ฉ์œผ๋กœ ๋‘ ์„ธ๊ณ„์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ ‘๋‘์‚ฌ async ํ‚ค์›Œ๋“œ
  • ์ผ๋ฐ˜์ ์ธ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๊ธฐ๋Šฅ

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์—†์ด .await!() ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋‹น์žฅ ์ ‘๋ฏธ์‚ฌ .await!() ๋งคํฌ๋กœ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await ํ‚ค์›Œ๋“œ์˜ ์ ‘๋‘์‚ฌ ๋ณ€ํ˜•์ด ์•ˆ์ •ํ™”๋˜๋ฉด ๋” ์ด์ƒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ .await!() ๋งคํฌ๋กœ๋Š” ์ธ์ˆ˜ (ํ‘œํ˜„์‹)๋ฅผ ์ ‘๋‘์‚ฌ๋กœํ•˜๋Š” ๋งคํฌ๋กœ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. await ํ‚ค์›Œ๋“œ๋กœ ๋ชจ๋“  ๊ฒƒ์„ ๊ด„ํ˜ธ๋กœ ๋ฌถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ์  :

  • ์ ‘๋‘์‚ฌ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ํ•ด๋‹น ๊ตฌ๋ฌธ์— ์ต์ˆ™ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ ‘๋‘์‚ฌ async ํ‚ค์›Œ๋“œ๋Š” ํ‘œํ˜„์‹์˜ ๋น„๋™๊ธฐ ํŠน์„ฑ์„ "๋ˆˆ์— ๋„๊ฒŒ"๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐ ์ƒํ™ฉ์ด๋‚˜ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์ด ์–ด์ƒ‰ํ•œ ๋‹ค๋ฅธ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜• .await!() ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • postfix ๋ณ€ํ˜•์— ๋Œ€ํ•œ (์ž ์žฌ์ ์œผ๋กœ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ) ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด postfix ํ•„๋“œ, ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋งคํฌ๋กœ ์˜ต์…˜์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ๋จ).
  • Postfix ๋งคํฌ๋กœ๋Š” ์œ ์‚ฌํ•œ ์ด์œ ๋กœ postfix ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์ด ๊ณต๋™์œผ๋กœ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์ƒํ™ฉ (์˜ˆ .or_else!(continue) )์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•ž์˜ ํ‘œํ˜„์‹์„ ์–ด์ƒ‰ํ•˜๊ณ  ์ฝ์„ ์ˆ˜์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ž˜ํ•‘ํ•ด์•ผ ํ•จ).
  • ์ ‘๋‘์‚ฌ await ํ‚ค์›Œ๋“œ๋Š” ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๊ตฌํ˜„์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š”์—†์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์•ˆ์ •ํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ƒํƒœ๊ณ„๊ฐ€ ๊ฐœ๋ฐœ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ). ๊ทธ๋Ÿฌ๋‚˜ ์ค‘์žฅ๊ธฐ ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋‹ค๋ฆด ์ˆ˜์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@nicoburns , @ H2CO3 ,

await!() ๋ฐ .or_else!(continue) ์™€ ๊ฐ™์€ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž๋ฅผ ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค . ์‚ฌ์šฉ์ž ๊ด€์  ์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์˜๋ฏธ์žˆ๋Š” ์ด์œ ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋‘ ํ˜•ํƒœ ๋ชจ๋‘ ์‚ฌ์šฉ์ž๋Š” ๋˜‘๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๋‘˜ ๋‹ค ๋ฐฐ์›Œ์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„๋œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ์™œ ์ •ํ™•ํžˆ ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„

. ์ด์ „์— await . ๋ฅผ ์ถ”๊ฐ€ ํ•  ๋•Œ์™€ ๋˜‘๊ฐ™์€ ๋Œ€๋‹ต์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งคํฌ๋กœ๋Š” ์ผ๋ฅ˜ ์ œ์–ด ํ๋ฆ„์„ ๋ชจ๋ฐฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅด๊ณ  ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋‹ค๋ฅด๋ฉฐ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ๋‹ค๋ฅด๋ฉฐ ์ž‘๋™ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋ฉฐ ์™„์ „ํžˆ ๋‹ค๋ฅด๊ฒŒ ์ธ์‹๋ฉ๋‹ˆ๋‹ค.

.await!() ๋ฐ .or_else!(continue) ๊ธฐ๋Šฅ์—๋Š” await ํ‚ค์›Œ๋“œ ๋ฐ none -coalescing ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์€ ์•„๋ฆ„๋‹ค์šด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ์ ์ ˆํ•˜๊ณ  ์ธ์ฒด ๊ณตํ•™์ ์ธ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์ด๊ณ  ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ถ”์•…ํ•œ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๋Œ€์‹ ์— ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. format!() ์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— include_bytes!() ์™€ ๊ฐ™์ด ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋„์—†๊ณ , ์‚ฌ์šฉ์ž ์ง€์ • DSL๋„์—†๊ณ , ์‚ฌ์šฉ์ž ์ฝ”๋“œ์—์„œ ์ค‘๋ณต์„ ์ œ๊ฑฐ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. vararg์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ์ด ํ•„์š” ์—†์œผ๋ฉฐ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž๋ฅผ ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์˜๋ฏธ์žˆ๋Š” ์ด์œ ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

try!() ๋Š” ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์™„๋ฒฝํ•œ ์ด์œ ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

await ๋งคํฌ๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ด๋ฏธ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ธฐ๋Šฅ์ด ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ƒˆ ์–ธ์–ด ์š”์†Œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

format!() ์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค

๋‚˜๋Š” ๋‹ค๋ฅธ ์ ์„ ๊ฐ„์ฒญํ•œ๋‹ค. format!() ๋Š” ๋ณต์žกํ•จ์ด ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒ€์‚ฌ์— ๊ด€ํ•œ ๊ฒƒ์ด๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค๋ฉด ํ•จ์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿด ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

๋‘ ๊ธฐ๋Šฅ ๋ชจ๋‘ ์•„๋ฆ„๋‹ค์šด ๊ตฌ๋ฌธ์„ ๊ฐ–์ถ˜ ์ ์ ˆํ•˜๊ณ  ์ธ์ฒด ๊ณตํ•™์ ์ธ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ๋‹จ์ผ ํ•จ์ˆ˜ ํ˜ธ์ถœ, ํ๋ฆ„ ์ œ์–ด ํ‘œํ˜„์‹ ๋˜๋Š” ์‚ฌ์†Œํ•œ ํŽธ์˜ ๊ธฐ๋Šฅ์— ๊ณ ์œ  ํ•œ ๋งค์šฐ ํŠน๋ณ„ํ•œ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์•„๋ฌด ์ด์œ ์—†์ด ๊ตฌ๋ฌธ์ด ๊ฐ€๋“ํ•œ ๋ถ€ํ’€์–ด ์˜ค๋ฅธ ์–ธ์–ด๊ฐ€ ๋‚˜์˜ค๊ณ  "์•„๋ฆ„๋‹ค์šด"๊ณผ๋Š” ์ •๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

(๋‚˜๋Š” ๋‚ด๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์„ ๋งํ–ˆ๊ณ , ๋‚˜๋Š” ๋” ์ด์ƒ ์งˆ๋ฌธ์˜์ด ์ธก๋ฉด์— ๋‹ตํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

๋ฟก ๋นต๋€จ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐํ•ฉ์œผ๋กœ ๋‘ ์„ธ๊ณ„์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

  • ์ ‘๋‘์‚ฌ await ํ‚ค์›Œ๋“œ
  • ์ผ๋ฐ˜์ ์ธ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๊ธฐ๋Šฅ

์ด๊ฒƒ์€ await ํ˜„์žฌ์˜ ์‹ค์ œ ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹Œ ๋ฌธ๋งฅ ํ‚ค์›Œ๋“œ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์—†์ด .await!() ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” foo await ๋˜๋Š” foo.await (ํŠนํžˆ ํ›„์ž)๋ณด๋‹ค ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ ๋” ๋ณต์žกํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ์ „ํžˆ "๋งˆ๋ฒ•"์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ํšŒ๊ณ„ ์ฑ…์ •์„ ํ•˜์…จ์Šต๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ์  :

  • ์ ‘๋‘์‚ฌ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ํ•ด๋‹น ๊ตฌ๋ฌธ์— ์ต์ˆ™ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— .await!() ๋ฅผ ์ถ”๊ฐ€ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ( await foo ๋ฐ foo.await!() ) ์ด์ œ ์‚ฌ์šฉ์ž๋Š” "์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ ์–ธ์ œ..". ์ด๋Š” ๋‹จ์ผ ์†”๋ฃจ์…˜์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ foo await ๋˜๋Š” foo.await ๋ณด๋‹ค ๋ณต์žก์„ฑ ์˜ˆ์‚ฐ์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Postfix ๋งคํฌ๋กœ๋Š” ์œ ์‚ฌํ•œ ์ด์œ ๋กœ postfix ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์ด ๊ณต๋™์œผ๋กœ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์ƒํ™ฉ (์˜ˆ .or_else!(continue) )์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•ž์˜ ํ‘œํ˜„์‹์ด ์–ด์ƒ‰ํ•˜๊ณ  ์ฝ์„ ์ˆ˜์—†๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ž˜ํ•‘๋˜์–ด์•ผ ํ•จ).

์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋Š” ๊ฐ€์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ ์–ธ์–ด์— ์ถ”๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด await ing์— ์‚ฌ์šฉ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด .or_else!(continue) ๋ฐ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ์œ ์šฉํ•œ ๋‹ค๋ฅธ ๋งŽ์€ ๊ณณ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ ‘๋‘์‚ฌ await ํ‚ค์›Œ๋“œ๋Š” ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๊ตฌํ˜„์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š”์—†์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์•ˆ์ •ํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ƒํƒœ๊ณ„๊ฐ€ ๊ฐœ๋ฐœ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ). ๊ทธ๋Ÿฌ๋‚˜ ์ค‘์žฅ๊ธฐ ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๊ธฐ๋‹ค๋ฆด ์ˆ˜์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” "๊ฐœ๋ฐฉ ๋œ ๊ฐ€๋Šฅ์„ฑ์„ ๋‚จ๊ฒจ๋‘๊ธฐ"์— ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ๋ณธ๋‹ค. ๊ตฌ์„ฑ, IDE ๊ฒฝํ—˜ ๋“ฑ์— ๋Œ€ํ•œ ์ ‘๋ฏธ์‚ฌ์˜ ๊ฐ€์น˜๋Š” ์˜ค๋Š˜๋‚  ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” "์˜ค๋Š˜ await foo ์•ˆ์ •ํ™”์— ๊ด€์‹ฌ์ด ์—†์œผ๋ฉฐ ๋‚ด์ผ foo.await!() ์— ํ•ฉ์˜์— ๋„๋‹ฌ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค ."


ํ—‰

try!() ๋Š” ๋งคํฌ๋กœ๋กœ ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์™„๋ฒฝํ•œ ์ด์œ ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

try!(..) ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŠนํžˆ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์–ด์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ์ผ์ด try!(..) ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ง€์›์—†์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค .

๊ทธ๊ฑด ๊ทธ๋ ‡๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (๊ทธ๋Ÿด ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

await ๋Š” "every single .."์ด ์•„๋‹™๋‹ˆ๋‹ค. ํŠนํžˆ ์‚ฌ์†Œํ•œ ํŽธ์˜ ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์ถ”๊ฐ€๋˜๋Š” ์ฃผ์š” ์–ธ์–ด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

ํ—‰

๊ฒŒ๋‹ค๊ฐ€ ๋ฌธ๋ฒ•์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ตœ๊ทผ ๋…ผ์˜์™€ ๋„๊ตฌ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด IDE / ํŽธ์ง‘๊ธฐ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

foo.await ๊ตฌ๋ฌธ์€ Rust๋ฅผ ์ž˜ ์ง€์›ํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋ผ๋ฉด ์ด๋ฏธ .ident ํ˜•์‹์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํˆด๋ง ๋ฌธ์ œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŽธ์ง‘์ž๋Š” ํ‚ค์›Œ๋“œ ๋ชฉ๋ก์— await ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ข‹์€ IDE์—๋Š” ์ด๋ฏธ . ๊ธฐ๋ฐ˜์˜ ์ฝ”๋“œ ์™„์„ฑ ๊ธฐ๋Šฅ์ด ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ . ์ž…๋ ฅ ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ์ œ์•ˆ์œผ๋กœ await ๋ฅผ ์ œ๊ณตํ•˜๋„๋ก RLS (๋˜๋Š” ๋™๋“ฑํ•œ ํ•ญ๋ชฉ ...)๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค . my_future ์ดํ›„

๋ฌธ๋ฒ•์„ ๋ณต์žก์œผ๋กœ์„œ, .await ์‹ค์ œ๋กœ ๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ์ง€์ง€ ์ฃผ์–ด์ง„ ๋ฌธ๋ฒ• ๋ณต์žกํ•˜๋‹ค .await ๋ณธ์งˆ์ ์œผ๋กœ ํ•ด์„๋˜๋Š” ๊ตฌ๋ฌธ .$ident ์— erroringํ•˜์ง€ ๋‹ค์Œ๊ณผ ident == keywords::Await.name() .

foo.await ๊ตฌ๋ฌธ์€ Rust๋ฅผ ์ž˜ ์ง€์›ํ•˜๋Š” ํŽธ์ง‘๊ธฐ๋ผ๋ฉด ์ด๋ฏธ .ident ํ˜•์‹์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํˆด๋ง ๋ฌธ์ œ๋ฅผ ์ค„์ด๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŽธ์ง‘์ž๋Š” ํ‚ค์›Œ๋“œ ๋ชฉ๋ก์— await๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ข‹์€ IDE์—๋Š” ์ด๋ฏธ. -๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€์„ ์ž…๋ ฅ ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ์ œ์•ˆ์œผ๋กœ await๋ฅผ ์ œ๊ณตํ•˜๋„๋ก RLS (๋˜๋Š” ์ด์™€ ๋™๋“ฑํ•œ ๊ฒƒ ...)๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด ๋” ๊ฐ„๋‹จ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. my_future ์ดํ›„.

๋ฌธ๋ฒ• ํ† ๋ก ๊ณผ ์ƒ์ถฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๋Š” ๋‹จ์ง€ ์ง€๊ธˆ์ด ์•„๋‹ˆ๋ผ 5 ๋…„, 10 ๋…„, 20 ๋…„ ํ›„, ๋ช‡ ๋ฒˆ์˜ ์—๋””์…˜์„ ๊ฑฐ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•Œ์•„ ์ฐจ๋ฆฌ ์…จ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ, ํ‚ค์›Œ๋“œ๊ฐ€ ๊ฐ•์กฐ ํ‘œ์‹œ ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋˜๋ฉด ๋Œ€๊ธฐ ํฌ์ธํŠธ๊ฐ€ ๋ˆˆ์— ๋„์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ .await๋Š” ๊ตฌ๋ฌธ์—์„œ .await๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ๋ณธ์งˆ์ ์œผ๋กœ. $ ident๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ident == ํ‚ค์›Œ๋“œ :: Await.name ()์— ์˜ค๋ฅ˜๊ฐ€ ์—†๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์‹ค์ œ๋กœ ๋ฌธ๋ฒ•์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ์ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋ฏธ ๋ฌธ๋ฒ•์— ์˜ํ•ด ์™„์ „ํžˆ ์ง€์›๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์˜ˆ๊ฐ€ await!(future) ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@Centril try! ๋Š” ? ์—ฐ์‚ฐ์ž๊ฐ€ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์ค‘๋ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "์–ธ์–ด์— ๋ถ€์ ํ•ฉ"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €์—๊ฒŒ ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ Rust๊ฐ€ ๋ฐœ๋ช… ํ•œ ์ตœ๊ณ ์˜ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ํŒ๋งค ํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์—†์ด ๊ตฌํ˜„๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ œ์–ด ํ๋ฆ„์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋…ผ์˜ ํ•  ๋•Œ ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ƒ๊ด€์—†์ด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

await๋Š” "every single .."์ด ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์— ์–ธ๊ธ‰ ๋œ ๋‹ค๋ฅธ ๊ฒƒ (์˜ˆ : or_else )์€ ์–ด์จŒ๋“  ๋‚ด ์š”์ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ฃผ์š” ๊ธฐ๋Šฅ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ด์ ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์— ์ด๋ฏธ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด์žˆ์„ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํ‘œ๊ธฐ๋ฒ•์„ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ์„ ํ˜ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. (๋งคํฌ๋กœ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ฃผ์žฅ์€ "๊ทธ๋“ค์€ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค"๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์ฒด ์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์˜ ์ด์ ์ด ๋น„์šฉ์„ ์ •๋‹นํ™” ํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค‘์ฒฉ ํ•จ์ˆ˜ ํ˜ธ์ถœ์—์„œ ์‚ด์•„ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์ค‘์ฒฉ ๋งคํฌ๋กœ๋ฅผ ์ž‘์„ฑํ•œ ํ›„์—๋„ ๋˜‘๊ฐ™์ด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.)

Wed, Jan 23, 2019 at 09:59:36 PM +0000, Mazdak Farrokhzad write :

  • Postfix ๋งคํฌ๋กœ๋Š” ์œ ์‚ฌํ•œ ์ด์œ ๋กœ postfix ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์ƒํ™ฉ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ .or_else!(continue) ).

์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋Š” ๊ฐ€์น˜๊ฐ€ ์žˆ์œผ๋ฉฐ ์–ธ์–ด์— ์ถ”๊ฐ€๋˜์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด await ing์— ์‚ฌ์šฉ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด .or_else!(continue) ๋ฐ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ์œ ์šฉํ•œ ๋‹ค๋ฅธ ๋งŽ์€ ๊ณณ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

.await!() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—
์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Œ์ด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

.await ๋Š” ํ•„๋“œ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  .await() ๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
ํ•„๋“œ ์•ก์„ธ์Šค ๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ชจ๋‘ ์ œ์–ด์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
ํ๋ฆ„. .await!() ๋Š” ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ๋งคํฌ๋กœ ๊ฐ€ ์ œ์–ด์— ์˜ํ–ฅ์„ ์ค„
ํ๋ฆ„.

@joshtriplett ๋‚˜๋Š” ํ‘œ์ค€ ์˜๋ฏธ์—์„œ ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฐจ์ž… ๊ฒ€์‚ฌ๊ธฐ๊ฐ€ ์ •์˜ ๋œ๋Œ€๋กœ ๋ฏธ๋ž˜์—์„œ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•˜๊ธฐ์œ„ํ•œ ๊ธฐ๋ณธ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค (ํ•€์€ ๋ฐฉ๋ฒ•์„ ์ถ”๋ก 

๋ฌธ๋ฒ• ํ† ๋ก ๊ณผ ์ƒ์ถฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๋Š” ๋‹จ์ง€ ์ง€๊ธˆ์ด ์•„๋‹ˆ๋ผ 5 ๋…„, 10 ๋…„, 20 ๋…„ ํ›„, ๋ช‡ ๋ฒˆ์˜ ์—๋””์…˜์„ ๊ฑฐ์ณ์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๋ฏธ ๋ฌธ๋ฒ•์— ์˜ํ•ด ์™„์ „ํžˆ ์ง€์›๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์˜ˆ๊ฐ€ await!(future) ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ดํ•ด ํ•ฉ๋‹ˆ๋‹ค๋งŒ,์ด ์‹œ์ ์—์„œ์ด ๊ตฌ๋ฌธ์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋‹ค๋ฅธ ๋งŽ์€ ๋‹จ์ ์œผ๋กœ ์ธํ•ด ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฐ์ œ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@Centril try! ์€ ? ์—ฐ์‚ฐ์ž๊ฐ€ ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์ค‘๋ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค. "์–ธ์–ด์— ๋ถ€์ ํ•ฉ"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ _ ์ข‹์•„ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Rust 2018์—์„œ try!(expr) ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ช…์‹œ ์ ์œผ๋กœ ํ๊ธฐ๋˜์—ˆ์œผ๋ฉฐ ๋” ๋‚˜์•„๊ฐ€ ์–ด๋ ค์šด ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง‘ํ•ฉ ์ ์œผ๋กœ ๊ทธ๋ ‡๊ฒŒํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ๋”ฐ๋ผ์„œ ๋ถ€์ ํ•ฉํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

.await!() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

.await ๋Š” ํ•„๋“œ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  .await() ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ํ•„๋“œ ์•ก์„ธ์Šค ๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ชจ๋‘ ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ตฌ๋ณ„ ํŠนํžˆ, ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ .await ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๋ฉ๋‹ˆ๋‹ค ? (๊ธฐ๋Šฅ ๋กœ์ปฌ ์ œ์–ด ํ๋ฆ„์ด๋‹ค). ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๊ด€ํ•ด์„œ๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ฐ˜๋ณต๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ์–ด ํ๋ฆ„์˜ ํ•œ ํ˜•ํƒœ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”์šฑ์ด, ๋งคํฌ๋กœ ๊ฐ€ ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋งŽ์€ ๋งคํฌ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์˜ˆ : dbg! , format! , ...). .await!() ๋˜๋Š” .await ๊ฐ€ ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ด๋ผ๋Š” ์ดํ•ด ( @HeroicKatora ์˜ ๋ฉ”๋ชจ์— ๋”ฐ๋ผ ? ๋ณด๋‹ค ํ›จ์”ฌ ์•ฝํ•œ ์˜๋ฏธ์—์„œ)๋Š” await ๋ผ๋Š” ๋‹จ์–ด์—์„œ ์œ ๋ž˜ํ•ฉ๋‹ˆ๋‹ค.

์„ผํŠธ๋ฆด

์ด๊ฒƒ์€ ํ˜„์žฌ์˜ ์‹ค์ œ ํ‚ค์›Œ๋“œ๊ฐ€ ์•„๋‹Œ ๋ฌธ๋งฅ ํ‚ค์›Œ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Eek. ์•ฝ๊ฐ„ ๊ณ ํ†ต ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋งคํฌ๋กœ๋Š” .wait!() ๋˜๋Š” .awaited!() ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํ›„์ž๋Š” ์•ž์˜ ํ‘œํ˜„์‹์— ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฝค ์ข‹์Šต๋‹ˆ๋‹ค).

"๊ทธ๋ ‡๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์—†์ด .await! () ์ ‘๋ฏธ์‚ฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."
์ด๊ฒƒ์€ foo await ๋˜๋Š” foo.await (ํŠนํžˆ ํ›„์ž)๋ณด๋‹ค ๊ตฌํ˜„ ์ธก๋ฉด์—์„œ ๋” ๋ณต์žกํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ์ „ํžˆ "๋งˆ๋ฒ•"์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ํšŒ๊ณ„ ์ฑ…์ •์„ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ง€์›์—†์ด try! (..)๊ฐ€ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์ ‘๋‘์‚ฌ await ํ‚ค์›Œ๋“œ์™€ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์—†์ด .await!() (๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ)๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  await ํ‚ค์›Œ๋“œ ์ž์ฒด๋Š” ์—ฌ์ „ํžˆ ์ƒ๋‹นํ•œ ์–‘์˜ ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์„ ์ˆ˜๋ฐ˜ํ•˜์ง€๋งŒ ์ด๋Š” ๋‹จ์ˆœํžˆ ๋งคํฌ๋กœ์˜ ๊ฒฐ๊ณผ์— ์ ์šฉ๋˜๋ฉฐ try!() ์˜ ๊ด€๊ณ„์™€ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. return ํ‚ค์›Œ๋“œ.

๋‚˜์ค‘์— .await! ()๋ฅผ ์ถ”๊ฐ€ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ• ๋ฟ (await foo ๋ฐ foo.await! ()) ์ด์ œ ์‚ฌ์šฉ์ž๋Š” "์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š”์ง€ .."๋ผ๊ณ  ๋ฌป์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ผ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ foo await ๋˜๋Š” foo.await๋ณด๋‹ค ๋ณต์žก์„ฑ ์˜ˆ์‚ฐ์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ถ”๊ฐ€๋˜๋Š” ๋ณต์žก์„ฑ์€ ์ตœ์†Œํ•œ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๊ตฌํ˜„ ๋ณต์žก์„ฑ์€ ๋‹ค๋ฅธ ๋ฌธ์ œ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด์จŒ๋“  ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ...). ๋‘ ํ˜•์‹ ๋ชจ๋‘ ์ง๊ด€์ ์œผ๋กœ ์ฝ์œผ๋ฏ€๋กœ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ฝ์„ ๋•Œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋ถ„๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์„ ํƒํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"Rust์—์„œ Future๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค : await foo.bar(); ๋ฐ foo.bar().await!() .์ด ๋ฐฉ๋ฒ•์€ ์Šคํƒ€์ผ ์„ ํ˜ธ์ด๋ฉฐ ์‹คํ–‰ ํ๋ฆ„์— ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."

๋‚˜๋Š” "๊ฐœ๋ฐฉ ๋œ ๊ฐ€๋Šฅ์„ฑ์„ ๋‚จ๊ฒจ๋‘๊ธฐ"์— ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ๋ณธ๋‹ค. ๊ตฌ์„ฑ, IDE ๊ฒฝํ—˜ ๋“ฑ์— ๋Œ€ํ•œ ์ ‘๋ฏธ์‚ฌ์˜ ๊ฐ€์น˜๋Š” ์˜ค๋Š˜๋‚  ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ์˜ ๊ตฌํ˜„์ด ๋ฏธ๋ž˜์— ๋” ํ†ต์ผ ๋œ ์–ธ์–ด๋ฅผ ๊ฐ€์งˆ ๊ฐ€๋Šฅ์„ฑ์„ ๋ง‰์ง€ ์•Š๋„๋กํ•˜๋Š” ๊ฒƒ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ๋ฌธ์ด ์ž˜ ๊ฐ•์กฐ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ  ๋ถ„๋ช… ํ•  ๋•Œ๋„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ git diff ๋ฐ ๊ธฐํƒ€ ์ด๋Ÿฌํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค.

์ด๋ก ์ ์œผ๋กœ ์˜ˆ, ์‚ฌ์†Œํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ์˜ˆ,ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ
์ •์ง€ ์ง€์ ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ์‹œ ์ค‘๋‹จ ์ง€์ ์—์„œ RefCell์„ ์œ ์ง€ํ•˜๊ณ 
ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์€ RefCell์ด
์ผ์‹œ ์ค‘๋‹จ ์ง€์  ์ „์— ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ํ”„๋กœ๊ทธ๋žจ์—๋Š”
์ด์™€ ๊ฐ™์€ ์ˆ˜๋งŽ์€ ๋ฏธ๋ฌ˜ํ•จ, ํ˜„์žฌ ๊ธฐ๋Šฅ์ด
์ค‘๋‹จ์€ ์ค‘์š”ํ•œ ์ •๋ณด์ž…๋‹ˆ๋‹ค.

2019 ๋…„ 1 ์›” 23 ์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 2:21 HeroicKatora [email protected]
์ผ๋‹ค :

@joshtriplett https://github.com/joshtriplett ๋‚˜๋Š” ์ œ์–ด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
ํ‘œ์ค€์ ์ธ ์˜๋ฏธ์˜ ํ๋ฆ„. ์ด๊ฒƒ์ด ์ •๋‹นํ™”ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.
์ฐจ์ž… ๊ฒ€์‚ฌ๊ธฐ๋Š” ์ •์˜ ๋œ๋Œ€๋กœ ๋ฏธ๋ž˜์—์„œ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ณด๊ธฐ์—์„œ
๋กœ์ปฌ ํ•จ์ˆ˜ ์‹คํ–‰, await ์‹คํ–‰์€ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/57640#issuecomment-456989262 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABGmeqcr2g4olxQhH9Fb9r6g3XRaFUu2ks5vGOBkgaJpZM4aBlba
.

Wed, Jan 23, 2019 at 02:26:07 PM -0800, Mazdak Farrokhzad write :

.await!() ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

.await ๋Š” ํ•„๋“œ ์•ก์„ธ์Šค์ฒ˜๋Ÿผ ๋ณด์ด๊ณ  .await() ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ํ•„๋“œ ์•ก์„ธ์Šค ๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ชจ๋‘ ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ถ„์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜์žˆ๋Š” ๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์™œ ๊ทธ๋ž˜์•ผํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ตฌ๋ณ„์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ .await ๋’ค์—๋Š”? (๊ธฐ๋Šฅ-๋กœ์ปฌ ์ œ์–ด ํ๋ฆ„).

์ข…์ข… ๊ทธ๋ ‡์ง€๋งŒ ํ•ญ์ƒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ๊ตฌ๋ฌธ์€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ํ™•์‹คํžˆ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๊ด€ํ•ด์„œ๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ฐ˜๋ณต๊ธฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ์–ด ํ๋ฆ„์˜ ํ•œ ํ˜•ํƒœ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

return ๋˜๋Š” ? (๋˜๋Š” break )์™€ ๊ฐ™์€ ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ˜ธ์ถœ ํ•œ ํ•จ์ˆ˜์—์„œ ๋‘ ๋‹จ๊ณ„๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ (Rust์— ์˜ˆ์™ธ๊ฐ€์—†๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์ด๊ฒƒ์ด ๋†€๋ž๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค) ํ˜ธ์ถœ์—์„œ ๋ฃจํ”„์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งค์šฐ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜.

๋”์šฑ์ด ๋งคํฌ๋กœ๊ฐ€ ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค๊ณ ํ•ด์„œ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ด๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋งŽ์€ ๋งคํฌ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์˜ˆ : dbg !, format !, ...). ์ดํ•ด .await ๊ทธ! () ๋˜๋Š” .await ๋‹จ์–ด ์ž์ฒด๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ํ๋ฆ„ (?, ๋‹น @HeroicKatora์˜ ๋…ธํŠธ๋ณด๋‹ค ํ›จ์”ฌ ์•ฝํ•œ ์˜๋ฏธ์—์„œ THO) ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ „ํ˜€ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ œ์–ด ํ๋ฆ„์— ์˜ํ–ฅ์„์ฃผ๋Š” ๊ฒƒ์€ ์ •๋ง ์ค‘์š”ํ•œ ๋ถ€์ž‘์šฉ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์„ ํ•  ์ˆ˜์—†๋Š” ๊ตฌ์กฐ์™€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ํ˜•์‹์„ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค. Rust์—์„œ์ด๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๊ตฌ์„ฑ์€ ํ‚ค์›Œ๋“œ ( return , break , continue ), ์—ฐ์‚ฐ์ž ( ? ), ๋งคํฌ๋กœ (ํ•˜๋‚˜๋กœ ํ‰๊ฐ€ํ•˜์—ฌ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜). ์˜ˆ์™ธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌผ์„ ์ง„ํ™์œผ๋กœ ๋งŒ๋“œ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@ejmahler ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ์˜ ๋น„๊ต๋ฅผ ์œ„ํ•ด RefCell์„ ๋ณด์œ ํ•˜๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ๋™์ผํ•œ RefCell์„ ํš๋“ํ•˜๋ ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์ž ์žฌ ์ฝœ ๊ทธ๋ž˜ํ”„๋ฅผ ์ฆ‰์‹œ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๋Š” ์•„๋ฌด๋„์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํƒ ๊ณ ๊ฐˆ ๋ฌธ์ œ๋Š” ์ œ๊ณต๋œ ์Šคํƒ ๊ณต๊ฐ„์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค๋Š” ํŠน๋ณ„ํ•œ ์šฐ๋ ค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋น„๊ต๋Š” ์ฝ” ๋ฃจํ‹ด์— ์œ ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์ธ๋ผ์ธ๋˜์ง€ ์•Š์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋” ์ž˜ ๋ณด์ด๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์ ์  ๋” ์–ด๋ ค์›Œ์ง€๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…์‹œ์ ์ธ ํ…Œ์ผ ํ˜ธ์ถœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

๋Œ€๋‹ต์€ imho์ž…๋‹ˆ๋‹ค. RefCell์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐ€์žฅ ํฐ ์œ„ํ—˜์€ ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ํ•˜๋“œ์›จ์–ด์—์„œ ์ถ”์ƒํ™” ๋  ์ˆ˜์žˆ์„ ๋•Œ, ์ €๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ์„œ ์šฐ๋ฆฌ๊ฐ€ ์กฐ์‚ฌํ•œ ๊ณณ์„ ์ œ์™ธํ•˜๊ณ  ์ˆ˜์œจ ์ง€์ ์—์„œ RefCell ๋“ฑ์„ ๋ถ™ ์žก์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

2019 ๋…„ 1 ์›” 23 ์ผ ์ˆ˜์š”์ผ 10:30:10 PM +0000์— Elliott Mahler๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด๋ก ์ ์œผ๋กœ ์˜ˆ, ์‚ฌ์†Œํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ์˜ˆ,ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ
์ •์ง€ ์ง€์ ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

: +1 :

์•ˆ๋…•ํ•˜์„ธ์š”.

์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ๊ฒ€์‚ฌํ•ด์•ผํ•˜๋Š” ์ฝ”๋“œ์˜ ์–‘,
์„ค๋ช…ํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ด๋ฏธ
๊ทธ๋“ค์ด ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋“ค์ด ํ™•์ธํ•œ RefCell์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์ธ
๋ฐ–. ๊ทธ๋Ÿฌ๋‚˜ await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ผ ํ˜ธ์ถœ ์Šคํƒ์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋Œ€์‹ 
await ๋™์•ˆ ์‹คํ–‰๋˜๋Š” ๋‚ด์šฉ์„ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ง๊ฐ์— ๋”ฐ๋ฅด๋ฉด ํ‰๊ท ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š”
์ด๋Ÿฌํ•œ ๊ฐ€๋Šฅ์„ฑ์˜ ํญ๋ฐœ์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜์žˆ๋Š” ์žฅ๋น„๊ฐ€ ํ›จ์”ฌ ์ ์Šต๋‹ˆ๋‹ค.
ํ›จ์”ฌ ๋œ ์ž์ฃผ ์ฒ˜๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ •์ง€ ์ง€์ ์ด ์ค‘์š”ํ•œ ์ •๋ณด ์ธ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋Š” ๊ฒŒ์ž„์—์„œ
์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ๊ฐœ ๋  ์ฝ” ๋ฃจํ‹ด์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
ํ”„๋ ˆ์ž„ ๋‹น ํ•œ ๋ฒˆ์”ฉ ์ด๋ ฅ์„œ๋งˆ๋‹ค ๊ฒŒ์ž„ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ„๊ณผํ•œ๋‹ค๋ฉด
์ด ์ฝ” ๋ฃจํ‹ด ์ค‘ ํ•˜๋‚˜์—์„œ ์ผ์‹œ ์ค‘์ง€ ์ง€์ ์„ ์œ ์ง€ํ•˜๋ฉด ๊ฒŒ์ž„์„ ์ค‘๋‹จ ๋œ ์ƒํƒœ๋กœ ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์— ๋Œ€ํ•œ ์ƒํƒœ.

์ด ๋ชจ๋“  ๊ฒƒ๋“ค์€โ€œ๋” ๋˜‘๋˜‘ํ•ด์ง€๊ณ 
๋ฌผ๋ก , ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์—ญ์‚ฌ์ ์œผ๋กœ ํšจ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

2019 ๋…„ 1 ์›” 23 ์ผ ์ˆ˜์š”์ผ ์˜คํ›„ 2:44 Josh Triplett [email protected]
์ผ๋‹ค :

2019 ๋…„ 1 ์›” 23 ์ผ ์ˆ˜์š”์ผ 10:30:10 PM +0000์— Elliott Mahler๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ด๋ก ์ ์œผ๋กœ ์˜ˆ, ์‚ฌ์†Œํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ์˜ˆ,ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ
์ •์ง€ ์ง€์ ์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

: +1 :

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/rust-lang/rust/issues/57640#issuecomment-456995913 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABGmep05nhZizdE5xil4FsnpONJCxqn-ks5vGOXhgaJpZM4aBlba
.

์ •์ง€ ์ง€์ ์ด ์ค‘์š”ํ•œ ์ •๋ณด ์ธ ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋ ˆ์ž„ ๋‹น ํ•œ ๋ฒˆ ์žฌ๊ฐœ๋˜๋„๋ก ์˜๋„ ๋œ ์ฝ” ๋ฃจํ‹ด์„ ์ž‘์„ฑํ•˜๊ณ  ๊ฐ ์ด๋ ฅ์„œ์—์„œ ๊ฒŒ์ž„ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ” ๋ฃจํ‹ด ์ค‘ ํ•˜๋‚˜์—์„œ ์ผ์‹œ ์ค‘๋‹จ ์ง€์ ์„ ๊ฐ„๊ณผํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„ ๋™์•ˆ ๊ฒŒ์ž„์ด ์ค‘๋‹จ ๋œ ์ƒํƒœ๋กœ ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SlotMap์— ํ‚ค๋ฅผ ๋†“์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ˆ„์ถœ๋ฉ๋‹ˆ๋‹ค. ์–ธ์–ด ์ž์ฒด๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์ด๊ฒƒ์— ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์€ await๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ชจํ˜ธํ•˜๊ฒŒ ๋ณด์ด์ง€ ์•Š๋Š”์ง€ (ํ‚ค์›Œ๋“œ ์ธ ํ•œ ๊ทธ ๋ฐœ์ƒ์ด ๊ณ ์œ  ํ•œ ๊ฒฝ์šฐ) ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๋กœ ์ผ๋ฐ˜ํ™”๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์–ธ์–ด๊ฐ€ ๋‹น์‹ ์—๊ฒŒ ์ฆ‰์‹œ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํ‰๊ฐ€๋ฅผ ์ค„์ด๊ณ  ๋‹น์‹ ์ด ์ž์‹ ์˜ ํŠน์„ฑ์„ ํ‘œํ˜„ํ•  ์ˆ˜์žˆ๊ฒŒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ํ‰๊ฐ€ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ๋ฅผ ํ‰๊ฐ€ ํ•œ ๋‹ค์Œ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ฒŒ์ž„ ์ƒํƒœ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜ ์ œ์•ˆ ๋ฐ์ด ๋ฌธ์ œ๋ฅผ ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• : ๊ฒŒ์ž„ ์ƒํƒœ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ์–‘์„ ํ‹ฑํ–ˆ๋‹ค๋Š” ๋ฐ˜ํ™˜์‹œ ์ฃผ์žฅํ•˜๋Š” ๋ž˜ํผ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋น„๋™๊ธฐ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์›์ธ์— ๋Œ€ํ•œ ์ž์ฒด ์ƒํƒœ๋ฅผ ๋นŒ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ตฌํšํ™” ๋œ ์ฝ”๋“œ์—์„œ ๋‹ค๋ฅธ ๊ธˆ์ง€๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

RefCell์˜ ์ƒํƒœ ํญ๋ฐœ์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ํ•ด๋‹น ๋ถˆ๋ณ€์— ์˜์กดํ•˜๊ณ  ์กฐ์šฉํžˆ ์ถ”๊ฐ€ํ•˜๋Š” ๋‹ค๋ฅธ ์ฝ”๋“œ ํฌ์ธํŠธ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ, ๋ฌธ์„œํ™”, ์ฃผ์„, ์˜ฌ๋ฐ”๋ฅธ ํฌ์žฅ์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

RefCell ๋ณด์œ ํ•˜๋Š” ๊ฒƒ์€ ์ฐจ๋‹จ io๋ฅผ ์ˆ˜ํ–‰ ํ•  ๋•Œ Mutex ๋ฅผ ๋ณด์œ ํ•˜๋Š” ๊ฒƒ๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํŒจ๋‹‰๋ณด๋‹ค ๋” ๋‚˜์˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๋ช…์‹œ์ ์ธ block ํ‚ค์›Œ๋“œ๋กœ ์ฐจ๋‹จ ์ž‘์—…์— ์ฃผ์„์„ ๋‹ฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :).

๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ„์— RefCell ๊ณต์œ ํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์„ฑ ( !Send )์ด ํฌ๊ฒŒ ์ œํ•œ๋˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  RefCell ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ”ผํ•ด์•ผํ•˜๋ฉฐ ์‚ฌ์šฉ์‹œ ๊ฐ€๋Šฅํ•œ ํ•œ ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ๋นŒ๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ์ˆ˜์ต๋ฅ  ํฌ์ธํŠธ์— ์šฐ์—ฐํžˆ RefCell ์ง‘์–ด ๋„ฃ๋Š” ๊ฒƒ์ด ํฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ฝ” ๋ฃจํ‹ด ์ค‘ ํ•˜๋‚˜์—์„œ ์ผ์‹œ ์ค‘๋‹จ ์ง€์ ์„ ๊ฐ„๊ณผํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„ ๋™์•ˆ ๊ฒŒ์ž„์ด ์ค‘๋‹จ ๋œ ์ƒํƒœ๋กœ ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ” ๋ฃจํ‹ด๊ณผ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. yield ์•”์‹œ ์ ์œผ๋กœ ๋งŒ๋“ค๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ ๋Œ€์‹  ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ : await ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. ์ฆ‰, ๋งคํฌ๋กœ ์—ฌ์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์™€ while ์™€๋Š” ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. while! ๋งคํฌ๋กœ macro_rules! ๋งŒ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํŠน์ˆ˜ ๋Œ€์†Œ ๋ฌธ์ž๋Š” ์•„์˜ˆ ์—†์Œ).

ํŽธ์ง‘ : ์ด๊ฒƒ์€ ์ˆ˜์‚ฌ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” C #๊ณผ ๊ฐ™์€ run-to-first-await๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง„์ •์œผ๋กœ ๊ด€์‹ฌ์ด ์žˆ์ง€๋งŒ RFC๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ ๋Œ€์‹  ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ : await๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. ์ฆ‰, ๋งคํฌ๋กœ ์—ฌ์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ, ์ž ์‹œ๋งŒ ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋Š” while๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”! ๋งคํฌ๋กœ (macro_rules ๋งŒ ์‚ฌ์šฉํ•˜๋”๋ผ๋„!; ํŠน์ˆ˜ ๋Œ€์†Œ ๋ฌธ์ž๋Š” ์ „ํ˜€ ์—†์Œ).

๋‚˜๋Š” ๋Œ€๋ถ€๋ถ„์ด ์ถ”๋ก ์— ๋™์˜ํ•˜๋ฉฐ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์— ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, (https://github.com/rust-lang/rust/issues/57640#issuecomment-456990831) ์œ„์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ, ๋‚˜๋Š” ๋˜ํ•œ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ (์•„๋งˆ๋„์— ๋Œ€ํ•œ ํ›„์œ„ ๋งคํฌ๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  ์ฐฌ์„ฑ ํ•ด์š” .awaited!() ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ์™€ ์ด๋ฆ„ ์ถฉ๋Œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด

  • foo.bar().await ๋ฐ foo.bar().await() ์€ ๊ธฐ์ˆ ์ ์œผ๋กœ ํ‚ค์›Œ๋“œ์ด์ง€๋งŒ ํ•„๋“œ ์•ก์„ธ์Šค ๋˜๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์ด๋Ÿฌํ•œ ์ œ์–ด ํ๋ฆ„ ์ˆ˜์ • ๊ตฌ์กฐ๊ฐ€ ์ด๋ ‡๊ฒŒ ์ˆจ๊ฒจ์ ธ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • foo.bar() await ๋Š” ํŠนํžˆ foo.bar() await.qux() ์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ์—ฐ๊ฒฐ์—์„œ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋Ÿฐ ์ ‘๋ฏธ์‚ฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค (๊ทธ๋“ค์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ด์™€ ๊ฐ™์ด ์ž‘๋™ํ•˜๋Š” ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•ด ์•Œ๊ณ ์žˆ๋Š” ์–ด๋–ค ์–ธ์–ด๋กœ๋„ ๋‹จ์ผ ์˜ˆ์ œ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค). ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” await๋ฅผ๊ฐ€์— ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋กœ๋Š” ๋งค์šฐ ํ˜ผ๋™์„ ์ฝ๊ณ  ์ƒ๊ฐ qux() ํ•˜์ง€ foo.bar() .
  • foo.bar()@await ๋˜๋Š” ๋‹ค๋ฅธ ๊ตฌ๋‘์ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํŠนํžˆ ์ข‹์ง€ ์•Š์œผ๋ฉฐ ๊ฝค ์ž„์‹œ์ ์ธ ๋Š๋‚Œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์œ„์˜ ์˜ต์…˜๊ณผ ๋‹ฌ๋ฆฌ์ด ๊ตฌ๋ฌธ์— ์ค‘์š”ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ธธ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ท ํ˜•์ด ๋งž์ถค ๊ตฌ๋ฌธ์„ ๋ฒ„๋ฆฌ๊ณ  ๋งคํฌ๋กœ๊ฐ€๋˜๋Š”์ชฝ์œผ๋กœ ๊ธฐ์šธ์ด๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์ƒ๊ฐ๊ณผ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ์ˆ˜์ •ํ–ˆ์ง€๋งŒ ์ด์ „ ์•„์ด๋””์–ด๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ฐ˜๋ณต ํ•œ ๋‹ค์Œ ์นจ๋ฌต์„ ์œ ์ง€ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

await ํ‚ค์›Œ๋“œ๋Š” async ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๊ณณ์—์„œ await ์‹๋ณ„์ž๋ฅผ ํ—ˆ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ฒ”์œ„์—์„œ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด await ์ด๋ฉด ์›์‹œ ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•œ async ๋ธ”๋ก ๋‚ด์—์„œ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด await! ๋งคํฌ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ํ‚ค์›Œ๋“œ๋ฅผ ๊ทธ๋ ‡๊ฒŒ ์กฐ์ •ํ•˜๋ฉด ๋‚ด ์š”์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ๊ธฐ์™€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ํ˜ผํ•ฉ ๋ฐ ์ผ์น˜๋ฅผ ํ—ˆ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

    return Ok(item);
}

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

   let item = await? some_op();

   return Ok(item);
}

๋‚˜๋Š” ์ด๊ฒƒ์ด ํŽ‘ํ‚ค ํ•œ ์ผ์„ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์ดˆ ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ์ถฉ๋ถ„ํžˆ ํˆฌ๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์‹ ๊ทœ ๋ฐ ์ค‘๊ธ‰ ์‚ฌ์šฉ์ž๋Š” ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. yield ๋ฌธ์—†์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ 2์™€ 3์€ ์‚ฌ์‹ค์ƒ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ ‘๋‘์‚ฌ await? ๊ฐ€ ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ์— ? ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ›Œ๋ฅญํ•œ ์ถ•์•ฝ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ๊ณต์‹์ ์ธ ๊ฒƒ์ด๋œ๋‹ค๋ฉด (๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ) await!(...) ๋ฐ .await!() ๋‘˜ ๋‹ค ํ•จ๊ป˜ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€ ๋ฐ ์Šคํƒ€์ผ์— ๋Œ€ํ•ด ์„ธ ๊ฐ€์ง€ ๋™๋“ฑํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . ๋‚˜๋Š” ์ด๊ฒƒ์ด์ธ์ง€ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์ง€๋งŒ ๋” ํฐ ์œ ์—ฐ์„ฑ์„ ํ—ˆ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ async fn ๋ฐ #[async] fn* ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ๊ธฐ๋ฅผ ๋น„๋™๊ธฐ ์ƒํƒœ ๋จธ์‹ ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ์œ„ํ•œ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ๊ณต์œ  ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ง„์ •ํ•œ ์„ ํ˜ธํ•˜๋Š” ์Šคํƒ€์ผ์ด ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด ์กŒ์œผ๋ฏ€๋กœ ๋‚ด๊ฐ€ ๋ฐ”๋ผ๋Š” ์ตœ์„ ์˜ ๋ฐฉ๋ฒ•์€ ๊นจ๋—ํ•˜๊ณ  ์œ ์—ฐํ•˜๋ฉฐ ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ ‘๊ทผํ•˜๊ธฐ ์‰ฌ์šด ๋ณต์žก์„ฑ ์ˆ˜์ค€์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ„์˜ ๊ณ„ํš์€ ๋ฏธ๋ž˜๋ฅผ์œ„ํ•œ ์ข‹์€ ํƒ€ํ˜‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค์›Œ๋“œ๋กœ await ์€ ์–ด์จŒ๋“  async ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฏ€๋กœ ์‹๋ณ„์ž๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋Œ€๊ธฐํ•˜๋„๋ก ํ—ˆ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์œ„์ƒ์ ์ธ ๋งคํฌ๋กœ๋ฅผ ๊ณ ๋ คํ•  ๋•Œ ์ด๊ฒƒ์ด Rust์—์„œ ์‹ค์šฉ์ ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. expr ์›ํ•  ๋•Œ foo!(x.await) ๋˜๋Š” foo!(await { x }) ํ˜ธ์ถœํ•˜๋ฉด expr ๊ฐ€ ์•„๋‹Œ await ํ‚ค์›Œ๋“œ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค await ํ•„๋“œ ๋˜๋Š” ํ•„๋“œ init ์†๊ธฐ์˜ await ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ํ‘œํ˜„์‹-๋™๊ธฐ ๋ฉ”์„œ๋“œ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

์„ธ ๊ฐ€์ง€ ๋™๋“ฑํ•œ ๋ฐฉ๋ฒ•์ด ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์ œ๋ฐœ ์•ˆ๋ผ. (์ ์–ด๋„ core . ๋ถ„๋ช…ํžˆ ์‚ฌ๋žŒ๋“ค์€ ์ž์‹ ์˜ ์ฝ”๋“œ๋กœ ๋งคํฌ๋กœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›ํ•œ๋‹ค๋ฉด)

์ง€๊ธˆ์€ ์ ‘๋ฏธ์‚ฌ .await! () ๋งคํฌ๋กœ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ await ํ‚ค์›Œ๋“œ์˜ ์ ‘๋‘์‚ฌ ๋ณ€ํ˜•์ด ์•ˆ์ •ํ™”๋˜๋ฉด ๋” ์ด์ƒ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. postfix .await! () ๋งคํฌ๋กœ๋Š” ์ธ์ˆ˜ (ํ‘œํ˜„์‹) ์•ž์— await ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์ด๊ณ  ๋ž˜ํ•‘ ๋œ ๋งคํฌ๋กœ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด„ํ˜ธ ์•ˆ์˜ ๋ชจ๋“  ๊ฒƒ.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋˜‘๊ฐ™์ด ์‚ฌ์‹ค์ด์ง€๋งŒ ๋” ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์ฃผ๋ชฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค! -๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ : .await ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ์„ ์•ˆ์ •ํ™”ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถฉ๋ถ„ํžˆ ์‹ซ์–ดํ•œ๋‹ค๋ฉด ์ด๋ฏธ awaited!() ์ ‘๋‘์‚ฌ ๋งคํฌ๋กœ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ํ—ˆ์šฉ ๋œ ๋ณ€ํ˜• (์˜ˆ : ์ ‘๋‘์‚ฌ ๋ฐ ์ ‘๋ฏธ์‚ฌ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ์•„์ด๋””์–ด๋Š” ์‹ซ์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌป๋Š” ๊ฒƒ๊ณผ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ด์œ  ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์†Œ ํฐ ํšŒ์‚ฌ์—์„œ ์ผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๋†“๊ณ  ์‹ธ์šฐ๋Š” ๊ฒƒ์€ ์ง„์งœ์ž…๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์„ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ํŒŒ์ด์ฌ์˜ ์„ ์€์ด ์ ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์˜ณ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ํ—ˆ์šฉ ๋œ ๋ณ€ํ˜• (์˜ˆ : ์ ‘๋‘์‚ฌ ๋ฐ ์ ‘๋ฏธ์‚ฌ)์„ ์ถ”๊ฐ€ํ•˜๋Š” ์•„์ด๋””์–ด๋Š” ์‹ซ์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌป๋Š” ๊ฒƒ๊ณผ๋Š” ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ์ด์œ  ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹ค์†Œ ํฐ ํšŒ์‚ฌ์—์„œ ์ผํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๋†“๊ณ  ์‹ธ์šฐ๋Š” ๊ฒƒ์€ ์ง„์งœ์ž…๋‹ˆ๋‹ค. ๋ช…ํ™•ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ํ˜•์‹์„ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ํŒŒ์ด์ฌ์˜ ์„ ์€์ด ์ ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์˜ณ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์Šจ ๋ง์ธ์ง€ ์•Œ์•„์š”. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ await!() ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž์ฒด ๋งคํฌ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. Simular ๊ตฌ์กฐ์ฒด๋Š” ํ•ญ์ƒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ๋Š” ์–ด์จŒ๋“  ๋‹ค๋ฅธ ๋ณ€ํ˜•์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์ ์–ด๋„ await!(...) ์€ (๋Š”) ์˜ค๋ฅ˜๊ฐ€ ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—; ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ macro_rules! wait { ($e:expr) => { e.await }; } ์ •์˜ํ•œ ๋‹ค์Œ wait!(expr) ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…๋ฐฑํ•˜๊ฒŒ ์ผ๊ด€ ์ ์œผ๋กœ ๋ณด์ด๊ณ  ์œ ํ–‰์—์„œ ๋ฒ—์–ด๋‚˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ƒํƒœ๊ณ„์˜ ๋ณ€ํ™” ๊ฐ€๋Šฅ์„ฑ์„ ํฌ๊ฒŒ ์ค„์ด๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํƒ€์ผ์„ ๋œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ @yasammez ์˜ ์š”์ ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@Centril ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜์œ ์ผ์„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ฑฐ์˜ ๋ฉˆ์ถœ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. _await!() ๋˜๋Š” awai!() ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋˜๋Š” ์œ ๋‹ˆ ์ฝ”๋“œ ์‹๋ณ„์ž๊ฐ€ ํ™œ์„ฑํ™” ๋œ ๊ฒฝ์šฐ ร wait!() ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

...

@earthengine ๋ชฉํ‘œ๋Š” ๋‹ค์–‘ํ•œ ์‚ฌ๋žŒ๋“ค์ด ์˜๋„์ ์œผ๋กœ ์ด์ƒํ•œ ์ผ์„ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ (์Šคํƒ€์ผ ๋ฆฐํŠธ์™€ rustfmt ๋กœํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ) ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ทœ๋ฒ” ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” _await!() ๊ฐ€) ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ˆ๋Œ€์ ์ธ ๋ณด์žฅ์ด ์•„๋‹ˆ๋ผ ํ™•๋ฅ ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ธ์ˆ˜๋ฅผ ์š”์•ฝํ•˜๊ณ  ๊ฒ€ํ† ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • __ expr await (์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ) __ : Postfix ํ‚ค์›Œ๋“œ ๊ตฌ๋ฌธ์€ ์ด๋ฏธ ์˜ˆ์•ฝ ํ•œ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Await๋Š” ๋งˆ๋ฒ•์˜ ๋ณ€ํ˜•์ด๋ฉฐ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ ์ ˆํ•˜๊ฒŒ ๋ˆˆ์— ๋„๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ์•ก์„ธ์Šค, ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋งคํฌ๋กœ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์œผ๋ฉฐ ์˜ˆ์™ธ๋กœ ์„ค๋ช… ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌ๋ฌธ ๋ถ„์„ ๊ทœ์น™ ๋ฐ ? ์—ฐ์‚ฐ์ž์™€ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์˜ ๊ณต๊ฐ„์€ ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ๋ฐ›์•„ ๋“ค์—ฌ์งˆ ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” RFC ์ธ Generalized Type Ascription ๋ณด๋‹ค ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ๋‹จ์ ์€ IDE๊ฐ€ await ๋Œ€ํ•œ ์ž๋™ ์™„์„ฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋งˆ์ˆ ์„ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๋ฉ”์†Œ๋“œ ์ฒด์ธ์˜ ๊ณต๊ฐ„์ด ๋„ˆ๋ฌด ๊ท€์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( ์žˆ๋‹ค๊ณ  ์ฃผ์žฅ ํ–ˆ์ง€๋งŒ), ํŠนํžˆ await ๊ฐ€ ๊ฐ ์ค„์„ ๋๋‚ด๋„๋ก ํ˜•์‹์ด ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํŠนํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•˜๋ฉด ์‚ฌ์šฉ์„ ํ”ผํ•  ์ˆ˜์žˆ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • __ expr.await (์ ‘๋ฏธ์‚ฌ ํ•„๋“œ) __ : ์ ‘๋ฏธ์‚ฌ ํ•„๋“œ ๊ตฌ๋ฌธ์€ "์ ์˜ ํž˜"์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ด๊ณ  IDE๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ await ๋ฅผ ์ž๋™ ์™„์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ์  ์„

  • __ expr.await() (์ ‘๋ฏธ์‚ฌ ๋ฐฉ๋ฒ•) __ : ์ ‘๋ฏธ์‚ฌ ๋ฐฉ๋ฒ• ๊ตฌ๋ฌธ์€ ์ ‘๋ฏธ์‚ฌ ํ•„๋“œ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์žฅ์ ์€ () ํ˜ธ์ถœ ๊ตฌ๋ฌธ์ด ๋…์ž์—๊ฒŒ "์ด๊ฒƒ์€ ๋ฌด์–ธ๊ฐ€๋ฅผํ•ฉ๋‹ˆ๋‹ค."๋ผ๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋กœ์ปฌ์—์„œ ๋ณด๋ฉด ๋ธ”๋กœํ‚น ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฑฐ์˜ ์˜๋ฏธ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ ์€ ์กฐ๊ธˆ ๋” ๊ธธ๊ณ  ์‹œ๋„๋Ÿฝ๊ณ  await ์˜ ๋งˆ๋ฒ• ํ–‰๋™์„ ๋ฉ”์„œ๋“œ๋กœ ์œ„์žฅํ•˜๋ฉด ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. await ๋Š” Scheme์˜ call/cc ๊ฐ€ ํ•จ์ˆ˜ ์ธ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ œํ•œ์  ์˜๋ฏธ์˜ ๋ฉ”์„œ๋“œ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ Future::await(expr) ๊ฐ€ UFCS ์™€ ์ผ๊ด€๋˜๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • __ expr.await!() (์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ) __ : Postfix ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์€ ์œ ์‚ฌํ•˜๊ฒŒ "์ ์˜ ํž˜"์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค ! bang ๋งคํฌ๋กœ๋Š” "์ด๊ฒƒ์€ ๋งˆ์ˆ ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋‹จ์ ์€ ํ›จ์”ฌ ๋” ์‹œ๋„๋Ÿฝ๊ณ  ๋งคํฌ๋กœ๊ฐ€ ๋งˆ๋ฒ•์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ await ์ฒ˜๋Ÿผ ์ฃผ๋ณ€ ์ฝ”๋“œ์— ๋งˆ๋ฒ•์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹จ์ ์€ ๋ฒ”์šฉ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ํ‘œ์ค€ํ™”ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด await ๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ๊ณ„์† ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ๋ฌธ์ œ ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • __ expr@ , expr# , expr~ ๋ฐ ๊ธฐํƒ€ ๋‹จ์ผ ๋ฌธ์ž ๊ธฐํ˜ธ __ : ? ์™€ ๊ฐ™์ด ๋‹จ์ผ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๊ฒฐ์„ฑ์„ ์ตœ๋Œ€ํ™”ํ•˜๊ณ  ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ? ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ await ์ด ์ฝ”๋“œ์— ์Šค๋ฉฐ ๋“ค๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด์ด ๊ฐ„๊ฒฐํ•จ์— ๊ฐ์‚ฌ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹จ์ ์€ ์ฝ”๋“œ๋ฅผ await ํฉ ๋ฟŒ๋ ค ๋†“๋Š” ๊ณ ํ†ต์ด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š” ํ•œ ๊ทธ๋Ÿฌํ•œ ๊ตฌ๋ฌธ์„ ์ฑ„ํƒํ•˜๋Š” ๋ฐ ๋‚ด์žฌ ๋œ ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„์— ๋Œ€ํ•œ ํ•ฉ์˜๋ฅผ๋ณด๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด ์š”์•ฝ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•ด @traviscross ์—๊ฒŒ ๊ฐ์‚ฌ๋ฅผ

F #๊ณผ ๊ฐ™์€ "ํŒŒ์ดํ”„ ์—ฐ์‚ฐ์ž"๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ (๋ช…์‹œ์ ์ธ ๊ตฌ๋ฌธ ์ฐจ์ด๊ฐ€ ์žˆ์Œ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

// use `|>` for instance, Rust can choose other sigils if there are conflicts with current syntax
await expr
expr |> await

// and we can use this operator on normal function calls too
f(g(h(x))) 
x |> h |> g |> f
// this is more convenient than "postfix macro"
x.h!().g!().f!()

@traviscross ํ›Œ๋ฅญํ•œ ์š”์•ฝ. ๋˜ํ•œ์‹œ๊ธธ๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : fut@await ). ๊ทธ๋ž˜์„œ์ด ์Šค๋ ˆ๋“œ์— ์˜ค๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์—์ด ๊ตฌ๋ฌธ์˜ ์žฅ๋‹จ์ ์„ ์ž…๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. @earthengine ์€ @ ์ด์™ธ์˜ ๋‹ค๋ฅธ ์‹œ๊ธธ ( ์˜ˆ : ~ ๋„ ๊ฐ€๋Šฅ ํ•˜๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค . @BenoitZugmeyer๋Š” ์„ ํ˜ธ @await , ๊ทธ๋ฆฌ๊ณ  ์•Œ๋ผ ํ›„์œ„ ๋งคํฌ๋กœ ๋ฌป๋Š” expr!await ์ข‹์€ ์ƒ๊ฐ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. @dpc ๋Š” @await ์ด ๋„ˆ๋ฌด ์ž„์‹œ์ ์ด๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๊ฒƒ๊ณผ ์ž˜ ํ†ตํ•ฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ฃผ์žฅ ํ•ฉ๋‹ˆ๋‹ค. @cenwangumass ๋Š” ๋„ˆ๋ฌด ๋ฐ ๋™์˜ ํ•ฉ๋‹ˆ๋‹ค. @newpavlov ๋Š” await ๋ถ€๋ถ„์ด ์ค‘๋ณต ๋œ ๋Š๋‚Œ์ด ๋“ ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค . ํŠนํžˆ ํ–ฅํ›„ ๋‹ค๋ฅธ ์œ ์‚ฌํ•œ ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. @nicoburns ๋Š” ๊ตฌ๋ฌธ์ด ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ฌธ์ œ๊ฐ€ ๋งŽ์ง€ ์•Š์ง€๋งŒ ๋„ˆ๋ฌด ์ž„์‹œ์ ์ธ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

@traviscross ํ›Œ๋ฅญํ•œ ์š”์•ฝ!

๋‚ด ์ƒ๊ฐ์— ์ตœ์•…์—์„œ ์ตœ๊ณ  ์ˆœ์œผ๋กœ 0.02 $ :

  • 3์€ ๊ฑฐ์˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€๋กœ ์ง„ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 2๋Š” ํ•„๋“œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ํŠนํžˆ ์‹ ๊ทœ ์ด๋ฏผ์ž์—๊ฒŒ ๋งค์šฐ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์™„์„ฑ ๋ชฉ๋ก์— await ๊ฐ€์žˆ๋Š” ๊ฒƒ์€๋ณ„๋กœ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ฒƒ์„ ์ž‘์„ฑํ•œ ํ›„์—๋Š” fn ๋˜๋Š” extern . ์ถ”๊ฐ€ ์™„์„ฑ์€ ์œ ์šฉํ•œ ๋ฐฉ๋ฒ• / ํ•„๋“œ ๋Œ€์‹  ํ‚ค์›Œ๋“œ๋กœ ์ œ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด๊ฒƒ๋„์—†๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค.
  • 4 ๋งคํฌ๋กœ๋Š” ์—ฌ๊ธฐ์— ์ ํ•ฉํ•˜์ง€๋งŒ ๋‚˜์—๊ฒŒ ์ž˜ ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด async ํ‚ค์›Œ๋“œ๊ฐ€๋˜๋Š” ๋น„๋Œ€์นญ ์„ฑ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • 5์‹œ๊ธธ์€ ๋„ˆ๋ฌด ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฐพ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ„๋ฆฌ ๋œ ๋…๋ฆฝ ์ฒด์ด๋ฏ€๋กœ ๊ทธ๋ ‡๊ฒŒ ์ทจ๊ธ‰ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ๋น„์Šทํ•ด ๋ณด์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€์„์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 1 ์ตœ์„ ์˜ ์ ‘๊ทผ ๋ฐฉ์‹ IMHO, ๊ทธ๊ฒƒ์€ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฏธ ์˜ˆ์•ฝ ๋œ ํ‚ค์›Œ๋“œ ์ธ ์ธ์žฅ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ณต๊ฐ„ ๋ถ„๋ฆฌ๋Š” ๊ฒฐํ•จ์ด ์•„๋‹ˆ๋ผ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ํ˜•์‹ํ™”๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์กด์žฌํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ rustfmt ์—์„œ๋Š” ํ›จ์”ฌ ๋œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ˆœ๊ฐ„์ด ์˜ค๊ธฐ๋ฅผ ๊ฐ„์ ˆํžˆ ๊ธฐ๋‹ค๋ ค์˜จ ์‚ฌ๋žŒ์œผ๋กœ์„œ, ์—ฌ๊ธฐ ๋‚ด $ 0.02๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ @Pzixel์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‘ ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ์„œ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ try!() /์™€ ๊ฐ™์ด ๋‘˜ ๋‹ค ์˜ต์…˜์œผ๋กœ ์ œ๊ณต ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ? ์Œ. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์‚ฌ๋žŒ๋“ค์ด ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ? try!() ๋ณด๋‹ค

ํŠนํžˆ await postfix ํ‚ค์›Œ๋“œ๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋ช…์‹œ์ ์ธ ๋‹จ๊ณ„ ์ˆœ์„œ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

let val1 = my_async() await;
...
let val2 = another_async(val1) await;
...
let val3 = yet_another_async(val2) await;

๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ, ์ „ํ˜•์ ์ธ Rust-y ๋ฉ”์†Œ๋“œ ์ฒด์ธ ์Šคํƒ€์ผ์—์„œ ๋Œ€์‹  ๋” ๋ณต์žกํ•œ ๊ฒƒ์„ ์„ ํ˜ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let my_final_value = commit(get_some_data()
                        .and_then(|s| get_another_data(s))
                        .or_else(|s| report_error(s))~);

์ด ๊ฒฝ์šฐ ์šฐ๋ฆฌ๊ฐ€ ๋ฏธ๋ž˜๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ด๋ฏธ ๋งฅ๋ฝ์—์„œ ์ƒ๋‹นํžˆ ๋ถ„๋ช…ํ•˜๊ณ  await ํ‚ค๋ณด๋“œ์˜ ์žฅํ™ฉํ•จ์€ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค. ๋น„๊ต:

let my_final_value = commit(get_some_data()
                        .and_then(|s| get_another_data(s))
                        .or_else(|s| report_error(s)) await);

๋‹จ์ผ ๊ธฐํ˜ธ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์  ์€ ๊ธฐํ˜ธ๊ฐ€ ํ‘œํ˜„์‹์— ์†ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆํ•˜๋Š” ๋ฐ˜๋ฉด (๊ฐœ์ธ์ ์œผ๋กœ๋Š”) ๋…๋ฆฝํ˜• await ๋Š” ์•ฝ๊ฐ„ ... ? :)

๋‚ด๊ฐ€ ๋งํ•˜๋ ค๋Š” ๊ฒƒ์€ await ๋ฌธ ์—์„œ ๋” ์ข‹์•„ ๋ณด์ด๋Š” ๋ฐ˜๋ฉด ๋‹จ์ผ ๊ธฐํ˜ธ ์ ‘๋ฏธ์‚ฌ๋Š” ํ‘œํ˜„์‹ ์—์„œ ๋” ์ž˜ ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์ด๊ฒƒ๋“ค์€ ๋‚ด ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๋ฏธ ๋ชจ๋“  ์ž์ „๊ฑฐ ํ˜๋ฆฌ๊ธฐ ์Šค๋ ˆ๋“œ์˜ ์–ด๋จธ๋‹ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ๊นŒ์ง€ ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ๋˜ ๋‹ค๋ฅธ์‹œ๊ธธ AFAICT : -> ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„์ด๋””์–ด๋Š”๋˜๊ณ  ๊ทธ๊ฒƒ์ด ๊ฑฐ์šธ -> ๊ฐ€ ๋‹ค์Œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ํ˜•์‹ ์„ ์–ธ์—์„œ - ๊ธฐ๋Šฅ์ด์žˆ๋Š” async - ๊ธฐ๋‹ค๋ ค์˜จ ๋ฐ˜ํ™˜ ํ˜•์‹์ด๋‹ค.

async fn send() -> Result<Response, HttpError> {...}
async fn into_json() -> Result<Json, EncodingError> {...}

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

์œ„์˜ send()-> ์—์„œ ์–ป์€ ๊ฒƒ์€ ํ•จ์ˆ˜ ์„ ์–ธ์— ์“ฐ์—ฌ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ Result<Response, HttpError> ์ž…๋‹ˆ๋‹ค.

์œ„์˜ ๋Œ€๋ถ€๋ถ„์˜ ํ† ๋ก ์„ ์ฝ๊ณ  ๋ฉฐ์น  ๋™์•ˆ ์ œ์•ˆ ๋œ ์˜ต์…˜์„ ๊ฒ€ํ†  ํ•œ ํ›„ $ 0.02์ž…๋‹ˆ๋‹ค. ์ œ ์˜๊ฒฌ์— ๋ฌด๊ฒŒ๋ฅผ ๋‘˜ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ธํ„ฐ๋„ท์—์„œ ์•„๋ฌด๋ ‡์ง€๋„ ์•Š์€ ์‚ฌ๋žŒ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ† ๋ก ์— ๋” ๋งŽ์€ ์†Œ์Œ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋„๋ก ์กฐ์‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‚˜๋Š” ํ›„์œ„ ์ธ์žฅ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ์‹œ๊ธธ์— ๋Œ€ํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์žˆ์œผ๋ฉฐ ๋‚˜๋จธ์ง€ ์–ธ์–ด์™€ ์ผ๊ด€์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์–ด๋–ค ํŠน์ •ํ•œ์‹œ๊ธธ์ด ์‚ฌ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ํŠน๋ณ„ํ•œ ์„ ํ˜ธ๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒƒ๋„ ์„ค๋“๋ ฅ์ด ์—†์ง€๋งŒ ์ต์ˆ™ํ•ด์ง€๋ฉด ์‚ฌ๋ผ์งˆ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ธธ์€ ๋‹ค๋ฅธ ์ ‘๋ฏธ์‚ฌ ์˜ต์…˜์— ๋น„ํ•ด ๋…ธ์ด์ฆˆ๊ฐ€ ๊ฐ€์žฅ ์ ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด . (์—ฐ๊ฒฐํ•  ๋•Œ)๋ฅผ -> ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š์ง€๋งŒ ? ์™€ ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ œ์‹œ๋œ ๋‹ค๋ฅธ ์ ‘๋ฏธ์‚ฌ ์˜ต์…˜์„ ๋งค์šฐ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. await ์€ ํ•„๋“œ ๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋‚˜๋จธ์ง€ ์–ธ์–ด์™€ ์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ์–ธ์–ด์— ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ๋‚˜ ํ‚ค์›Œ๋“œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ด€์„ฑ์ด ์—†์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

์–ธ์–ด๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๊ณ  ์™„์ „ํžˆ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋ฉด .await ๋˜๋Š” .await() ๊ฐ€ ํŠน์ˆ˜ํ•œ ์–ธ์–ด ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ฉฐ ์œ ํ˜•์˜ ํ•„๋“œ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋˜๋Š” ์–ธ์–ด๋กœ ๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ํ•„๋“œ ๋ฐ ๋ฐฉ๋ฒ•. ๋” ๋งŽ์€ ๊ฒฝํ—˜์„ ์–ป์€ ํ›„์— .await!() ๋ฅผ ์„ ํƒํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ์ ‘๋‘์–ด ๋งคํฌ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋ ค๊ณ  ๋…ธ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ž์‹ ์˜ ์ ‘๋‘์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›  ๋“ฏ์ด). ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€์‹œ๊ธธ์„ ๋ณธ ๊ฒฝ์šฐ ๋ฌธ์„œ ( ? ์ฒ˜๋Ÿผ)๋ฅผ ์ฐพ์•„์•ผ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ํ˜ผ๋™ํ•˜์ง€ ์•Š๊ณ  .await() ์˜ ์ •์˜๋ฅผ ์ฐพ๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜๋Š” .await ํ•„๋“œ์— ๋Œ€ํ•œ ๋ฌธ์„œ.

๋‚˜๋Š” ์ ‘๋‘์‚ฌ await { .. } ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ช…ํ™•ํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์ด๋ฏธ ์ž์„ธํžˆ ๋…ผ์˜ ๋จ). ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฝค๋น„ ๋„ค์ดํ„ฐ ์‚ฌ์šฉ์„ ์„ ํ˜ธํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹์œผ๋กœ ์ธ์ฒด ๊ณตํ•™์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๊ตฌํ˜„ ๋œ ์œ ์ผํ•œ ์˜ต์…˜์ด๋˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ postfix sigil์„ ๋ฉ‹์ง€๊ฒŒ ๋ณด์™„ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ ‘๋‘์‚ฌ ์˜ต์…˜์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์œผ๋ฉฐ ์–ธ์–ด์˜ ๋‹ค๋ฅธ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์„ฑ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ ๋ฐฉ๋ฒ•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ ‘๋‘์‚ฌ ํ•จ์ˆ˜๋Š” ์ผ๊ด€์„ฑ์ด ์—†์œผ๋ฉฐ ์ œ์–ด ํ๋ฆ„์— ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด์— ๋‚ด์žฅ ๋œ ๋‹ค๋ฅธ ์ „์—ญ ํ•จ์ˆ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ œ์–ด ํ๋ฆ„์— ์‚ฌ์šฉ๋˜๋Š” ๋งคํฌ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค ( try!(..) ๋Š” ์˜ˆ์™ธ์ด์ง€๋งŒ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜ ์ธ postfix sigil์ด ์žˆ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).


๊ฑฐ์˜ ๋ชจ๋“  ์„ ํ˜ธ๋„๋Š” ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์ผ๊ด€๋œ ๋Š๋‚Œ์œผ๋กœ ๊ท€๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์†”๋ฃจ์…˜์„ ์„ ํƒํ•˜๋“  ์•ˆ์ •ํ™” ์ „์— ์‹คํ—˜์„์œ„ํ•œ ์‹œ๊ฐ„์ด ์ฃผ์–ด์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฒฝํ—˜์€ ์ถ”์ธก๋ณด๋‹ค ์–ด๋–ค ์˜ต์…˜์ด ๊ฐ€์žฅ ์ข‹์€์ง€ ํ›จ์”ฌ ๋” ๋‚˜์€ ํŒ๋‹จ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์™„์ „ํžˆ ๋‹ค๋ฅธ ์˜๊ฒฌ์„ ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” ์นจ๋ฌต์˜ ๋‹ค์ˆ˜๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ† ๋ก ์— ์ฐธ์—ฌํ•˜๋Š” ์‚ฌ๋žŒ๋“ค (๋‚˜๋ฅผ ํฌํ•จํ•˜์—ฌ)์ด ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  Rust ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค (์ด๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๊ณต๊ฒฉ์  ์ž„).

tl; dr Postfix์‹œ๊ธธ์€ await (์šฐ์„  ์ˆœ์œ„๋กœ ์ธํ•ด)๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฉ๋ฒ•์ด๋ฉฐ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ผ๊ด€๋œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ await { .. } ์™€ ์ ‘๋ฏธ์‚ฌ @ (์ปจํ…์ŠคํŠธ์—์„œ ? ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ)๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Rust๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

์ด ๊ฒฝ์šฐ ์šฐ๋ฆฌ๊ฐ€ ๋ฏธ๋ž˜๋ฅผ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ด๋ฏธ ๋งฅ๋ฝ์—์„œ ์ƒ๋‹นํžˆ ๋ถ„๋ช…ํ•˜๊ณ  await ํ‚ค๋ณด๋“œ์˜ ์žฅํ™ฉํ•จ์€ ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค. ๋น„๊ต:

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ~ ํ•œ ๋ˆˆ์— ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ „์ฒด ๋Œ“๊ธ€์„ ๋‹ค์‹œ ์ฝ์—ˆ๊ณ  ๋‘ ๋ฒˆ์งธ๋กœ ์ฝ์€ ๊ฒƒ์ด ๋” ์„ฑ๊ณต์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ธธ์ด ๋” ๋‚˜์˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ์ž˜ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์˜๊ฒฌ ์ผ ๋ฟ์ด์ง€ ๋งŒ ๋‹ค์‹œ ํ•œ ๋ฒˆ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ธ์žฅ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์ ์€ Rust๊ฐ€ J๊ฐ€๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

?@? ๋Š” "์˜ค๋ฅ˜ ๋˜๋Š” ๋ฏธ๋ž˜๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜์žˆ๋Š” ํ•จ์ˆ˜, ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋ฉฐ ์˜ค๋ฅ˜๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ํ˜ธ์ถœ์ž์—๊ฒŒ ์ „ํŒŒ๋จ"์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋” ๋งŽ์ด ๊ฐ–๊ณ  ์‹ถ์–ด

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

์•ˆ๋…•ํ•˜์„ธ์š”.

์ด๊ฒƒ์€ ์ด๋ฏธ ๋ชจ๋“  ์ž์ „๊ฑฐ ํ˜๋ฆฌ๊ธฐ ์‹ค์˜ ์–ด๋จธ๋‹ˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ๊นŒ์ง€ ์–ธ๊ธ‰๋˜์ง€ ์•Š์€ ๋˜ ๋‹ค๋ฅธ ์ธ์žฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค AFAICT :->.

๋ฌธ๋งฅ์— ๋”ฐ๋ผ ๋ฌธ๋ฒ•์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ƒํ™ฉ์„ ๋” ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋” ๋‚˜๋น ์งˆ๋ฟ์ž…๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋” ๋‚˜๊ณ  ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋Š๋ ค์ง‘๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” -> ๋Œ€ํ•ด ๋ณ„๋„์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋ฉฐ async/await ๋ฅผ ์ฒ˜๋ฆฌ ํ•  ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ ‘๋‘์‚ฌ await { .. } ์„ ํ˜ธํ•˜๊ณ , ๊ฐ€๋Šฅํ•˜๋ฉด ์ ‘๋‘์‚ฌ ! ์‹œ๊ธธ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
๋Š๋‚Œํ‘œ๋Š” ๋ฏธ๋ž˜์˜ ๊ฒŒ์œผ๋ฆ„์„ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ๋Š๋‚Œํ‘œ๊ฐ€์žˆ๋Š” ๋ช…๋ น์ด ์ฃผ์–ด์งˆ ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋น„๋™๊ธฐ ๊ฒฝํ—˜์ด ๊ฑฐ์˜์—†๊ณ  Rust์˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ œ ์˜๊ฒฌ์ด ๊ด€๋ จ์ด ์—†๋‹ค๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ .send()?!?.json()?!?; ๋ฐ ๊ธฐํƒ€ ์กฐํ•ฉ์„ ์‚ดํŽด๋ณด๋ฉด์‹œ๊ธธ ๊ธฐ๋ฐ˜ ์ œ์•ˆ์ด ๋‚˜์—๊ฒŒ ์ž˜๋ชป๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ธฐ๋ณธ์ ์ธ ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ, ?!? ๋˜๋Š” ?~? ๋˜๋Š” ?->? ์–ด๋””์—์„œ๋“  ์—ฐ๊ฒฐ์‹œ๊ธธ์„ ๋น ๋ฅด๊ฒŒ ์ฝ์„ ์ˆ˜ ์—†๊ฒŒ๋œ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ดˆ๋ณด์ž๊ฐ€ ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์ž์ธ์ง€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ์ง€ ์ถ”์ธกํ•˜๋ฉด์„œ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌ๋˜๋Š” ๋˜ ํ•˜๋‚˜์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •๋ณด๊ฐ€ ๋„ˆ๋ฌด ๋นก๋นกํ•ฉ๋‹ˆ๋‹ค.

๋‘˜์งธ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋Œ€๊ธฐ ์ง€์ ์ด ์˜ค๋ฅ˜ ์ „ํŒŒ ์ง€์ ๋ณด๋‹ค ๋œ ์ผ๋ฐ˜์ ์ด๊ณ  ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ์ง€์ ์€ ๋‹ค๋ฅธ ๋‹จ๊ณ„์— ์—ฐ๊ฒฐ๋œ "์‚ฌ์†Œํ•œ ๋ณ€ํ™˜"์ด ์•„๋‹ˆ๋ผ ์ž์ฒด์ ์œผ๋กœ ์ฒด์ธ์˜ ํ•œ ๋‹จ๊ณ„๊ฐ€ ๋  ์ž๊ฒฉ์ด์žˆ์„๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค ( ํŠนํžˆ "๋‹จ์ง€"์‚ฌ์†Œํ•œ ๋ณ€ํ™˜ ์ค‘ ํ•˜๋‚˜ "๊ฐ€ ์•„๋‹˜). ๋‚˜๋Š” ์•„๋งˆ๋„ ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ ํ˜•์‹๋งŒ์œผ๋กœ๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ฑฐ์˜ ๊ธฐ๋‹ค๋ฆผ์ด ์ฒด์ธ์„ ๋Š๊ธฐ ์œ„ํ•ด ๊ฑฐ์˜ ๊ฐ•์ œ๋กœ).ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋„ˆ๋ฌด ์ œํ•œ์ ์ด๋ผ๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ๋‚ด ์ด์ƒ์ ์ธ ์˜ต์…˜์€ ์•„๋งˆ๋„ .await!() ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ๋งคํฌ๋กœ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ–ฅํ›„ ๋งคํฌ๋กœ ์‹œ์Šคํ…œ์„ ํ™•์žฅํ•˜์—ฌ ๋ฉ”์„œ๋“œ์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ๋งคํฌ๋กœ๋ฅผ ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์— ์•ˆ์ •ํ™”๋ฅผ์œ„ํ•œ ์ตœ์†Œ ๊ธฐ์ค€์€ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž await my_future ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์ด ๋”ฐ๋ผ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

expr....await ์€ (๋Š”) ๊ธฐ๋‹ค๋ฆด ๋•Œ๊นŒ์ง€ ์ง„ํ–‰๋˜๋Š” ์ƒํ™ฉ์„ ๋ฐ˜์˜ํ•˜๊ณ  rustlang ์—ฐ์‚ฐ์ž์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ async await๋Š” ๋ณ‘๋ ฌ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. await๋Š” ๋ฉ”์„œ๋“œ ๋˜๋Š” ์œ ์‚ฌํ•œ ์†์„ฑ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” await!(foo) ๋Œ€ํ•œ ๋‚ด ์„ฑํ–ฅ์ด ์žˆ์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์•ฝ์„ ์ทจ์†Œํ•˜๊ณ  2021 ๋…„๊นŒ์ง€ ์šด์˜์ž๋กœ์„œ์˜ ํ–ฅํ›„ ์‚ฌ์šฉ์„ ๋ฐฐ์ œ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ง€์  ํ–ˆ์œผ๋ฏ€๋กœ await { foo } ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ทจํ–ฅ์œผ๋กœ. postfix await์— ๊ด€ํ•ด์„œ๋Š” ํŠน๋ณ„ํ•œ ์˜๊ฒฌ์ด ์—†์Šต๋‹ˆ๋‹ค.

์•”์‹œ ์  ๋Œ€๊ธฐ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ์— ๊ฐ€์žฅ ์ข‹์€ ๊ณณ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ช…์‹œ ์  ์•”์‹œ ์  ๋Œ€๊ธฐ์™€ ๊ฐ™์€ ๊ฒƒ์ด ์ž‘๋™ํ• ๊นŒ์š”? ๋”ฐ๋ผ์„œ ๋จผ์ € ์ ‘๋‘์‚ฌ๊ฐ€ ์ฐฉ๋ฅ™์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

await { future }?

๋‚˜์ค‘์— ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ๊ฒƒ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

let result = implicit await { client.get("https://my_api").send()?.json()?; }

๋˜๋Š”

let result = auto await { client.get("https://my_api").send()?.json()?; }

์•”์‹œ ์  ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•˜๋ฉด {} ์‚ฌ์ด์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์ด ์ž๋™์œผ๋กœ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ await ๊ตฌ๋ฌธ์„ ํ†ตํ•ฉํ–ˆ์œผ๋ฉฐ ์ ‘๋‘์‚ฌ await, chaining ๋ฐ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…์‹œ์ ์ธ ํ•„์š”์„ฑ์˜ ๊ท ํ˜•์„ ๋งž์ถœ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ ‘๋‘์‚ฌ๊ฐ€ ์ตœ์ ์ด ์•„๋‹Œ ์žฅ์†Œ์˜ ์˜ˆ๋ฅผ ์กฐ์‚ฌํ•˜๊ธฐ ์œ„ํ•ด rg --type csharp '[^ ]await' ์„ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์ด ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ฝ”๋“œ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์นœ ์‹ค์ œ ์ฝ”๋“œ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ๋Š” ํŠน์ • ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

(await response.Content.ReadAsStringAsync()).Should().Be(text);

FluentAssertions ๋ฅผ ์ผ๋ฐ˜์ ์ธ MSTest assert_eq! Assert.Equal ๋ณด๋‹ค ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

var previous = (await branch.ListHistoryAsync(timestampUtc, null, cancellationToken, 1)).HistoryEntries.SingleOrDefault();

"๋ด, ๋‚œ ์ •๋ง ํ•œ ๊ฐ€์ง€๋งŒ ํ•„์š” ํ–ˆ์–ด"๋ผ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์€ ๊ทธ๊ฒƒ๋“ค์˜ ๋ฌด๋ฆฌ์ž…๋‹ˆ๋‹ค.

id = id ?? (await this.storageCoordinator.GetDefaultWidgetAsync(cancellationToken)).Identity;

๋˜ ๋‹ค๋ฅธ "๋‚˜๋Š” ๋‹จ์ง€ ํ•˜๋‚˜์˜ ์†์„ฑ ๋งŒ ํ•„์š”ํ–ˆ๋‹ค". (์ œ์™ธ : "๋‚จ์ž๋Š” Rust๊ฐ€ CancellationToken s๋ฅผ ํ•„์š”๋กœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์ฉ๋‹ˆ๋‹ค.)

var pending = (await transaction.Connection.QueryAsync<EventView>(command)).ToList();

์‚ฌ๋žŒ๋“ค์ด Rust์—์„œ ์–ธ๊ธ‰ ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ .collect() .

foreach (var key in changes.Keys.Intersect((await neededChangesTask).Keys))

๋‚˜๋Š” ์•„๋งˆ๋„ ๊ทธ ๋’ค์— rustfmt ๊ฐœํ–‰ (๊ทธ๋ฆฌ๊ณ  ์กด์žฌํ•œ๋‹ค๋ฉด ? ๋’ค์—)์ด์žˆ๋Š” postfix ํ‚ค์›Œ๋“œ๋ฅผ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ, ๊ฐœํ–‰์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒํ•˜๋Š” ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

else if (!await container.ExistsAsync())

์ ‘๋‘์‚ฌ๊ฐ€ ์‹ค์ œ๋กœ ์œ ์šฉํ•œ ๋“œ๋ฌธ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

var response = (HttpWebResponse)await request.GetResponseAsync();

๋ช‡ ๊ฐœ์˜ ์บ์ŠคํŠธ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ ๋ฌผ๋ก  ์บ์ŠคํŠธ๋Š” Rust๊ฐ€ ์ ‘๋ฏธ์‚ฌ์ด์ง€๋งŒ C #์ด ์ ‘๋‘์‚ฌ ์ธ ๋˜ ๋‹ค๋ฅธ ๊ณณ์ž…๋‹ˆ๋‹ค.

using (var response = await this.httpClient.SendAsync(requestMsg))

ํ›„์œ„ ๋Œ€ ์ด๊ฒƒ์€ ์ ‘๋‘์‚ฌ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค,ํ•˜์ง€๋งŒ ๋‚œ ๋˜ ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ์ฐจ์ด๋ฅผ ์ƒ๊ฐ : C #์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Drop ์‚ฌ๋ฌผ์˜ ๋ฌด๋ฆฌ ๋ณ€์ˆ˜์— ๊ฐ€์„œ ์ฒด์ธํ•˜์ง€ _needing_์„ ๋๋‚ธ๋‹ค.

@scottmcm ์˜ ์˜ˆ์ œ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค์–‘ํ•œ ์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜•์—์„œ ๋…น์Šฌ ์—ˆ์Šต๋‹ˆ๋‹ค.

// keyword
response.content.read_as_string()) await?.should().be(text);
// field
response.content.read_as_string()).await?.should().be(text);
// function
response.content.read_as_string()).await()?.should().be(text);
// macro
response.content.read_as_string()).await!()?.should().be(text);
// sigil
response.content.read_as_string())@?.should().be(text);
// sigil + keyword
response.content.read_as_string())@await?.should().be(text);
// keyword
let previous = branch.list_history(timestamp_utc, None, 1) await?.history_entries.single_or_default();
// field
let previous = branch.list_history(timestamp_utc, None, 1).await?.history_entries.single_or_default();
// function
let previous = branch.list_history(timestamp_utc, None, 1).await()?.history_entries.single_or_default();
// macro
let previous = branch.list_history(timestamp_utc, None, 1).await!()?.history_entries.single_or_default();
// sigil
let previous = branch.list_history(timestamp_utc, None, 1)@?.history_entries.single_or_default();
// sigil + keyword
let previous = branch.list_history(timestamp_utc, None, 1)@await?.history_entries.single_or_default();
// keyword
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;
// field
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async().await?.identity).await?;
// function
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async().await()?.identity).await()?;
// macro
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async().await!()?.identity).await!()?;
// sigil
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async()@?.identity)@?;
// sigil + keyword
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async()@await?.identity)@await?;

(์ˆ˜์ •์„ ์œ„ํ•ด @ Nemo157 ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค)

// keyword
let pending = transaction.connection.query(command) await.into_iter().collect::<Vec<EventView>>();
// field
let pending = transaction.connection.query(command).await.into_iter().collect::<Vec<EventView>>();
// function
let pending = transaction.connection.query(command).await().into_iter().collect::<Vec<EventView>>();
// macro
let pending = transaction.connection.query(command).await!().into_iter().collect::<Vec<EventView>>();
// sigil
let pending = transaction.connection.query(command)@.into_iter().collect::<Vec<EventView>>();
// sigil + keyword
let pending = transaction.connection.query(command)@await.into_iter().collect::<Vec<EventView>>();

๋‚˜๋ฅผ ์œ„ํ•ด, ์ด๊ฒƒ์„ ์ฝ์€ ํ›„์— @ ์‹œ๊ธธ์€ ํŠนํžˆ ? ์•ž์—์„œ ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ”์—์„œ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

์ด ์Šค๋ ˆ๋“œ์—์„œ Stream์˜ await ๋ณ€ํ˜•์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ƒ๊ฐํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

Streams์—์„œ ๊ธฐ๋‹ค๋ฆผ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋ช… ๋œ ๊ฒฐ์ •์„ ๋‚ด๋ ธ๋‹ค๋ฉด ๋ถ€๋„๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค.

// keyword
id = id.or_else(|| self.storage_coordinator.get_default_widget_async() await?.identity);

์ด์™€ ๊ฐ™์€ ํด๋กœ์ € ๋‚ด์—์„œ await ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Option ์— ๋น„๋™๊ธฐ ํด๋กœ์ €๋ฅผ ์ทจํ•˜๊ณ  Future ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ถ”๊ฐ€ ํ™•์žฅ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค . ํ™•์žฅ ๋ฉ”์„œ๋“œ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ˆœ๊ฐ„์ด์ง€๋งŒ, ์–ด๋Š ์‹œ์ ์—์„œ ๋น„๋™๊ธฐ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค) .

// keyword
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

(๋˜๋Š” ๊ฒฐํ•ฉ ์ž ๋Œ€์‹  if let ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ๋ณด๋‹ค ์ง์ ‘์ ์œผ๋กœ ๋ฒˆ์—ญ)

@ Nemo157 Yeal,ํ•˜์ง€๋งŒ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ์—†์ด๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

id = ok(id).transpose().or_else(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

๊ทธ๋Ÿฌ๋‚˜ if let ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‹ค์ œ๋กœ ๋‚˜์—๊ฒŒ ๋” ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋ฅผ ์œ„ํ•ด, ์ด๊ฒƒ์„ ์ฝ์€ ํ›„์— @ sigil์€ ํŠนํžˆ? ์•ž์—์„œ ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ”์—์„œ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒด ์ฝ”๋“œ ๊ฐ•์กฐ ์ฒด๊ณ„๋ฅผ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.์ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ์—ฌ๊ธฐ์„œ "๋ณด์ด์ง€ ์•Š์Œ"์ด ๋…๋ฆฝํ˜• ? ๋ณด๋‹ค ๋” ํฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜๋ฆฌํ•œ ์ƒ‰ ๊ตฌ์„ฑํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋ˆˆ์— ๋„๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ? ์™€ ๋‹ค๋ฅธ ์ƒ‰ ์‚ฌ์šฉ).

@newpavlov ์™ธ๋ถ€ ๋„๊ตฌ (์˜ˆ : gitlab / github ๊ฒ€ํ†  ํƒญ)์—์„œ ์ƒ‰ ๊ตฌ์„ฑํ‘œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ•์กฐ ํ‘œ์‹œ์—๋งŒ ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์Šต๊ด€์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค๋ฅธ ์„ ํ˜ธ๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” C ++์—์„œ ์˜จ ์ƒˆ๋กœ์šด Rust ํ•™์Šต์ž์ž…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋Œ“๊ธ€์„ ๋‹ฌ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

๋˜๋Š”

id = id.or_else_async(async || { 
    self.storage_coordinator.get_default_widget_async() await?.identity 
}) await?;

๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? await ๋Š” ์ค„์˜ ๋งจ ๋์œผ๋กœ ๋ฐ€๋ฆฌ๊ณ  ์šฐ๋ฆฌ์˜ ์ดˆ์ ์€ ์ฃผ๋กœ ์ฒ˜์Œ์— ์ง‘์ค‘๋ฉ๋‹ˆ๋‹ค (๊ฒ€์ƒ‰ ์—”์ง„์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋น„์Šท ํ•จ).
๊ฐ™์€ ๊ฒƒ

id =  await? id.or_else_async(async || {
    let widget = await? self.storage_coordinator.get_default_widget_async();
    widget.identity
});

๋˜๋Š”

id = auto await {
    id.or_else_async(async || { self.storage_coordinator.get_default_widget_async()?.identity })
}?;

์ด์ „์— ์ œ์•ˆํ•œ ๊ฒƒ์ด ํ›จ์”ฌ ๋‚˜์•„ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋™์˜ํ•œ๋‹ค. ์ฒ˜์Œ ๋ช‡ ๋‹จ์–ด๋Š” ์ฝ”๋“œ, ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ, ํ…์ŠคํŠธ ๋‹จ๋ฝ ๋“ฑ์„ ์Šค์บ” ํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ ‘๋ฏธ์‚ฌ๋Š” ์ฆ‰์‹œ ๋ถˆ๋ฆฌํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

? ๋ฐฐ์น˜์˜ ๊ฒฝ์šฐ await? foo ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊ตฌ๋ณ„๋˜๊ณ  ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์ง€๊ธˆ ์•ˆ์ •ํ™”ํ•˜๊ณ  2 ๋…„ ๋™์•ˆ ์‚ฌ์šฉํ•œ ํ›„์— ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ๋” ๋‚˜์€ ์—ฐ๊ฒฐ์„ ์›ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ•œ๋‹ค๋ฉด, postfix ๋งคํฌ๋กœ๋ฅผ ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์œผ๋กœ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@nicoburns ๊ฐ€ ์‹ถ์Šต๋‹ˆ๋‹ค .
์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ ‘๋‘์‚ฌ await ํ‚ค์›Œ๋“œ (์˜ˆ : ? ๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•œ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋œ ์ค‘์š” ํ•จ)
  • std::Future ์˜ ์ƒˆ ๋ฉ”์„œ๋“œ (์˜ˆ fn awaited(self) -> Self::Output { await self } . ๊ทธ ์ด๋ฆ„์€ block_on , blocking ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋” ๋‚˜์€ ์ด๋ฆ„์„ ์ œ์‹œ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ "๊ฐ„๋‹จํ•œ"์ ‘๋‘์‚ฌ ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•˜๊ณ  ๋˜ํ•œ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•˜๋Š” ๋™์‹œ์— ๋ฌธ๋งฅ ํ‚ค์›Œ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๋„๋กํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ ์ ์œผ๋กœ ๋‘ ๋ฒˆ์งธ ๊ธ€ ๋จธ๋ฆฌ ๊ธฐํ˜ธ๋Š” ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ๊ฒฝ์šฐ .awaited!() ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

let done = await delayed;

let value = await delayed_result?;

let value2 = await some.thing()?;

let value3 = some.other().thing().awaited()?;

let value4 = promise
        .awaited()
        .map_err(|e| e.into())?
        .obtain_other_future()
        .awaited();

๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์ œ์ณ๋‘๊ณ ,์ด ์ œ์•ˆ์˜ ์š”์ ์€ await ์™€ ๊ฐ™์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ ์š”์†Œ๋กœ match ๋ฅผ๋‘๊ณ  ์กฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ข…๋ฅ˜์˜ ํ‚ค์›Œ๋“œ ๋ฐ ์ค‘๊ด„ํ˜ธ. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ทธ๋“ค์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋ฅด ์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ˆ˜๋ฐ˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค : ๋จผ์ € ๊ฐ„๋‹จํ•œ await , ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋„ˆ๋ฌด ๋งŽ์€ ๊ด„ํ˜ธ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด .awaited() ํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ๋Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋˜๋Š” ๋” ๋งˆ๋ฒ•์ ์ธ ๋ฒ„์ „์€ await ํ‚ค์›Œ๋“œ๋ฅผ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๊ณ  std :: Future์˜ ๋งˆ๋ฒ• .awaited() ๋ฉ”์„œ๋“œ์— ์˜์กด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ž์‹ ์˜ ๋ฏธ๋ž˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋ฐ˜ ์ง๊ด€์ ์ด๊ณ  ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค.

std::Future ์˜ ์ƒˆ ๋ฉ”์„œ๋“œ (์˜ˆ fn awaited(self) -> Self::Output { await self }

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค (ํ•จ์ˆ˜ ๋งˆ๋ฒ•์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ ์„œ), ๊ทธ ์•ˆ์—์„œ ๊ธฐ๋‹ค๋ฆฌ๋ ค๋ฉด async fn awaited(self) -> Self::Output { await self } ์—ฌ์•ผํ•˜๊ณ  ์—ฌ์ „ํžˆ await ed ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๊ธฐ๋Šฅ์„ ๋งˆ๋ฒ•์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ํ‚ค์›Œ๋“œ ์ธ IMO ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ Future::wait ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค (ํ™•์‹คํžˆ 0.3์ด ์•„์ง ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?), ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๋ฏธ๋ž˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” _ await ์˜ ์š”์ ์€ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ _ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค _. await ๊ตฌ๋ฌธ์ด ์ ‘๋‘์‚ฌ์ด๊ณ  ์ ‘๋ฏธ์‚ฌ ์˜ต์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ๋ฒ•์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ทธ๋ƒฅ .await() ๋ผ๊ณ  ๋ถ€๋ฅด์„ธ์š”. ์ด๋ฏธ ์Šค๋ ˆ๋“œ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋…ผ์˜ ๋œ ํ‚ค์›Œ๋“œ ๋ฐฉ๋ฒ•๊ณผ ๋งˆ๋ฒ• extern "rust-await-magic" "real "fn.

ํŽธ์ง‘ : scottmcm ninja'd me์™€ GitHub๋Š” (๋ชจ๋ฐ”์ผ๋กœ ์ธํ•ด?) ๋‚˜์—๊ฒŒ ์•Œ๋ ค์ฃผ์ง€ ์•Š์•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ๋– ๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@scottmcm await ๊ฐ€ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™๊ณ  ์ฐจ์„ ์ฑ…์œผ๋กœ ๋ณด์ด๋Š” ๋นˆ๋„ ์ˆ˜๋ฅผ ์กฐ์‚ฌ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๊นŒ? ์ ‘๋‘์‚ฌ ๋Œ€ ์ ‘๋ฏธ์‚ฌ ๋นˆ๋„ ์ˆ˜์— ๋Œ€ํ•œ ์„ค๋ฌธ ์กฐ์‚ฌ๊ฐ€ ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  1. ์ง€๊ธˆ๊นŒ์ง€ await ์ ‘๋ฏธ์‚ฌ์˜ ๊ฐ€์žฅ ์ข‹์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€
client.get("https://my_api").send() await?.json() await?

๋งŽ์€ ๊ฒŒ์‹œ๋ฌผ์ด ์˜ˆ์ œ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ๋†“์นœ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์— ์ž์ฃผ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ์ด ์ค„์„ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

  1. ์ด์ „์— ๋…ผ์˜ํ–ˆ๋“ฏ์ด ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์ด
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

๊ทธ๋“ค์ดํ•˜๋Š” ์ผ์€ await ์„ ๋ช…์‹œ ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹œ๊ฐ์ ์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋ชจ๋“  ์ˆ˜์ต๋ฅ  ํฌ์ธํŠธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

  1. Postfix ํ‚ค์›Œ๋“œ๋Š” ๋‹ค๋ฅธ ์ฃผ๋ฅ˜ ์–ธ์–ด์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ฐœ๋ช…ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ›จ์”ฌ ๋” ๋‚˜์€ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ๋ฐœ๋ช…ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€์น˜๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋‹ค๋ฆผ์€ ์ค„์˜ ๋งจ ๋์œผ๋กœ ๋ฐ€๋ฆฌ๊ณ  ์šฐ๋ฆฌ์˜ ์ดˆ์ ์€ ์ฃผ๋กœ ์ฒ˜์Œ์— ์ง‘์ค‘๋ฉ๋‹ˆ๋‹ค (๊ฒ€์ƒ‰ ์—”์ง„์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋น„์Šท ํ•จ).

์‚ฌ๋žŒ๋“ค์ด F ์ž ํŒจํ„ด @ dowchris97์„

๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ์— ๋™์ผํ•œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ฃผ์–ด์ง„ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŽ˜์ด์ง€์—์žˆ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์€ ์‚ฌ๋žŒ๋“ค์ด ? ์ฐพ๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋” ์ž˜ ์ผ์น˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ await .

์ ๋ฌด๋Šฌ ํŒจํ„ด ์€ ํฐ ํ…์ŠคํŠธ ์ฒญํฌ๋ฅผ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ๋งˆ์น˜ ๋งํฌ, ์ˆซ์ž, ํŠน์ • ๋‹จ์–ด ๋˜๋Š” ๊ณ ์œ  ํ•œ ๋ชจ์–‘ (์˜ˆ : ์ฃผ์†Œ ๋˜๋Š” ์„œ๋ช…)์„ ๊ฐ€์ง„ ๋‹จ์–ด ์ง‘ํ•ฉ๊ณผ ๊ฐ™์€ ํŠน์ • ํ•ญ๋ชฉ์„ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์Šค์บ”ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋น„๊ต๋ฅผ ์œ„ํ•ด, ๊ทธ๊ฒƒ์€ ๋ฐ˜ํ™˜ ๊ฒฝ์šฐ์˜์ด ๊ฐ™์€ ์˜ˆ๋ฅผ ๋ณด์ž Result ๋Œ€์‹  impl Future :

let id = id.try_or_else(|| Ok(self.storage_coordinator.try_get_default_widget()?.identity))?;

? ๋ฅผ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ F ์žํ˜• ์ฝ๊ธฐ ํŒจํ„ด๋ณด๋‹ค ๊ฝค ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ์ค„๋กœ ๋ถ„ํ•  ๋˜์–ด๋„ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

let id = id.try_or_else(|| {
    let widget = self.storage_coordinator.try_get_default_widget()?;
    Ok(widget.identity)
})?;

๋‚˜๋Š” ๋‹น์‹ ๊ณผ ์œ ์‚ฌํ•œ ์„ค๋ช…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๋ฏธ์‚ฌ ์œ„์น˜๊ฐ€ "๋ฐ˜ํ™˜์ ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ๋ช…์‹œ ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹œ๊ฐ์ ์œผ๋กœ ? ์ •ํ™•ํžˆ ์ˆจ๊ธฐ๋Š” ๊ฒƒ"์ด๋ผ๊ณ  ์ฃผ์žฅ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ? ์— ๋Œ€ํ•œ ์›๋ž˜ ์šฐ๋ ค ์‚ฌํ•ญ์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ „๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์ด ? ๋ฅผ ์Šค์บ”ํ•˜๋„๋ก ์ด๋ฏธ ํ›ˆ๋ จ ๋œ ๊ณณ์— ๋‘๋Š” ๊ฒƒ์ด ์‚ฌ๋žŒ๋“ค์ด ๋ณผ ์ˆ˜ ์žˆ๋„๋กํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์Šค์บ”์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

๊ทธ๋Ÿฌ๋‚˜ ์ฝ”๋“œ์— ๋™์ผํ•œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ฃผ์–ด์ง„ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŽ˜์ด์ง€์—์žˆ๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์€ ์‚ฌ๋žŒ๋“ค์ด ? ์ฐพ๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋” ์ž˜ ์ผ์น˜ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ await .

์ ๋ฌด๋Šฌ ํŒจํ„ด ์€ ํฐ ํ…์ŠคํŠธ ์ฒญํฌ๋ฅผ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ๋งˆ์น˜ ๋งํฌ, ์ˆซ์ž, ํŠน์ • ๋‹จ์–ด ๋˜๋Š” ๊ณ ์œ  ํ•œ ๋ชจ์–‘ (์˜ˆ : ์ฃผ์†Œ ๋˜๋Š” ์„œ๋ช…)์„ ๊ฐ€์ง„ ๋‹จ์–ด ์ง‘ํ•ฉ๊ณผ ๊ฐ™์€ ํŠน์ • ํ•ญ๋ชฉ์„ ์ฐพ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์Šค์บ”ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ฐœ๊ฒฌ ๋œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ฝ”๋“œ๋ฅผ ๋” ์ž˜ / ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด๋œ๋‹ค๋Š” ์ฆ๊ฑฐ๋„ ํ™•์‹คํžˆ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ธ๊ฐ„์ด F ์ž ํŒจํ„ด์„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‚˜์ค‘์— ์–ธ๊ธ‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,์ด ์ค„์„ ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ธ์ œ๋ถ€ํ„ฐ ์–ผ๋ฃฉ ๋ฌด๋Šฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๊นŒ? ์ „์— ์ด๊ฒƒ์„ ์ฝ์€ ์ ์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;

์ €์—๊ฒŒ๋Š” async ์„ (๋ฅผ) ๋ณด์•˜์„ ๋•Œ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ์ฒ˜์Œ await? , self.storage_coordinator.get_default_widget_async() , .identity ์ˆœ์œผ๋กœ ์ด๋™ ํ•œ ๋‹ค์Œ ๋งˆ์นจ๋‚ด ์ „์ฒด ๋ผ์ธ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” ๋…์„œ ๊ฒฝํ—˜์ด ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์ด์œ ๋Š” ์šฐ๋ฆฌ์˜ ์„œ๋ฉด ์–ธ์–ด ์‹œ์Šคํ…œ์—๋Š” ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ธํ„ฐ๋ฆฌ๋ธŒ ๋œ ์•ž๋’ค ์ ํ”„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ ํ”„ํ•˜๋ฉด์ด ๋ผ์ธ์ดํ•˜๋Š” ์ผ์— ๋Œ€ํ•œ ๋ฉ˜ํƒˆ ๋ชจ๋ธ ๊ตฌ์ถ•์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ต๋ฅผ ์œ„ํ•ด์ด ๋ผ์ธ์€ ๋ฌด์—‡์„ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

id = await? id.or_else_async(async || {
    let widget = await? self.storage_coordinator.get_default_widget_async();
    widget.identity
});

await? ๋„๋‹ฌํ•˜์ž๋งˆ์ž ๋น„๋™๊ธฐ์‹์ด๋ผ๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์‹œ let widget = await? ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด ์–ด๋ ค์›€์—†์ด ์ด๊ฒƒ์ด ๋น„๋™๊ธฐ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. F ์ž ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ ๊ฐ™์•„์š”. https://thenextweb.com/dd/2015/04/10/how-to-design-websites-that-mirror-how-our-eyes-work/ ์— ๋”ฐ๋ฅด๋ฉด F ๋ชจ์–‘์ด ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ธ๊ฐ„์˜ ๋ณธ์„ฑ์— ๋งž๋Š” ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•˜๊ฑฐ๋‚˜ ํŠน์ˆ˜ ๊ต์œก์ด ํ•„์š”ํ•˜๊ณ  ์šฐ๋ฆฌ์˜ ๋ณธ์„ฑ์— ๋ฐ˜ํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๋ฐœ๋ช… ํ•  ๊ฒƒ ์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ๋น„๋™๊ธฐ ๋ฐ ์ผ๋ฐ˜ ๋ผ์ธ์ด ์ธํ„ฐ๋ฆฌ๋ธŒ๋˜๋ฉด ๊ทธ ์ฐจ์ด๋Š” ๋”์šฑ ์ปค์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

await? id.or_else_async(async || {
    let widget1 = await? self.storage_coordinator.get_default_widget_async();
    let result1 = do_some_wierd_computation_on(widget1.identity);
    let widget2 = await? self.network_coordinator.get_default_widget_async();
    let result2 = do_some_strange_computation_on(widget2.identity);
});

์ค„์„ ๋„˜์–ด์„œ await? ๋ฅผ ์ฐพ์•„์•ผํ•˜๋‚˜์š”?

let id = id.try_or_else (|| Ok (self.storage_coordinator.try_get_default_widget () ?. identity)) ?;

์ด๋ฅผ ์œ„ํ•ด ๋น„๊ต๊ฐ€ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒซ์งธ, ? ๋Š” ๋ฉ˜ํƒˆ ๋ชจ๋ธ์„ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ? ์˜ ์„ฑ๊ณต์€ ๋‹จ์–ด ์‚ฌ์ด๋ฅผ ์•ž๋’ค๋กœ ์ ํ”„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์— ์žˆ์Šต๋‹ˆ๋‹ค. ์— ์ฝ์„ ๋•Œ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋Š๋‚Œ ? ์—์„œ .try_get_default_widget()? "์ข‹์•„, ๋‹น์‹ ์€ ๋ช‡ ๊ฐ€์ง€ ์ข‹์€ ๊ทธ๊ฒƒ์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„"์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋‹ค์•ผ. ๋‚˜๋Š”์ด ์ค„์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฒƒ์„ ์ฝ๊ธฐ ์œ„ํ•ด ๋˜๋Œ์•„ ๊ฐˆ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ๋‚ด ์ „๋ฐ˜์ ์ธ ๊ฒฐ๋ก ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ›„์œ„๋Š” ์ผ๋ถ€ ์ œํ•œ๋œ ํŽธ์˜๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๋ฐ ๋” ํฐ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ์“ฐ๊ธฐ๋ณด๋‹ค ๋” ๋นˆ๋ฒˆํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ ๋œ rustfmt ์Šคํƒ€์ผ ๋ฐ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ ( while -> async , match -> await ) :

while fn foo() {
    identity = identity
        .or_else_async(while || {
            self.storage_coordinator
                .get_default_widget_async().match?
                .identity
        }).match?;
}

๋‚˜๋Š” ๋‹น์‹ ์— ๋Œ€ํ•ด ๋ชจ๋ฅด์ง€๋งŒ ์ฆ‰์‹œ match es๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

(Hey @ CAD97 , ๋‚ด๊ฐ€

๋ฟก ๋นต๋€จ

? ๊ฐ€ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ฃผ์žฅํ•œ๋‹ค๋ฉด, await ๊ฐ€ ์ฝ”๋“œ์˜ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์„ ๋ณ€๊ฒฝํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๋‚ด ์ฃผ์žฅ์— ๋ฌด์Šจ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? (์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ด์ „์— ๋ฌต์‹œ์  ๋Œ€๊ธฐ ์˜ต์…˜์„ ์„ ํ˜ธํ–ˆ์ง€๋งŒ Rust์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ํ™•์‹  ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.)

ํŠนํžˆ ํ•จ์ˆ˜ ํ—ค๋”์˜ _beginning_์—์„œ async ๋ฅผ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ์ปค์„œ ํ•œ ํ™”๋ฉด์— ๋งž์ง€ ์•Š์œผ๋ฉด ๊ฑฐ์˜ ํ™•์‹คํžˆ ๋„ˆ๋ฌด ํฌ๊ณ  await ํฌ์ธํŠธ๋ฅผ ์ฐพ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํฐ ๊ฐ€๋…์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

async ์ด๋ฉด ํ•ด๋‹น ์ปจํ…์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์‹œ์ ์—์„œ ๋ชจ๋“  ๊ฒƒ์€ ์ง€์—ฐ๋œ ๊ณ„์‚ฐ Future ๋ฅผ ํ˜„์žฌ ์‹คํ–‰ ๊ธฐ์ฐจ๋ฅผ ํŒŒํ‚นํ•˜์—ฌ Output ๊ฒฐ๊ณผ๋กœ ๋ฐ”๊พธ๋Š” ๋ณ€ํ™˜์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ณต์žกํ•œ ์ƒํƒœ ๋จธ์‹  ๋ณ€ํ™˜์„ ์˜๋ฏธํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. OS ์Šค๋ ˆ๋“œ ๋ฐ ์ฐจ๋‹จ๊ณผ์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ง€์—ฐ๋œ ๊ณ„์‚ฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ฝ”๋“œ๊ฐ€ ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Sync ๋Š” ๊ทธ๋‹ค์ง€ ๋ณดํ˜ธํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. (์–ด์จŒ๋“  async fn ์ด ์ถ”๋ก ๋˜๋Š” ๋Œ€์‹  Send + Sync ์ด๋˜์–ด์•ผํ•˜๊ณ  ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.)

ํ›จ์”ฌ ๋” ๊ธฐ๋Šฅ ์ง€ํ–ฅ์  ์ธ ์Šคํƒ€์ผ์—์„œ ์œ„์ ฏ๊ณผ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (์˜ˆ, ๋ชจ๋‚˜๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ ์ˆœ๋„ ๋“ฑ์„ ์šฉ์„œํ•ฉ๋‹ˆ๋‹ค).

    let widget1 = await(get_default_widget_async(storage_coordinator(self)));
    let result1 = do_some_wierd_computation_on(identity(widget1));
    let widget2 = await(get_default_widget_async(network_coordinator(self)));
    let result2 = do_some_strange_computation_on(identity(widget2));

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ํ”„๋กœ์„ธ์Šค ํŒŒ์ดํ”„ ๋ผ์ธ์˜ ์—ญ์ˆœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋Šฅ์  ๊ตฐ์ค‘์€ "ํŒŒ์ดํ”„ ๋ผ์ธ"์—ฐ์‚ฐ์ž ์ธ |> .

    let widget1 = self |> storage_coordinator |> get_default_widget_async |> await;
    let result1 = widget1 |> identity |> do_some_wierd_computation_on;
    let widget2 = self |> network_coordinator |> get_default_widget_async |> await;
    let result2 = widget2 |> identity |> do_some_strange_computation_on;

๊ทธ๋ฆฌ๊ณ  Rust์—์„œ ํŒŒ์ดํ”„ ๋ผ์ด๋‹ ์—ฐ์‚ฐ์ž๋Š” . ์ด๋ฉฐ, ์ด๋Š” ๋ฉ”์„œ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•ด ํŒŒ์ดํ”„ ๋ผ์ธ ๋ฐ ์œ ํ˜• ์ง€ํ–ฅ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    let widget1 = self.storage_coordinator.get_default_widget_async().await();
    let result1 = widget1.identity.do_some_wierd_computation_on();
    let widget2 = self.network_coordinator.get_default_widget_async().await;
    let result2 = widget2.identity.do_some_strange_computation_on();

. ๋ฅผ |> ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ดํ”„ ๋ผ์ด๋‹ ๋ฐ์ดํ„ฐ๋กœ ์ƒ๊ฐํ•˜๋ฉด Rust์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜์žˆ๋Š” ๋” ๊ธด ์ฒด์ธ์ด ๋” ์ดํ•ด๋˜๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  (Centril์˜ ์˜ˆ์—์„œ์™€ ๊ฐ™์ด) ์ž˜ ํฌ๋งท๋˜๋ฉด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ˆ˜์ง์  ๋ณ€ํ™˜ ํŒŒ์ดํ”„ ๋ผ์ธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋…์„ฑ์„ ๋†“์น˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

await ๋Š” "์ด๊ฑด ๋น„๋™๊ธฐ์‹์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. async ์•Š์Šต๋‹ˆ๋‹ค. await ๋Š” ์ง€์—ฐ๋œ ๊ณ„์‚ฐ์„ ๋Œ€๊ธฐํ•˜๊ณ  ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฉฐ, Rust์˜ ํŒŒ์ดํ”„ ๋ผ์ด๋‹ ์—ฐ์‚ฐ์ž์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

(Hey @Centril ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ async fn (๋˜๋Š” while fn )๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์žŠ์—ˆ์Šต๋‹ˆ๋‹ค.

๋งคํฌ๋กœ ํ˜ธ์ถœ์„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€

m!(item1, item2)

๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

item1.m!(item2)

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ ‘๋‘์‚ฌ ๋ฐ ์ ‘๋ฏธ์‚ฌ ์Šคํƒ€์ผ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

await!(future)

๊ณผ

future.await!()

@ CAD97

await ์€ "์ด๊ฑด ๋น„๋™๊ธฐ์‹"์ด๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. async ์•Š์Šต๋‹ˆ๋‹ค. await ๋Š” ์ง€์—ฐ๋œ ๊ณ„์‚ฐ์„ ๋Œ€๊ธฐํ•˜๊ณ  ๋Œ€๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฉฐ, Rust์˜ ํŒŒ์ดํ”„ ๋ผ์ด๋‹ ์—ฐ์‚ฐ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜, ๋‚ด๊ฐ€ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ด ํ•œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์—„๊ฒฉํ•˜๊ฒŒ ์“ฐ์ง€๋Š” ์•Š์•˜๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๋‹น์‹ ์˜ ์š”์ ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ await ๋ฅผ ์•ž์— ๋‘๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ๋‚˜์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” |> ์ด ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ Rust์—์„œ๋Š” ์ ‘๋‘์‚ฌ await ๋Œ€์‹  ๊ฝค ํ›Œ๋ฅญํ•˜๊ณ  ๋งค์šฐ ๋ช…ํ™• ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

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

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

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

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

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

    Ok(user)
}

์ฝ๊ธฐ ์ˆœ์„œ์— ๋Œ€ํ•œ ์ธ์ˆ˜๋Š” try!() ๋Œ€์‹  ? ์—ฐ์‚ฐ์ž์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, "์ด๊ฑฐ ์ด๊ฑฐ ๋นจ๋ฆฌ ๋Œ์•„์˜ฌ์ง€๋„ ๋ชฐ๋ผ"๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, "์ด๊ฑฐ ์ผ์ฐ ๋Œ์•„์˜ฌ์ง€๋„ ๋ชฐ๋ผ"๋„ ์ค‘์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๊ฐ€์‹œ์„ฑ์— ๋Œ€ํ•œ ์šฐ๋ ค๋Š” ? ( ์ด ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ ๋ฐ ์ด GitHub ๋ฌธ์ œ ํฌํ•จ )์— ๋Œ€ํ•œ ๋ฐ”์ดํฌ ์…ฐ๋“œ ํ† ๋ก ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๊ฒฐ๊ตญ ๊ทธ๊ฒƒ์„ ์Šน์ธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ฒƒ์— ์ต์ˆ™ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ฐ€์‹œ์„ฑ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€์— ๋Œ€ํ•œ ๋งˆ์Œ์„ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‘œํ˜„์‹์˜ ๋ฐ˜๋Œ€ํŽธ์— ? ๋ฐ await ์ˆ˜์‹์–ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์€ ์ด์ƒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ๊ธฐ ์ˆœ์„œ์— ๋Œ€ํ•œ ์ธ์ˆ˜๋Š” try!() ๋Œ€์‹  ? ์—ฐ์‚ฐ์ž์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, "์ด๊ฑฐ ์ด๊ฑฐ ๋นจ๋ฆฌ ๋Œ์•„์˜ฌ์ง€๋„ ๋ชฐ๋ผ"๋„ ์ค‘์š”ํ•˜์ง€๋งŒ, "์ด๊ฑฐ ์ผ์ฐ ๋Œ์•„์˜ฌ์ง€๋„ ๋ชฐ๋ผ"๋„ ์ค‘์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ๊ฐ€์‹œ์„ฑ์— ๋Œ€ํ•œ ์šฐ๋ ค๋Š” ? ( ์ด ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ ๋ฐ ์ด GitHub ๋ฌธ์ œ ํฌํ•จ )์— ๋Œ€ํ•œ ๋ฐ”์ดํฌ ์…ฐ๋“œ ํ† ๋ก ์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๊ฒฐ๊ตญ ๊ทธ๊ฒƒ์„ ์Šน์ธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ  ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๊ฒƒ์— ์ต์ˆ™ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๊ฐ€์‹œ์„ฑ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€์— ๋Œ€ํ•œ ๋งˆ์Œ์„ ๋ณ€๊ฒฝํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ‘œํ˜„์‹์˜ ๋ฐ˜๋Œ€ํŽธ์— ? ๋ฐ await ์ˆ˜์‹์–ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์€ ์ด์ƒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋ธ์ด ์‰ฝ๊ฒŒ ๋นŒ๋“œ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€, ์ถฉ๊ฒฉ์ด ์žˆ๋“  ์—†๋“ , ์ง๊ด€์ ์ด๋“  ์•„๋‹ˆ๋“  ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•œ ์ •์‹ ์  ๋ชจ๋ธ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ํฌ๊ฒŒ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ด์ƒ ํ† ๋ก ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ง€์›ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” postfix ์†”๋ฃจ์…˜์— ์ •์ฐฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๊ฒฐ์ฑ…์ด์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Mozilla๋Š” Firefox๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๊นŒ? UI / UX์— ๊ด€ํ•œ ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค! ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์‹ฌ๊ฐํ•œ HCI ์—ฐ๊ตฌ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ถ”์ธก์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ๋ฅผ ์ •๋ง๋กœ ์„ค๋“ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ dowchris97 ์ด ์Šค๋ ˆ๋“œ์—๋Š” ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋น„๊ตํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ reqwest ์™€ C #์ด . ๋‘˜ ๋‹ค ์‹ค์ œ Rust ์ฝ”๋“œ์—์„œ await in postfix๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ด๋ฉฐ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ฐ’ ์ด๋™ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€์—†๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๋ฌธ์ œ๋ฅผ ๊ฒช์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒฝํ–ฅ์ด์žˆ๋Š” ๋‹ค๋ฅธ ์ ๋‹นํ•œ ํฌ๊ธฐ์˜ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ๋ฐœ๊ฒฌํ•˜์ง€ ์•Š๋Š” ํ•œ, ๋‚˜๋Š” Rust์˜ ํŒŒ์ดํ”„ ๋ผ์ด๋‹ (๊ด€์šฉ์  ์ธ ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ณณ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฑฐ์˜ ํ•ญ์ƒ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.)

ํŽธ์ง‘ : ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ C #, Python, C ++, Javascript์—๋Š” ์ฐธ์กฐ ๋Œ€์‹  ๊ฐ’์œผ๋กœ self ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉค๋ฒ„ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. C ++๋Š” rvalue ์ฐธ์กฐ์™€ ๊ฐ€์žฅ ๊ฐ€๊น์ง€๋งŒ ์†Œ๋ฉธ์ž ์ˆœ์„œ๋Š” Rust์— ๋น„ํ•ด ์—ฌ์ „ํžˆ ํ—ท๊ฐˆ๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” await ๊ฐ€ ์ฝ”๋“œ์˜ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”๊ฐ€์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์ง€๋งŒ ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ๊ฐ€์—†๋Š” ๋ฐฉ๋ฒ•์—์„œ ๋น„๋กฏ๋œ ๊ฒƒ์ด๋ฏ€๋กœ ? ์˜ˆ์‹œ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ์‹œ๊ธธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— await foo() ๊ฐ€ foo() await ๋ณด๋‹ค ์ฝ๊ธฐ๊ฐ€ ๋” ์‰ฝ๋‹ค๊ณ  ๋Š๋ผ๊ณ  ์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ์„ฑ๋ช… ๋์— @ ๋ฅผ ์›ํ•˜๊ณ  await ๊ฐ€์žˆ๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋น„์Šทํ•œ ์ด์œ ๋กœ .await ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๋„ํŠธ ์—ฐ์‚ฐ์ž๋Š” ๊ตฌ์กฐ์ฒด์˜ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (์ด๊ฒƒ์ด ์ˆœ์ˆ˜ํ•œ ํŒŒ์ดํ”„ ๋ผ์ธ ์—ฐ์‚ฐ์ž๋กœ ๋ณผ ์ˆ˜์—†๋Š” ์ด์œ ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค) .await ๋Š” "์ ์€ ๊ตฌ์กฐ์ฒด์˜ ํ•„๋“œ์™€ ๋ฉ”์„œ๋“œ์— ์•ก์„ธ์Šคํ•˜๊ฑฐ๋‚˜ ํ•„๋“œ๋„ ํ•จ์ˆ˜๋„ ์•„๋‹Œ await ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ ‘๋‘์‚ฌ await ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ์‹œ๊ธธ ( @ ์ด ์•„๋‹ˆ์–ด๋„ ๋จ)์„๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‘˜ ๋‹ค ์‹ค์ œ Rust ์ฝ”๋“œ์—์„œ await in postfix๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€์žˆ๋Š” ์ง„์ˆ ์ž…๋‹ˆ๋‹ค. reqwest ์˜ˆ์ œ๋Š” ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์˜ ํ•œ ๋ฒ„์ „ ๋งŒ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฉ”๋ชจ์—์„œ,์ด ํ† ๋ก ์ด ๋ˆ„๊ฐ€ ๋” ์ข‹์•„ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ํˆฌํ‘œ๋กœ ๋‚ด๋ ค ๊ฐ€๋ฉด, ์‚ฌ๋žŒ๋“ค์ด ํ•จ์ˆ˜ ์ธ์ˆ˜์—์„œ impl Trait ์™€ ๊ฐ™์ด ๋ถˆํ‰ํ•˜์ง€ ์•Š๋„๋ก reddit์—์„œ ์–ธ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.

@ eugene2k postfix๊ฐ€ Rust ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์— ์ ํ•ฉํ•œ ์ง€์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ๋…ผ์˜๋ฅผ ์œ„ํ•ด, ๋Œ€๋ถ€๋ถ„ ๋˜๋Š” ๋ชจ๋“  postfix ๊ตฌ๋ฌธ์€ ์ ‘๋‘์‚ฌ์— ๋น„ํ•ด ๋Œ€๋žต ๊ฐ™์€ ๊ทœ๋ชจ์ž…๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ ์‚ฌ์ด๋งŒํผ ์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜• ์‚ฌ์ด์—๋Š” ๊ฐ€๋…์„ฑ ์ฐจ์ด๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์—์„œ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ๋Š” ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„์˜ ์ €์ˆ˜์ค€ ๋น„๊ต๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค . ๋”ฐ๋ผ์„œ ์–ด๋–ค ์—ฐ์‚ฐ์ž๊ฐ€ ์˜๋ฏธ๋ฅผ ๊ฐ€์žฅ ์ž˜ ์ „๋‹ฌํ•˜๋Š”์ง€๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค (ํ˜„์žฌ ์‹ค์ œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ์„ ํ˜ธ๋„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค).

@ eugene2k Rust์˜ ๊ฒฐ์ •์€ ํˆฌํ‘œ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Rust๋Š” ๋ฏผ์ฃผ์ฃผ์˜๊ฐ€ ์•„๋‹ˆ๋ผ ๋Šฅ๋ ฅ์ฃผ์˜์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ / ์–ธ์–ด ํŒ€์€ ๋ชจ๋“  ๋‹ค์–‘ํ•œ ์ฃผ์žฅ๊ณผ ๊ด€์ ์„๋ณด๊ณ  ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์€ ํˆฌํ‘œ๊ฐ€ ์•„๋‹Œ ํ•ฉ์˜์— ์˜ํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

Rust ํŒ€์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์˜ ์ „๋ฐ˜์ ์ธ ์š•๊ตฌ๋ฅผ ์ ˆ๋Œ€์ ์œผ๋กœ ๊ณ ๋ คํ•˜์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ์žฅ๊ธฐ์ ์œผ๋กœ Rust์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€์— ๋”ฐ๋ผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Rust์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์ œ์‹œํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ์ฃผ์žฅ์„ํ•˜๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ๊ด€์ ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ ์ฃผ์žฅ์„ ๋ฐ˜๋ณตํ•˜๊ฑฐ๋‚˜ "๋‚˜๋„"(๋˜๋Š” ์œ ์‚ฌ)๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์ œ์•ˆ์ด ์ˆ˜๋ฝ ๋  ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ด ์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ์ธ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ œ์•ˆ์€ ์ ˆ๋Œ€๋กœ ์ˆ˜๋ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Š” ๋˜ํ•œ์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค์–‘ํ•œ ์—… ๋ณดํŠธ / ๋‹ค์šด ๋ณดํŠธ๊ฐ€ ์–ด๋–ค ์ œ์•ˆ์ด ์ˆ˜๋ฝ๋˜๋Š”์ง€ ์ „ํ˜€ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

(๋‚˜๋Š” ๋‹น์‹ ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ผ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

@Pauan ํ•ต์‹ฌ / ์–ธ์–ด ํŒ€์ด ๋‹ค์–‘ํ•œ ์ œ์•ˆ์„๋ณด๊ณ  ๊ฒฐ์ •์„

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ํŒ€์˜ ์˜์‚ฌ ๊ฒฐ์ •์ž๊ฐ€ ํ•˜๋‚˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ข‹์•„ํ•˜๊ณ  ํŒ€์— ์žˆ์ง€ ์•Š์€ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ข‹์•„ํ•œ๋‹ค๋ฉด ์ตœ์ข… ๊ฒฐ์ •์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฒฐ์ •์€ ํ•ญ์ƒ ํŒ€์— ์˜ํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๊ธฐ๊ฐ„. ์ด๊ฒƒ์ด ๊ทœ์น™์ด ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋Šฅ์€ ์ข…์ข… ํŒ€ ๊ตฌ์„ฑ์›์ด ๊ตฌํ˜„ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํŒ€์›๋“ค์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋‚ด์—์„œ ์‹ ๋ขฐ๋ฅผ ์Œ“์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋“ค์€ ๋ฒ•์  ๊ถŒํ•œ๊ณผ ์‚ฌ์‹ค์ƒ ๊ถŒํ•œ์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํ™ฉ์ด ๋ฐ”๋€Œ๊ณ  (์•„๋งˆ๋„ ํ”ผ๋“œ๋ฐฑ์— ๋”ฐ๋ผ) ํŒ€ ๊ตฌ์„ฑ์›์ด ๋งˆ์Œ์„ ๋ฐ”๊พธ๋ฉด ๊ฒฐ์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ž˜๋„ ๊ฒฐ์ •์€ ํ•ญ์ƒ ํŒ€์›์ดํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด, ๊ฒฐ์ •์€ ์ข…์ข… ์–ด๋Š ์ •๋„์˜ ์ฃผ๊ด€์„ฑ์„ ์ˆ˜๋ฐ˜ํ•˜๋ฏ€๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๊ธฐ์˜๊ฒŒํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ์ •์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด Rust๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์€ ํ•ฉ์˜์— ๋„๋‹ฌ ํ•œ ํŒ€์›์„ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

Rust ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๊ด€๋ฆฌ

(์ถ”์‹  : ์ €๋Š” ํ•ต์‹ฌ ํŒ€์ด๋‚˜ ๋žญ ํŒ€์— ์†ํ•ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—์ด ๊ฒฐ์ •์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ทธ๋“ค์—๊ฒŒ ์—ฐ๊ธฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค)

์•ˆ๋…•ํ•˜์„ธ์š”.

๋‚˜๋Š” ์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜• ์‚ฌ์ด์— ๊ฐ€๋…์„ฑ์ด ํฌ๊ฒŒ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. foo().await()?.bar().await()? ๊ฐ€ foo() await?.bar() await? ๋˜๋Š” foo()@?.bar()@? ๋ณด๋‹ค ์ฝ๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‹ค์ œ๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ ๋ฉ”์„œ๋“œ๋Š” ๋‚˜์œ ์„ ๋ก€๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์•„์ด๋””์–ด๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ await๊ฐ€ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ : foo(){await}?.bar()?{await} ? ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ํ˜ผ๋™ ํ•  ์ˆ˜์—†๊ณ  ์ฒด์ธ์—์„œ ์ฝ์„ ์ˆ˜์žˆ์„๋งŒํผ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜์— ์˜ํ•ด ์ž‘์„ฑ๋œ ๋˜ ๋‹ค๋ฅธ ์ œ์•ˆ. ๋‹ค์Œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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

    Ok(user)
}

๋‹ค๋ฅธ ์ œ์•ˆ ์ค‘์—์„œ ๊ณ ์œ  ํ•œ ์  :

  • ๋Œ€๊ด„ํ˜ธ๋Š” ์šฐ์„  ์ˆœ์œ„์™€ ๋ฒ”์œ„๋ฅผ ํ›จ์”ฌ ๊น”๋”ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ๊ตฌ๋ฌธ์€ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ๋„ ์ž„์‹œ ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถฉ๋ถ„ํžˆ ํ™•์žฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” ํ™•์žฅ ์„ฑ์ด ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ๋†’์€ ๋ณต์žก์„ฑ / ์œ ์šฉ์„ฑ ๋น„์œจ๋กœ ์ธํ•ด Rust์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ณตํ†ต ํ˜•ํƒœ์˜ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์–ธ์–ด ๊ตฌ์กฐ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž ์—ฐ๊ธฐ ( await -์ž‘๋™ ๋ฐฉ์‹) :
let result = api.method().[await returns_future()];
let cond = long.method().chain().[!is_empty()];
let val = something.[*returns_ref()];
  1. ํŒŒ์ดํ”„ ๋ผ์ธ ์—ฐ์‚ฐ์ž ๊ธฐ๋Šฅ :
// from https://users.rust-lang.org/t/pipe-results-like-elixir/11175/19
let deserialized: DataType =
    Path::new("path/to/file.json")
        .[File::open(&it)].expect("file not found")
        .[serde_json::from_reader(it)].expect("error while reading json");
  1. ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์žฌ์ •์˜ :
let sorted_vec = iter
    .map(mapper)
    .collect::<Vec<_>>()
    .[sort(),];
  1. ์œ„๋” ๊ธฐ๋Šฅ :
consume(&HashMap::new(). [
    insert("key1", val1),
    insert("key2", val2),
]);
  1. ์ฒด์ธ ๋ถ„ํ•  :
let sf = surface(). [
    draw_circle(ci_dimens).draw_rectangle(rect_dimens).finish()?,
    draw_something_custom().finish()?,
];
  1. ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ :
let x = long().method().[dbg!(it)].chain();

์ƒˆ๋กœ์šด ์ข…๋ฅ˜์˜ ๊ตฌ๋ฌธ (๋งค์ง ํ•„๋“œ, ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ, ๋Œ€๊ด„ํ˜ธ)์„ ๋„์ž…ํ•˜๋ฉด์ด ๊ธฐ๋Šฅ ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์–ธ์–ด์— ๋” ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ RFC๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ await ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ œ์•ˆ ๋œ ๋ชจ๋“  ์Šคํƒ€์ผ์—์„œ ๋” ํฐ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€, ์ฝ”๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ง€ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

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

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

    Ok(user)
}

await!() ์™€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ฆ„๋‹ต๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค! await!() ๋ฅผ 1 ~ 2 ๋…„ ๋™์•ˆ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์™œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์—ญ์‚ฌ์ƒ ์–ด๋””์—๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š” ์ ‘๋ฏธ์‚ฌ await๋ฅผ ๊ฐ‘์ž๊ธฐ ๋งŒ๋“ค์—ˆ ์„๊นŒ์š”?

ํ—ˆ. ์ƒํ™ฉ์— ๋งž๋Š” it ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” @ I60R ์˜ expr.[await it.foo()] ๊ตฌ๋ฌธ์€ ๋งค์šฐ ๊น”๋”ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ‹์ง„ ์ƒˆ ๊ตฌ๋ฌธ ์ œ์•ˆ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ ์ •๋ง ํ›Œ๋ฅญํ•˜๊ณ  ๊ตฌ๋ฌธ ๊ณต๊ฐ„์„ ์˜๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค (IIRC .[ ๋Š” ํ˜„์žฌ ์–ด๋””์„œ๋‚˜ ์œ ํšจํ•œ ๊ตฌ๋ฌธ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

RFC๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ–ˆ์œผ๋ฉฐ ์ตœ์„ ์˜ ์„ ํƒ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹น๋ถ„๊ฐ„์€ await ๋Œ€ํ•œ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ์ •ํ•˜๋Š” ์ธก๋ฉด์—์„œ ๋˜ ๋‹ค๋ฅธ ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. "์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๋Š” ์—ฐ๊ฒฐํ•˜๊ธฐ ์–ด์ƒ‰ํ•˜๋‹ค"๋ผ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฏธ๋ž˜์— ๋น„๋™๊ธฐ / ๋Œ€๊ธฐ๋ณด๋‹ค ๋” ๋งŽ์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜์— ์˜ํ•ด ์ž‘์„ฑ๋œ ๋˜ ๋‹ค๋ฅธ ์ œ์•ˆ. ๋‹ค์Œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

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

    Ok(user)
}

๋‹ค๋ฅธ ์ œ์•ˆ ์ค‘์—์„œ ๊ณ ์œ  ํ•œ ์  :

* Square brackets makes precedence and scoping much cleaner.

* Syntax is extensible enough to allow temporary bindings removal in other contexts as well.

์—ฌ๊ธฐ์„œ๋Š” ํ™•์žฅ ์„ฑ์ด ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ๋†’์€ ๋ณต์žก์„ฑ / ์œ ์šฉ์„ฑ ๋น„์œจ๋กœ ์ธํ•ด Rust์—์„œ ๊ณตํ†ต ํ˜•ํƒœ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•œ ์–ธ์–ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์–ธ์–ด ๊ตฌ์กฐ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. Deferring of all prefix operators (including `await` - it's how it supposed to work):
let result = api.method().[await returns_future()];
let cond = long.method().chain().[!is_empty()];
let val = something.[*returns_ref()];
1. Pipeline operator functionality:
// from https://users.rust-lang.org/t/pipe-results-like-elixir/11175/19
let deserialized: DataType =
    Path::new("path/to/file.json")
        .[File::open(&it)].expect("file not found")
        .[serde_json::from_reader(it)].expect("error while reading json");
1. Overriding function return:
let sorted_vec = iter
    .map(mapper)
    .collect::<Vec<_>>()
    .[sort(),];
1. Wither functionality:
consume(&HashMap::new(). [
    insert("key1", val1),
    insert("key2", val2),
]);
1. Chain splitting:
let sf = surface(). [
    draw_circle(ci_dimens).draw_rectangle(rect_dimens).finish()?,
    draw_something_custom().finish()?,
];
1. Postfix macros:
let x = long().method().[dbg!(it)].chain();

์ •๋ง ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@tajimaha ๊ท€ํ•˜์˜ ์˜ˆ๋ฅผ ๋ณด๋ฉด, ๊ฐ€๋…์„ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜์žˆ๋Š” "๋Œ€๊ด„ํ˜ธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Œ"๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ await {} ๊ฐ€ ์‹ค์ œ๋กœ await!() ๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. await!() ๊ตฌ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„๊ต:
```c #
await {foo.bar (url, false, qux.clone ())};

```c#
await!(foo.bar(url, false, qux.clone()));

(ps ์–ธ์–ด๋ฅผ c #์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์˜ˆ์˜ ๊ฒฝ์šฐ async ๋ฐ await ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

@nicoburns ๋งคํฌ๋กœ ์™€ ํ•จ๊ป˜ () , {} ๋˜๋Š” [] ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@sgrif ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์— "ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ ํ‚ค์›Œ๋“œ"๋Š” ์˜ต์…˜์œผ๋กœ ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฌด๋Ÿฐ ์ด์ ๋„์—†์ด ๋‹ค๋ฅธ ๋งคํฌ๋กœ์™€์˜ ์ผ๊ด€์„ฑ์„ ๊นจ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

(FWIW, ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” "๊ตฌ๋ถ„์ž๊ฐ€์—†๋Š” ์ ‘๋‘์‚ฌ"๋‚˜ ์ ‘๋ฏธ์‚ฌ์— ๋Œ€ํ•œ @ I60R ์˜ ์ œ์•ˆ์ด ๊ฐ€์žฅ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ "๊ธฐ์กด ๋งคํฌ๋กœ๋ฅผ ๊ณ ์ˆ˜ํ•˜์‹ญ์‹œ์˜ค"์˜ต์…˜์ด ์ ์  ์ปค์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...)

"ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ"๋Š” ์˜ต์…˜์œผ๋กœ ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฌด๋Ÿฐ ์ด์ ๋„์—†์ด ๋‹ค๋ฅธ ๋งคํฌ๋กœ์™€์˜ ์ผ๊ด€์„ฑ์„ ๊นจ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์™œ ๋ง์ด ์•ˆ๋˜๊ณ  ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋ฌธ์ œ๊ฐ€๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํƒ€์ง€ ๋งˆํ•˜

"ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ์ ‘๋‘์–ด ํ‚ค์›Œ๋“œ"๋Š” ์˜ต์…˜์œผ๋กœ ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ฌด๋Ÿฐ ์ด์ ๋„์—†์ด ๋‹ค๋ฅธ ๋งคํฌ๋กœ์™€์˜ ์ผ๊ด€์„ฑ์„ ๊นจ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์™œ ๋ง์ด ์•ˆ๋˜๊ณ  ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€์ง€ ์•Š๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋ฌธ์ œ๊ฐ€๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

await ๊ฐ€ ๋งคํฌ๋กœ๋ผ๋ฉด ์–ธ์–ด์— ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ธ์–ด์˜ ๋ณต์žก์„ฑ์„ ์ค„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ข‹์€ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค : return , break , continue , ๊ธฐํƒ€ ์ œ์–ด ํ๋ฆ„ ์ˆ˜์ • ๊ตฌ๋ฌธ๋„ ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋“ค์€ ๋ชจ๋‘ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ์—†์ด ์ž‘๋™ํ•˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์™€ ์ผ์น˜ํ•˜๋ ค๋ฉด await ๋„ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ์—†์ด ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

await-with-mandatory ๊ตฌ๋ถ„์ž๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

// Macros using `macro!(foo);` syntax 
format!("{}", foo);
println!("hello world");

// Normal keywords using `keyword foo;`
continue foo;
return foo;

// *and* the await keyword which is kind of in between the other two syntaxes:
await(foo);
await{foo};

2๊ฐ€ ์•„๋‹Œ 3 ๊ฐœ์˜ ๊ตฌ๋ฌธ ํ˜•์‹์„ ๊ธฐ์–ตํ•ด์•ผํ•˜๋ฏ€๋กœ ์ž ์žฌ์ ์œผ๋กœ ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๋ณด๋Š” ๊ฒƒ์€ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์— ๋น„ํ•ด ์–ด๋–ค ์ด์ ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€์„ ๊ณ ์ˆ˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์ ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋งคํฌ๋กœ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (์ด๋ ‡๊ฒŒํ•ด์•ผํ•œ๋‹ค๊ณ  ์ „ํ˜€ ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์˜ค๋Š˜๋‚  Rust์—์„œ async / await๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„์œ„ํ•œ ์งˆ๋ฌธ : ํ•จ์ˆ˜ / ๋ฉ”์„œ๋“œ ๋Œ€ ๋ณ€์ˆ˜ / ํ•„๋“œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌธ๋งฅ:

C #์—์„œ๋Š”์ด ํŒจํ„ด์œผ๋กœ ์š”์•ฝ๋˜๋Š” ์ผ์„ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

var fooTask = this.FooAsync();
var bar = await this.BarAsync();
var foo = await fooTask;

๊ทธ๋Ÿฌ๋ฉด ๋‘˜ ๋‹ค ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. (์ผ๋ถ€๋Š” ์—ฌ๊ธฐ์„œ Task.WhenAll ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์ž‘์œผ๋ฉฐ ๋ฐฐ์—ด ์ธ๋ฑ์Šค๋ฅผ ๊ฑฐ์ณ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๋” ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜ Rust์—์„œ๋Š” poll ๋Œ€ํ•œ fooTask ๊ฐ€ bar ์˜ ๊ฐ’์„ ์–ป์„ ๋•Œ๊นŒ์ง€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ์ „ํ˜€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด _ ํ•„์š”

let (foo, bar) = when_all!(
    self.foo_async(),
    self.bar_async(),
).await;

๊ทธ๋ž˜์„œ ์ €๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ๊ธฐ๋‹ค๋ ค์•ผํ•˜๋Š” ๋ณ€์ˆ˜ ๋‚˜ ํ•„๋“œ์—์„œ ์ •๊ธฐ์ ์œผ๋กœ ๋ฏธ๋ž˜๋ฅผ ๊ฐ–๊ฒŒ๋˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๊ฑฐ์˜ ํ•ญ์ƒ ํ˜ธ์ถœ ํ‘œํ˜„์‹์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž ์ธ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ๋…ผ์˜ํ•˜์ง€ ์•Š์€ postfix ํ‚ค์›Œ๋“œ์˜ ์ž‘์€ ํ˜•์‹ํ™” ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. postfix ํ‚ค์›Œ๋“œ _no-space_.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ข‹์€์ง€์— ๋Œ€ํ•ด๋ณ„๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

(๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์‹ค์ œ๋กœ rustfmt ํ† ๋ก ์„ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ postfix ํ‚ค์›Œ๋“œ๋ฅผ ์‹ซ์–ดํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ์‹œ๊ฐ์  ๋ฉ์–ด๋ฆฌ๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” ๊ณต๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค.)

๊ทธ๋ ‡๊ฒŒํ•œ๋‹ค๋ฉด .await ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ
์ ์˜ ํž˜, ์•„๋‹ˆ?

์˜ค๋Š˜๋‚  Rust์—์„œ async / await๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„์œ„ํ•œ ์งˆ๋ฌธ : ํ•จ์ˆ˜ / ๋ฉ”์„œ๋“œ ๋Œ€ ๋ณ€์ˆ˜ / ํ•„๋“œ๋ฅผ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ Rust์—์„œ ์‹ค์ œ๋กœ ์ „ํ˜€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ...]

์˜ณ์€. ์ด์ „๊ณผ ๋™์ผํ•œ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ์ด ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

let self__ = self_.clone();
let responses: Vec<Response> = {
    let futures = all_ids.into_iter().map(move |id| {
        self__.request(URL, Method::GET, vec![("info".into(), id.into())])
            .and_then(|mut response| response.json().from_err())
    });

    await!(futures_unordered(futures).collect())?
};

async ํด๋กœ์ €๋กœ ํด๋กœ์ €๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•œ๋‹ค๋ฉด :

let self__ = self_.clone();
let responses: Vec<Response> = {
    let futures = all_ids.into_iter().map(async move |id| {
        let mut res =
            await!(self__.request(URL, Method::GET, vec![("info".into(), id.into())]))?;

        Ok(await!(res.json())?)
    });

    await!(futures_unordered(futures).collect())?
};

.await ๊ตฌ๋ฌธ์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด (๊ทธ๋ฆฌ๊ณ  ํ•จ๊ป˜ ์—ฐ๊ฒฐ) :

let self__ = self_.clone();
let responses: Vec<Response> =
    futures_unordered(all_ids.into_iter().map(async move |id| {
        Ok(self__
            .request(URL, Method::GET, vec![("info".into(), id.into())]).await?
            .json().await?)
    }))
    .collect().await?;

์ด๋ฏธ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ €์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ์ œ์•ˆ ๋œ ์Šคํƒ€์ผ์—์„œ ๋” ํฐ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๊ฒ ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

@gralpli ์•ˆํƒ€๊น๊ฒŒ๋„, await! ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค๋Š” ์—†์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค (ํŠนํžˆ ๋งค์šฐ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค).

let self__ = self_.clone();
let responses: Vec<Response> =
    futures_unordered(all_ids.into_iter().map(async move |id| {
        Ok(self__
            .request(URL, Method::GET, vec![("info".into(), id.into())]).await?
            .json().await?)
    }))
    .collect().await?;

์ด ์ค„์€ postfix ์™€ chaining ์„ ๋‚จ์šฉํ•˜์—ฌ ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—‰๋ง์ด๋˜์—ˆ๋Š”์ง€ ์ •ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ ‘๋‘์‚ฌ ๋ฒ„์ „์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

let func = async move |id| {
    let req = await { self.request(URL, Method::GET, vec![("info".into(), id.into())]) }?;
    Ok(await(req.json())?)
}
let responses: Vec<Response> = await {
    futures_unordered(all_ids.into_iter().map(func)).collect()
}?;

๋‘ ๋ฒ„์ „์€ ๋ชจ๋‘ 7 ์ค„์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ IMO๋Š” ๋‘ ๋ฒˆ์งธ ๋ฒ„์ „์ด ๋” ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค. ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ์š”์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. future ๋ถ€๋ถ„์ด ๊ธธ๋ฉด await { future }? ๊ฐ€ ์‹œ๋„๋Ÿฌ์›Œ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. let req = await { self.request(URL, Method::GET, vec![("info".into(), id.into())]) }?;
  2. ์ค„์ด ์งง์œผ๋ฉด await(future) ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Ok(await(req.json())?)

IMO๋Š” ๋‘ ๋ณ€ํ˜• ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•จ์œผ๋กœ์จ์ด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์ด์ „๋ณด๋‹ค ํ›จ์”ฌ ๋‚ซ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์˜ˆ๋Š” ํ˜•์‹์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” rustfmt๊ฐ€ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.
๊ทธ. rustfmt๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์—ฌ๊ธฐ์— ๋‹ค์‹œ ๊ฒŒ์‹œ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@ivandardi @mehcode ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? .await ๊ตฌ๋ฌธ ํ˜•์‹์„ ์–ด๋–ป๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

์ด ์˜ˆ์ œ๊ฐ€ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ‹์ง€๊ณ  ๋‹จ์ˆœํ•œ ์ฒด์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.
client.get("https://my_api").send().await?.json().await?
  1. ์‚ฌ๋žŒ๋“ค์€ ์ฒด์ธ์„ ๋‚จ์šฉํ•˜๊ฑฐ๋‚˜ ์˜ค์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
let responses: Vec<Response> =
    futures_unordered(all_ids.into_iter().map(async move |id| {
        Ok(self__
            .request(URL, Method::GET, vec![("info".into(), id.into())]).await?
            .json().await?)
    }))
    .collect().await?;

์—ฌ๊ธฐ์—์„œ ๋น„๋™๊ธฐ ํด๋กœ์ €๋Š” ๋ชจ๋“  ID๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์ปจํŠธ๋กค futures_unordered ์™€๋Š” ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์„ ํ•ฉ์น˜๋ฉด ๊ทธ๊ฒƒ์„ ์ดํ•ดํ•˜๋Š” ๋Šฅ๋ ฅ์ด ํฌ๊ฒŒ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์€ ๋‚ด ๊ฒŒ์‹œ๋ฌผ์—์„œ rustfmt ๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค (์ปดํŒŒ์ผ์„์œ„ํ•œ ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ ํฌํ•จ). .await? ๋ฐฐ์น˜ ์œ„์น˜๋Š” ์•„์ง ๊ฒฐ์ •๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ํ˜„์žฌ ๊ธฐ๋‹ค๋ฆฌ๊ณ ์žˆ๋Š” ๋ผ์ธ์˜ ๋์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.


์ด์ œ ๋‚˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๊ฝค ๋”์ฐํ•ด ๋ณด์ธ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งˆ๊ฐ์ผ์— ์ž‘์„ฑ๋œ ์ฝ”๋“œ์ด๋ฉฐ ์š”๋ฆฌ์‚ฌ๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๊บผ๋‚ด๋ ค๊ณ  ํ•  ๋•Œ ๋”์ฐํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” (๋‹น์‹ ์˜ ๊ด€์ ์—์„œ) ๋‚จ์šฉ ์ ‘๋‘์–ด๊ฐ€ ํ›จ์”ฌ ๋” ๋‚˜๋น  ๋ณด์ผ ์ˆ˜ ์žˆ์Œ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค (๋ฌผ๋ก  ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š”).

let responses: Vec<Response> = await!(futures_unordered(all_ids.into_iter().map(async move |id| {
    Ok(await!(await!(self__
        .request(URL, Method::GET, vec![("info".into(), id.into())]))?
        .json())?)
}))
.collect())?;

์ด์ œ ๋ฏธ๋ž˜ v0.3์˜ ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

"๋ช…๋ฐฑํ•œ"์šฐ์„  ์ˆœ์œ„๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ (๋ฐ ์„คํƒ•)
let responses: Vec<Response> = await? stream::iter(all_ids)
    .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
    .and_then(|mut res| res.json().err_into())
    .try_buffer_unordered(10)
    .try_collect();
"์œ ์šฉํ•œ"์ ‘๋‘์‚ฌ
let responses: Vec<Response> = await stream::iter(all_ids)
    .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
    .and_then(|mut res| res.json().err_into())
    .try_buffer_unordered(10)
    .try_collect()?;
ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ
let responses: Vec<Response> = await {
    stream::iter(all_ids)
        .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
        .and_then(|mut res| res.json().err_into())
        .try_buffer_unordered(10)
        .try_collect()
}?;
์ ‘๋ฏธ์‚ฌ ํ•„๋“œ
let responses: Vec<Response> = stream::iter(all_ids)
    .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
    .and_then(|mut res| res.json().err_into())
    .try_buffer_unordered(10)
    .try_collect().await?;
์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ
let responses: Vec<Response> = stream::iter(all_ids)
    .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
    .and_then(|mut res| res.json().err_into())
    .try_buffer_unordered(10)
    .try_collect() await?;

์—ฌ๊ธฐ์— ์‚ฌ์†Œํ•œ ๋‹ˆํŠธ. TryStreamExt::and_then ) ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์€ ์‹œ๊ฐ„์ด์žˆ๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ํ™๋ณด ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.


  • ๋‚˜๋Š” ๋‹ค์‹œ ๋‚ด ๊ฐ•๋ ฅํ•œ ์‹ซ์–ดํ•˜๋Š” ํ‘œํ˜„ํ•˜๋ ค๋ฉด await? ์˜ ๊ธด ์‚ฌ์Šฌ์—์„œ ๋‚˜๋Š” ์™„์ „ํžˆ ์žƒ๊ฒŒ ํŠธ๋ž™ ? ์ด ํ‘œํ˜„์ž„์„ ๋‚˜ํƒ€ ๋‚ด๊ธฐ ์œ„ํ•ด ๋‚˜๋Š” ํ‘œํ˜„์˜ ๋์„ ์ฐพ์•„ ์„ฑ์žฅ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ _ ๊ธฐ๋Šฅ์„ ์ข…๋ฃŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค _.

  • ๋‚˜๋Š” ๋” ๋‚ด ์„ฑ์žฅ ์‹ซ์–ดํ•˜๋Š” ํ‘œํ˜„ํ•˜๋ ค๋ฉด await .... ? ๋กœ ์šฐ๋ฆฌ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚  ์ง€ ์ƒ๊ฐ (์œ ์šฉ ์šฐ์„ ) fn foo() -> Result<impl Future<Output = Result<_>>>

    // Is this an error? Does`await .. ?` bind outer-most to inner?
    await foo()??
    

๋‚˜๋Š” (๋‹น์‹ ์˜ ๊ด€์ ์—์„œ) ๋‚จ์šฉ ์ ‘๋‘์–ด๊ฐ€ ํ›จ์”ฌ ๋” ๋‚˜๋น  ๋ณด์ผ ์ˆ˜ ์žˆ์Œ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค (๋ฌผ๋ก  ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š”).

let responses: Vec<Response> = await!(futures_unordered(all_ids.into_iter().map(async move |id| {
    Ok(await!(await!(self__
        .request(URL, Method::GET, vec![("info".into(), id.into())]))?
        .json())?)
}))
.collect())?;

ํŒŒ์ด์ฌ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ณ„๋„์˜ ์ค„๋กœ ์ž‘์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํŒŒ์ด์ฌ์—์„œ await (await f) ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ

let responses: Vec<Response> = await {
    stream::iter(all_ids)
        .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
        .and_then(|mut res| res.json().err_into())
        .try_buffer_unordered(10)
        .try_collect()
}?;

์ด๊ฒƒ์€ ๋˜ํ•œ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ์•„์˜จ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. async / await ๋„์ž…์˜ ์š”์ ์€ ์ ์ ˆํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๊ทธ๊ฒƒ์ด ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์š”์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Rust์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์€ Rust๊ฐ€ ์—ฐ๊ฒฐ์„ ์žฅ๋ คํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ค„๋กœ ์ž‘์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์œ„ํ•ด, ๋ช…๋ น์–ด์˜ ํ๋ฆ„์ด ๋™์ผํ•œ ํ–‰ ์ฝ๊ธฐ ํ๋ฆ„์„ ๋”ฐ๋ฅด๋„๋ก ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์€ ๋ณธ์งˆ์ ์œผ๋กœ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์ด ์—†์œผ๋ฉด ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์ž„์‹œ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์žˆ์œผ๋ฉด ๋ชจ๋‘ ๋‹จ์ผ ์ฒด์ธ์œผ๋กœ ์ถ•์†Œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@ivandardi @mehcode ๋น„๋™๊ธฐ / ๋Œ€๊ธฐ์‹œ Rust RFC์—์„œ ๋ณต์‚ฌ :

๋ฏธ๋ž˜ ๊ธฐ๋ฐ˜ ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ๊ฒฝํ—˜๊ณผ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์„ ์–ป์€ ํ›„ ์šฐ๋ฆฌ๋Š” ํŠน์ • ์ธ์ฒด ๊ณตํ•™์  ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ์ง€์ ์—์„œ ๊ณต์œ ํ•ด์•ผํ•˜๋Š” ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๋น„์ธ๊ฐ„์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. Arcs ๋˜๋Š” join chaining์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  combinator๋Š” ๋ฏธ๋ž˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ธ์ฒด ๊ณตํ•™์  ์ด์—ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ค‘์ฒฉ ๋ฐ ์ฒด์ธ ์ฝœ๋ฐฑ ์ง‘ํ•ฉ์ด ๋ณต์žกํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

... async ๋ฐ await ํ‚ค์›Œ๋“œ ์ธ async IO์™€ ํ•จ๊ป˜ ๋งŽ์€ ์–ธ์–ด์—์„œ ์ผ๋ฐ˜์ ์ด ๋œ ๊ตฌ๋ฌธ ์„คํƒ•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋น„๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ async / await๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•จ์ˆ˜์™€ ํ˜ธ์ถœ์— ์ฃผ์„์„ ๋‹ฌ๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ async await๋ฅผ ๋„์ž…ํ•˜๋Š” ์š”์ ์€ ์ฒด์ธ์„ ์ค„์ด๊ณ  ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ sync ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋งŒ๋“œ๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ฒด์ธ์€์ด RFC์—์„œ "ํ˜ธ ๋˜๋Š” ์กฐ์ธ ์ฒด์ธ์ด ํ•„์š”ํ•จ"๊ณผ "์—ฌ์ „ํžˆ ์ข…์ข… ๋ณต์žกํ•œ ์ค‘์ฒฉ ๋ฐ ์ฒด์ธ ์ฝœ๋ฐฑ ์„ธํŠธ๋กœ ์ด์–ด์ง„๋‹ค"๋Š” ๋‘ ๋ฒˆ๋งŒ ์–ธ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ๊ธ์ •์ ์œผ๋กœ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ์„ ์ฃผ์žฅํ•˜๊ณ  ๋”ฐ๋ผ์„œ postfix ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด์ด RFC๋ฅผ ๋Œ€๋Œ€์ ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@tajimaha RFC๋ฅผ ์˜คํ•ดํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ํ“จ์ฒ˜ ์ปด๋น„ ๋„ค์ดํ„ฐ ( map , and_then ๋“ฑ)์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ฒด์ธ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์˜ˆ : impl Future ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ).

async ๋ฉ”์„œ๋“œ๊ฐ€ ๋งค์šฐ ์ผ๋ฐ˜์  ์ผ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์—ฐ๊ฒฐ์€ ์‹ค์ œ๋กœ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜คํ•ดํ•ฉ๋‹ˆ๋‹ค. RFC๋ฅผ ๋‹ค์‹œ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. RFC๋Š” ์‹œ์ž‘์ ์ด์ง€๋งŒ ์‚ฌ์–‘์€ ์•„๋‹™๋‹ˆ๋‹ค. RFC ์ค‘ ์–ด๋–ค ๊ฒƒ๋„ ํ™•์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค (๊ทธ๋Ÿด ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค!).

RFC ํ”„๋กœ์„ธ์Šค๋Š” ์œ ๋™์ ์ด๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ์•”์‹œํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ์—„๊ฒฉํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. RFC์˜ ์–ด๋–ค ๊ฒƒ๋„ await ์ ‘๋ฏธ์‚ฌ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์›๋ž˜ RFC (์ด๋ฏธ ์Šน์ธ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ)๊ฐ€ ์•„๋‹Œ ์•ˆ์ •ํ™” RFC์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์—ฐ๊ฒฐ์„ ์ฃผ์žฅํ•˜๊ณ  ๋”ฐ๋ผ์„œ postfix ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด์ด RFC๋ฅผ ๋Œ€๋Œ€์ ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋†๋‹ด์ž…๋‹ˆ๋‹ค.

RFC๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ•œ ๊ฐ€์ง€๋Š” ์•„๋งˆ๋„ ์‚ฌ์‹ค ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ํŠนํžˆ "๋™๊ธฐ ์ฝ”๋“œ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ / ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š”"์ƒˆ๋กœ์šด ๋„๊ตฌ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์„ ๋”ฐ๋ฅด๋Š” ์ „ํ†ต์€์ด ์•ฝ์†์„ ๋” ์ž˜ ์ถฉ์กฑ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์—ฌ๊ธฐ ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋ฏธ๋ž˜์˜ ๊ฒฐํ•ฉ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

let responses: Vec<Response> =
    futures_unordered(all_ids.into_iter().map(async move |id| {
        Ok(self__
            .request(URL, Method::GET, vec![("info".into(), id.into())]).await?
            .json().await?)
    }))
    .collect().await?;

๊ทธ๋Ÿฌ๋‚˜ "๊ทธ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ข…์ข… ๋ณต์žกํ•œ ์ค‘์ฒฉ ๋ฐ ์ฒด์ธ ์ฝœ๋ฐฑ ์„ธํŠธ๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค."

์‚ฌ๋žŒ๋“ค์€ ํŠนํžˆ "๋™๊ธฐ ์ฝ”๋“œ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ / ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š”"์ƒˆ๋กœ์šด ๋„๊ตฌ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ์„ ๋”ฐ๋ฅด๋Š” ์ „ํ†ต์€์ด ์•ฝ์†์„ ๋” ์ž˜ ์ถฉ์กฑ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ await ๊ทธ ์š•๊ตฌ๋ฅผ ์ถฉ์กฑ์‹œํ‚ต๋‹ˆ๋‹ค.

์‚ฌ์‹ค, await ์ ‘๋ฏธ์‚ฌ๋Š” ์•„๋งˆ๋„ ๊ทธ ์š•๊ตฌ๋ฅผ ๋” ์ž˜ ์ถฉ์กฑ์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ฉ”์„œ๋“œ ์ฒด์ธ์—์„œ ๋งค์šฐ ์ž์—ฐ ์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (๋™๊ธฐ์‹ Rust ์ฝ”๋“œ์—์„œ ๋งค์šฐ ํ”ํ•ฉ๋‹ˆ๋‹ค!).

์ ‘๋‘์‚ฌ await ์‚ฌ์šฉํ•˜๋ฉด ๊ด€์šฉ์  ์ธ Rust ์Šคํƒ€์ผ์ด ์•„๋‹Œ ๋งŽ์€ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ํฌ๊ฒŒ ์žฅ๋ คํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ "๊ทธ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ข…์ข… ๋ณต์žกํ•œ ์ค‘์ฒฉ ๋ฐ ์ฒด์ธ ์ฝœ๋ฐฑ ์„ธํŠธ๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค."

๋‚˜๋Š” ์ •ํ™•ํžˆ ํ•˜๋‚˜ ๊ฐœ์˜ ํ์‡„๋ฅผ๋ณด๊ณ , ๊ทธ๊ฒƒ์ด ๋‹จ์ง€ ๋ถ€๋ฅด๊ณ , ์ฝœ๋ฐฑ ์•„๋‹ˆ๋‹ค map ์˜จ Iterator (์„ ๋ฌผ๊ณผ๋Š” ์ „ํ˜€ ์•„๋ฌด๊ฒƒ๋„!)

์ ‘๋‘์‚ฌ await ๋ฅผ ์ •๋‹นํ™”ํ•˜๊ธฐ ์œ„ํ•ด RFC์˜ ๋‹จ์–ด๋ฅผ ๋’คํ‹€๋ ค ๊ณ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

RFC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๋‘์‚ฌ await ๋ฅผ ์ •๋‹นํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. RFC ์ž์ฒด ๋Š” ๊ตฌ๋ฌธ์ด ์ตœ์ข…์ ์ด์ง€ ์•Š๊ณ  ๋‚˜์ค‘์— ๊ฒฐ์ •๋  ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๋•Œ๊ฐ€ ๋ฐ”๋กœ ์ง€๊ธˆ์ž…๋‹ˆ๋‹ค.

๊ฒฐ์ •์€ ๋‹ค์–‘ํ•œ ์ œ์•ˆ์˜ ์žฅ์ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ ์›๋ž˜ RFC๋Š” ์™„์ „ํžˆ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค (์œ ์šฉํ•œ ์—ญ์‚ฌ์  ์ฐธ๊ณ  ์ž๋ฃŒ ์ œ์™ธ).

@mehcode์˜ ์ตœ์‹  ์˜ˆ์ œ ๋Š” ๋Œ€๋ถ€๋ถ„ _stream_ combinator๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜์˜ combinator๋Š” ๋น„๋™๊ธฐ ๋ธ”๋ก์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋Œ€์ฒด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ ๋™๊ธฐ ์ฝ”๋“œ์—์„œ ๋ฐ˜๋ณต๊ธฐ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋ฏ€๋กœ ๋ฃจํ”„๋ณด๋‹ค ๋” ์ ์ ˆํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ด์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ๋Œ€ํ™”๋Š” 12 ๋ช… ์ •๋„์˜ ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๊ธ์–ด ๋ƒˆ์„ ๋•Œ 383 ๊ฐœ์˜ ๋Œ“๊ธ€ ์ค‘ 88 ๊ฐœ์˜ ๊ณ ์œ  ํ•œ ํฌ์Šคํ„ฐ ๋งŒ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋Œ“๊ธ€์„ ์ฝ์–ด์•ผํ•˜๋Š” ์‚ฌ๋žŒ์ด ์†Œ์ง„๋˜๊ฑฐ๋‚˜ ๋ถ€๋‹ด์ด๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•œ ํ•œ ์ฒ ์ €ํ•˜๊ฒŒ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ์ด์ „ ์š”์ ์„ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๋Œ“๊ธ€ ํžˆ์Šคํ† ๊ทธ๋žจ

HeroicKatora:(32)********************************
Centril:(22)**********************
ivandardi:(21)*********************
I60R:(21)*********************
Pzixel:(16)****************
novacrazy:(15)***************
scottmcm:(13)*************
EyeOfPython:(11)***********
mehcode:(11)***********
Pauan:(10)**********
XX:(9)*********
nicoburns:(9)*********
tajimaha:(9)*********
skade:(8)********
CAD97:(8)********
Laaas:(8)********
dpc:(8)********
ejmahler:(7)*******
Nemo157:(7)*******
yazaddaruvala:(6)******
traviscross:(6)******
CryZe:(6)******
Matthias247:(5)*****
dowchris97:(5)*****
rolandsteiner:(5)*****
earthengine:(5)*****
H2CO3:(5)*****
eugene2k:(5)*****
jplatte:(4)****
lnicola:(4)****
andreytkachenko:(4)****
cenwangumass:(4)****
richardanaya:(4)****
chpio:(3)***
joshtriplett:(3)***
phaylon:(3)***
phaazon:(3)***
ben0x539:(2)**
newpavlov:(2)**
comex:(2)**
DDOtten:(2)**
withoutboats:(2)**
valff:(2)**
darkwater:(2)**
tanriol:(1)*
liigo:(1)*
yasammez:(1)*
mitsuhiko:(1)*
mokeyish:(1)*
unraised:(1)*
mzji:(1)*
swfsql:(1)*
spacekookie:(1)*
sgrif:(1)*
nikonthethird:(1)*
edwin-durai:(1)*
norcalli:(1)*
quodlibetor:(1)*
chescock:(1)*
BenoitZugmeyer:(1)*
F001:(1)*
FuGangqiang:(1)*
Keruspe:(1)*
LegNeato:(1)*
MSleepyPanda:(1)*
SamuelMoriarty:(1)*
Swoorup:(1)*
Uristqwerty:(1)*
alexmaco:(1)*
arabidopsis:(1)*
arielb1:(1)*
axelf4:(1)*
casey:(1)*
lholden:(1)*
cramertj:(1)*
crlf0710:(1)*
davidtwco:(1)*
dyxushuai:(1)*
eaglgenes101:(1)*
AaronFriel:(1)*
gralpli:(1)*
huxi:(1)*
ian-p-cooke:(1)*
jonimake:(1)*
josalhor:(1)*
jsdw:(1)*
kjetilkjeka:(1)*
kvinwang:(1)*

@mehcode์˜ ์ตœ์‹  ์˜ˆ์ œ ๋Š” ๋Œ€๋ถ€๋ถ„ _stream_ combinator๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜์˜ combinator๋Š” ๋น„๋™๊ธฐ ๋ธ”๋ก์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋Œ€์ฒด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ ๋™๊ธฐ ์ฝ”๋“œ์—์„œ ๋ฐ˜๋ณต๊ธฐ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋ฏ€๋กœ ๋ฃจํ”„๋ณด๋‹ค ๋” ์ ์ ˆํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋„ ์—ฐ๊ฒฐ๋ณด๋‹ค ๋” ์ ์ ˆํ•œ ์ ‘๋‘์‚ฌ await๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Pauan ๋ถ„๋ช…ํžˆ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์™œ๊ณก ๋œ ๋‹จ์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ ์ง€์›์ž๊ฐ€ ์ž‘์„ฑํ•œ ์‹ค์ œ ์ฝ”๋“œ ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ ‘๋‘์‚ฌ ์Šคํƒ€์ผ ์ฝ”๋“œ๋Š” ๊ท€ํ•˜์˜ ์˜๋„๋ฅผ ๋” ์ž˜ ๋ณด์—ฌ ์ฃผ์ง€๋งŒ ์ ‘๋ฏธ์‚ฌ ์ง€์›์ž๊ฐ€ ๋ถˆํ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ๋งŽ์€ ์ผ์‹œ์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค (์ ์–ด๋„์ด ๊ฒฝ์šฐ). ๋˜ํ•œ ์ฝ”๋“œ์— ๋‘ ๊ฐœ์˜ ๋Œ€๊ธฐ๊ฐ€์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ผ์ด๋„ˆ ์ฒด์ธ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์ด๊ฒƒ์€ ์ง„์ •ํ•œ ์งˆ๋ฌธ์ด๋ฉฐ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค).
๋‘˜์งธ, Rust ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ปค์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‹ค์–‘ํ•œ ๋ฐฐ๊ฒฝ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋“ค (๋‚˜์™€ ๊ฐ™์ด ์ €๋Š” python / c / java๋ฅผ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค)์ด ๋ฉ”์„œ๋“œ ์ฒด์ธ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๋•Œ ๊ฐ€์žฅ ์ดˆ๊ธฐ์— ์ฑ„ํƒํ•œ ์‚ฌ๋žŒ๋“ค์˜ ๊ด€์ ์— ๊ทผ๊ฑฐํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@tajimaha post-fix์—์„œ prefix

let get_one_id = async move |id| {
    self.request(URL, Method::GET, vec![("info".into(), id.into())])
        .await?
        .json().await
};

let responses: Vec<Response> = futures_unordered(all_ids.into_iter().map(get_one_id))
    .collect().await?;

๊ทธ๋Ÿฌ๋‚˜ ์ ‘๋ฏธ์‚ฌ์—์„œ let -binding ๋ฐ Ok ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ? ๋ฅผ ํ•จ๊ป˜ ์ œ๊ฑฐํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ‘ ์ œ๊ณต ํ•œ ๋‹ค์Œ ์ฝ”๋“œ ๋ธ”๋ก๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์—. ์ด๊ฒƒ์€ ๋™์ผํ•œ ๋ฌธ์—์„œ ๋‘ ๊ฐœ์˜ ๋Œ€๊ธฐ๋กœ ์ธํ•ด ์ ‘๋‘์‚ฌ์—์„œ ์ „ํ˜€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Rust ์ฝ”๋“œ์—์„œ ๋ฐ”์ธ๋”ฉ์ด ์ผ๊ด€ ์ ์ด๋ผ๋Š” ๊ทœ์น™์ ์œผ๋กœ ์–ธ๊ธ‰ ๋œ ๊ฐ์ •์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จํ•˜์—ฌ ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ ๋งค์šฐ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋‹ค๋ฃจ๋Š” ์ฝ”๋“œ์—์„œ 2 ? ์ด์ƒ์„ ๊ฑฐ์˜ ๋ณด์ง€ ๋ชปํ•œ๋‹ค.

๋˜ํ•œ idiomatic ๋Š” ์–ธ์–ด์˜ ์ˆ˜๋ช… ๋™์•ˆ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ์ด๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์„ธ์‹ฌํ•œ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ „์— ์ด์™€ ๊ฐ™์€ ๊ฒƒ์ด ์ œ์•ˆ๋˜์—ˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ ‘๋‘์‚ฌ await ํ‚ค์›Œ๋“œ๋ฅผ ์ „์ฒด ํ‘œํ˜„์‹์— ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์ „์— ์ œ๊ธฐ ๋œ ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์—ฌ๊ธฐ์„œ get , send ๋ฐ json ๋Š” ๋น„๋™๊ธฐ์ž…๋‹ˆ๋‹ค.

์ €์—๊ฒŒ๋Š” (๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์•ฝ๊ฐ„์˜ ๋น„๋™๊ธฐ ๊ฒฝํ—˜์ด์žˆ๋Š”) ์ ‘๋ฏธ์‚ฌ expr await ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ๊ฐ€ ์ด์ƒํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์šฐ๋ ค๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” ์ด๊ฒƒ์ด ์—ฌ๋Ÿฌ ์ค„๋กœ ๋‚˜๋ˆ„์–ด ์ ธ์•ผํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๊ณ  await ๊ฐ€ ํ•ญ์ƒ ์ค„์˜ ๋์— ์žˆ์œผ๋ฉด ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ถ”๊ฐ€์ ์ธ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

IDE์—์„œ์ด ๊ตฌ๋ฌธ์€ "์ ์˜ ํž˜"์ด ์—†์ง€๋งŒ ์—ฌ์ „ํžˆ ์ ‘๋‘์‚ฌ ๋ฒ„์ „๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ์ ์„ ์ž…๋ ฅ ํ•œ ๋‹ค์Œ await ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฉด ์ ์„ ์‚ญ์ œํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. " await "๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, IDE๊ฐ€ ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋„ํŠธ ๊ตฌ๋ฌธ expr.await ์€ ๋‹ค๋ฅธ ์ œ์–ด ํ๋ฆ„ ํ‚ค์›Œ๋“œ๊ฐ€ ๋„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋™์„ ์ค๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ๋น„๋ก ์šฐ๋ฆฌ๊ฐ€ ์ฒด์ด๋‹ (chaining)์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ, ๊ฐ€๋”์€ ๊ฝค ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ฒด์ด๋‹์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผํ•œ๋‹ค๊ณ  ๊ทน๋‹จ์ ์œผ๋กœ ๋งํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. C ๋˜๋Š” Python ์Šคํƒ€์ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„์œ„ํ•œ ๋„๊ตฌ๋„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Python์—๋Š” ์—ฐ๊ฒฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ฑฐ์˜ ์—†์ง€๋งŒ ์ฝ”๋“œ๋Š” ์ฝ๊ธฐ ์‰ฌ์šด ๊ฒƒ์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋ถˆํ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

then ์ ‘๋ฏธ์–ด๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” Rust ์ฝ”๋“œ์—์„œ ๋ฐ”์ธ๋”ฉ์ด ์ผ๊ด€ ์ ์ด๋ผ๋Š” ๊ทœ์น™์ ์œผ๋กœ ์–ธ๊ธ‰ ๋œ ๊ฐ์ •์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จํ•˜์—ฌ ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ ๋งค์šฐ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋‹ค๋ฃจ๋Š” ์ฝ”๋“œ์—์„œ 2 ? ์ด์ƒ์„ ๊ฑฐ์˜ ๋ณด์ง€ ๋ชปํ•œ๋‹ค.

๋˜ํ•œ idiomatic ๋Š” ์–ธ์–ด์˜ ์ˆ˜๋ช… ๋™์•ˆ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ์ด๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์„ธ์‹ฌํ•œ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ•œ ์ค„์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ? ๊ฐ€์žˆ๋Š” ํ˜„์žฌ Rust ์ฝ”๋“œ๋ฅผ ์กฐ์‚ฌํ•˜๋„๋ก ์˜๊ฐ์„์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค (๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ๋Ÿฌ ์ค„ ์‚ฌ์šฉ์„ ์กฐ์‚ฌ ํ•  ์ˆ˜์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค). ๋‚˜๋Š” xi-editor, alacritty, ripgrep, bat, xray, fd, firecracker, yew, Rocket, exa, iron, parity-ethereum, tikv๋ฅผ ์กฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ณ„์ด์žˆ๋Š” Rust ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ์€ ๊ฒƒ์€ ์ด 585562 ๊ฐœ์˜ ๋ผ์ธ ์ค‘ ์•ฝ 40 ๊ฐœ ๋ผ์ธ ? ๋ฅผ ์‚ฌ์šฉ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 0.006 % ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ์กด ์ฝ”๋“œ ์‚ฌ์šฉ ํŒจํ„ด์„ ์—ฐ๊ตฌํ•ด๋„ ์ƒˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค

์ƒˆ API์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์ด ์ฃผ์–ด ์กŒ๊ฑฐ๋‚˜ ์š”์ฒญ์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์“ธ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

ํ•œ๋ฐฉ์— ? API๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์š”์ฒญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ , ๋ฐ˜ํ™˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ ,์ด API๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ฐ€์ •์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ๋‹ค์Œ๊ณผ ๊ฐ™์ด API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

let request = client.get("https://my_api").header("k", "v");
dbg!(request);
let response = await(request.send())?;
dbg!(response);
let data = await(response.json())?;
dbg!(data);

๋„คํŠธ์›Œํฌ API๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ์™€๋Š” ๋‹ค๋ฅด๋ฉฐ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœํ†  ํƒ€์ดํ•‘์— ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฌ์šด ์ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœํ†  ํƒ€์ดํ•‘์„ ํ•  ๋•Œ, ๋„ˆ๋ฌด ๋งŽ์€ ์ž„์‹œ ๋ณ€์ˆ˜ ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ๋˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •

let request = client.get("https://my_api").header("k", "v");
dbg!(request);
let response = request.send().await?;
dbg!(response);
let data = response.json().await?;
dbg!(data);

๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฏธ ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด :

let request = client.get("https://my_api").header("k", "v");
dbg!(request);
let response = await(request.send())?;
dbg!(response);
let data = await(response.json())?;
dbg!(data);

๋‹น์‹ ์ดํ•ด์•ผ ํ•  ์ผ์€ ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์„ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ๊ณ  ๋‹น์‹ ์˜ ์ผ์ด ๋๋‚ฌ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.์ด ๊ณผ์ •์—์„œ ์ฒด์ด๋‹์กฐ์ฐจ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ์€ ๊ฒƒ์€ ์ด 585562 ๋ผ์ธ ์ค‘ ์•ฝ 40 ๋ผ์ธ ๋งŒ์ด ๋‘ ๊ฐœ ์ด์ƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ์ค„๋กœ.

์ด๊ฒƒ์€ ์œ ์šฉํ•œ ์ธก์ •์ด ์•„๋‹ˆ๋ผ๊ณ  ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ •๋ง ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž _per expression_์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ (rustfmt) ์Šคํƒ€์ผ์— ๋”ฐ๋ผ, ๊ทธ๊ฒƒ๋“ค์€ ๋™์ผํ•œ ํ‘œํ˜„์‹์— ์†ํ•˜๋”๋ผ๋„ ๊ฑฐ์˜ ํ•ญ์ƒ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ์ค„์—์žˆ๊ฒŒ๋˜๋ฉฐ ๋”ฐ๋ผ์„œ await ์— ๋Œ€ํ•ด (์ด๋ก ์ ์œผ๋กœ) ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์ค‘์š”ํ•œ ์–‘์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ฒด์ธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผํ•œ๋‹ค๊ณ  ๊ทน๋‹จ์ ์œผ๋กœ ๋งํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ์ฒด์ธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ๋ณธ ๋ชจ๋“  ๊ฒƒ์€ ๋™๊ธฐ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด _ ์ธ์ฒด ๊ณตํ•™์ ์ด์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด 585562 ๊ฐœ ๋ผ์ธ ์ค‘ ์•ฝ 40 ๊ฐœ ๋ผ์ธ ๋งŒ ๋‘ ๊ฐœ ์ด์ƒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ? ํ•œ ์ค„๋กœ.

์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ์™€ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ๋ฅผ ์›ํ•˜๋Š” C # ์˜ˆ์ œ ์ค‘ _none_์€ ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ await ๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๋ช…๋ น๋ฌธ์— ์—ฌ๋Ÿฌ await ๋ฅผ ํฌํ•จํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  @Centril ์˜ ์ž ์žฌ์  ์ ‘๋ฏธ์‚ฌ ๋ ˆ์ด์•„์›ƒ์˜ ์˜ˆ๋Š” ํ•œ ์ค„ ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ await ๋„ฃ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋‹ค์Œ ์˜ˆ์ œ์™€ ๊ฐ™์ด ? ์—ฐ๊ฒฐ๋œ ํ•ญ๋ชฉ๊ณผ ๋” ๋‚˜์€ ๋น„๊ต๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Ok(&self.get_bytes(cx, ptr, size_with_null)?[..size])
self.try_to_scalar()?.to_ptr().ok()
let idx = decoder.read_u32()? as usize;
.extend(self.at(cause, param_env).eq(v1, v2)?.into_obligations());
for line in BufReader::new(File::open(path)?).lines() {

ํŽธ์ง‘ : ์ด๋ฒˆ์— ๋Š” ๋‚˜๋ฅผ์ด๊ธด ๊ฒƒ @ CAD97 : slightly_smiling_face :

์ด๊ฒƒ์€ then ๊ฐ€ ๋งŽ์€ javascipt์˜ promise ์ฝ”๋“œ์™€ ๋†€๋ž๊ฒŒ๋„ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋™๊ธฐ๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. await ๊ฐ€ ์žˆ๊ณ  ๋™๊ธฐ์‹์œผ๋กœ ๊ฐ€์žฅํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ํ™•์‹คํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ

let responses: Vec<Response> = await {
    stream::iter(all_ids)
        .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
        .and_then(|mut res| res.json().err_into())
        .try_buffer_unordered(10)
        .try_collect()
}?;

@ CAD97 @scottmcm ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ธก์ •ํ•˜๋Š” ๊ฒƒ์— ์ œํ•œ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

(๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ๋Ÿฌ ์ค„ ์‚ฌ์šฉ์„ ์กฐ์‚ฌ ํ•  ์ˆ˜ ์žˆ์Œ)

@skade ๊ฐ€ await ์™€ ? ์‚ฌ์ด์˜ ์œ ์‚ฌ์„ฑ์„ ์–ธ๊ธ‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋น ๋ฅธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง„์ง€ํ•œ ์—ฐ๊ตฌ๋ฅผํ•˜์ง€ ์•Š๋Š” ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ข€ ๋” ์„ธ๋ฐ€ํ•œ ๋ถ„์„์ด ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋„ค์š”. ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ์‹๋ณ„์‹์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€์ด ๋ถ„์„์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋“ ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ์ฒด์ธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ๊นŒ์ง€ ๋‚ด๊ฐ€ ๋ณธ ๋ชจ๋“  ๊ฒƒ์€ ๋™๊ธฐ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์ธ์ฒด ๊ณตํ•™์ ์ด์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ postfix ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด C / Python ์Šคํƒ€์ผ์ด ์ข‹์•„ ๋ณด์ผ ๋•Œ ์ธ์ฒด ๊ณตํ•™์ ์ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค (๋ฌผ๋ก  imo). ๋˜ํ•œ ํ”„๋กœํ†  ํƒ€์ž…์„ ๋งŒ๋“ค ๋•Œ ์ฒด์ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค .

์ด ์Šค๋ ˆ๋“œ์˜ ๋ฐฉํ–ฅ์ด ๊ณผ๋„ํ•œ ์—ฐ๊ฒฐ์— ๋„ˆ๋ฌด ๋งŽ์ด ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๊ฐ€ ๋™๊ธฐ์‹ ๋ณ€ํ˜•๊ณผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€, ์ด๊ฒƒ์ด ์‚ฌ์šฉ ๋ฐ ๋ฆฌ์†Œ์Šค ํ™œ์šฉ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์‚ดํŽด ๋ณด๋„๋ก ๊ถŒ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ์Šค๋ ˆ๋“œ์˜ 400 ๊ฐœ ๋Œ“๊ธ€ ์ค‘ 5 ๊ฐœ ๋ฏธ๋งŒ์ด ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ ์•ผ๊ฐ„ ๋ฒ„์ „์„ ๊ฐ€์ ธ์™€ ์ ์ ˆํ•œ ๋น„๋™๊ธฐ ์ฝ”๋“œ ์ฒญํฌ๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ์ง€๋‚œ 20 ๊ฐœ์˜ ํฌ์ŠคํŠธ์—์„œ ๋…ผ์˜ ๋œ ์ฝ”๋“œ ์ปดํŒŒ์ผ์˜ ๊ด€์šฉ์  (๋น„๊ฒฐ ํ•ฉ์ž) ๋น„๋™๊ธฐ / ๋Œ€๊ธฐ ๋ฒ„์ „์„ ์–ป์œผ๋ ค๋Š” ์‹œ๋„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์ „ํžˆ yield / await ํฌ์ธํŠธ ์‚ฌ์ด์— ์‚ฌ๋ฌผ์ด ์กด์žฌํ•˜๋Š”์ง€, ์ฐธ์กฐ๊ฐ€ await ํฌ์ธํŠธ์— ๊ฑธ์ณ ์ง€์†๋˜๋Š”์ง€ ์—ฌ๋ถ€, ๊ทธ๋ฆฌ๊ณ  ์ข…์ข… ํ“จ์ฒ˜์— ๋Œ€ํ•œ ์ผ๋ถ€ ํŠน์ดํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด์ด ์Šค๋ ˆ๋“œ์—์„œ ์ƒ์ƒ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†๋Š”์ง€ ์—ฌ๋ถ€์— ์ฐจ์ด๊ฐ€์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด !Unpin ์œ ํ˜•์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž„์˜์˜ ๊ฒฐํ•ฉ ์ž์— ์ž„์˜์˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋ธ”๋ก์—์„œ ์„ ๋ฌผ์„ ์ƒ์„ฑํ•˜๋ฉด join! ๋˜๋Š” select! ์™€ ๊ฐ™์€ ๊ฒฐํ•ฉ ์ž์™€ ์ง์ ‘ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์ • ๋ฐ ์œตํ•ฉ ์œ ํ˜•์ด ํ•„์š”ํ•˜๋ฏ€๋กœ pin_mut! ๋ฐ .fuse() ์ถ”๊ฐ€ ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ๋น„๋™๊ธฐ ๋ธ”๋ก ์ž‘์—…์„ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋งคํฌ๋กœ ๊ธฐ๋ฐ˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” join! ๋ฐ select! ์ž‘์—…์ด ์ด์ „ ์กฐํ•ฉ ์ž ๋ณ€ํ˜•๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ๋“ค์€ ์—ฌ๊ธฐ์—์„œ ์ข…์ข… ์˜ˆ์ œ๋กœ ์ œ๊ณต๋˜๋Š” ๊ณผ๋„ํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ„๋‹จํ•œ tokio ์˜ˆ์ œ ์—์„œ postfix await๊ฐ€ .unwrap() ๊ณผ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

let response = await!({
    client.get(uri)
        .timeout(Duration::from_secs(10))
}).unwrap();

์ ‘๋‘์‚ฌ๊ฐ€ ์ฑ„ํƒ๋˜๋ฉด

let response = await {
    client.get(uri).timeout(Duration::from_secs(10))
}.unwrap();

ํ•˜์ง€๋งŒ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์ฑ„ํƒ๋˜๋ฉด

client.get(uri).timeout(Duration::from_secs(10)).await.unwrap()
client.get(uri).timeout(Duration::from_secs(10)) await.unwrap()

์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ์ง๊ด€์  ์ธ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธฐ์กด ๊ทœ์น™๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. await ์€ ํ•„๋“œ์ž…๋‹ˆ๊นŒ? ๋˜๋Š” await ๋Š” unwrap() ๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€์žˆ๋Š” ๋ฐ”์ธ๋”ฉ์ž…๋‹ˆ๊นŒ? ๋„ˆ๋ฌด ๋‚˜๋น ! ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋งŽ์ด ํ’€๋ฆฝ๋‹ˆ๋‹ค. The Zen of Python์˜ ์—ฌ๋Ÿฌ ์„ค๊ณ„ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋Š” ๊ทœ์น™์„ ์–ด๊ธธ๋งŒํผ ํŠน๋ณ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ตฌํ˜„์ด ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.
๋ชจํ˜ธํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ถ”์ธกํ•˜๋ ค๋Š” ์œ ํ˜น์„ ๊ฑฐ๋ถ€ํ•˜์‹ญ์‹œ์˜ค.

์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ์ง๊ด€์  ์ธ ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ธฐ์กด ๊ทœ์น™๊ณผ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. await ๋Š” ํ•„๋“œ์ž…๋‹ˆ๊นŒ? ๋˜๋Š” await ๋Š” unwrap() ๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€์žˆ๋Š” ๋ฐ”์ธ๋”ฉ์ž…๋‹ˆ๊นŒ? ๋„ˆ๋ฌด ๋‚˜๋น ! ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋งŽ์ด ํ’€๋ฆฝ๋‹ˆ๋‹ค. The Zen of Python์˜ ์—ฌ๋Ÿฌ ์„ค๊ณ„ ๊ทœ์น™์„ ์œ„๋ฐ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋„ˆ๋ฌด ๋งŽ์€ ๋ฌธ์„œ๊ฐ€ ์žˆ์ง€๋งŒ ๋‚˜๋Š” ๋งํ•  ๊ฒƒ docs.rs ํ˜ธ์ถœ unwrap , unwrap ๊ต์ฒดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ? ๋งŽ์€ ์‹ค์ œ์˜ ๊ฒฝ์šฐ. ์ ์–ด๋„ ์ด๊ฒƒ์€ ๋‚˜์˜ ์—ฐ์Šต์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐพ์€ ๊ฒƒ์€ ์ด 585562 ๋ผ์ธ ์ค‘ ์•ฝ 40 ๋ผ์ธ ๋งŒ์ด ๋‘ ๊ฐœ ์ด์ƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ์ค„๋กœ.

์ด๊ฒƒ์€ ์œ ์šฉํ•œ ์ธก์ •์ด ์•„๋‹ˆ๋ผ๊ณ  ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ •๋ง ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž _per expression_์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ (rustfmt) ์Šคํƒ€์ผ์— ๋”ฐ๋ผ, ๊ทธ๊ฒƒ๋“ค์€ ๋™์ผํ•œ ํ‘œํ˜„์‹์— ์†ํ•˜๋”๋ผ๋„ ๊ฑฐ์˜ ํ•ญ์ƒ ํŒŒ์ผ์˜ ๋‹ค๋ฅธ ์ค„์—์žˆ๊ฒŒ๋˜๋ฉฐ ๋”ฐ๋ผ์„œ await ์— ๋Œ€ํ•ด (์ด๋ก ์ ์œผ๋กœ) ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์ค‘์š”ํ•œ ์–‘์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์—๋Š” ์ œํ•œ์ด์žˆ์„ ์ˆ˜ ์žˆ์Œ์„ ๋ถ€์ธํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” xi-editor, alacritty, ripgrep, bat, xray, fd, firecracker, yew, Rocket, exa, iron, parity-ethereum, tikv์— ๋Œ€ํ•ด ๋‹ค์‹œ ์กฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ณ„์ด์žˆ๋Š” Rust ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ํŒจํ„ด์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

xxx
  .f1()
  .f2()
  .f3()
  ...

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์‹์— ์—ฌ๋Ÿฌ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€.

7066 ์ฒด์ธ ์ค‘ 15 ๊ฐœ๋งŒ ์—ฌ๋Ÿฌ ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ 0.2 % ์ž…๋‹ˆ๋‹ค. ์ด ์ค„์€ 585562 ์ค„ ์ค‘ 167 ์ค„์— ๊ฑธ์ณ ์žˆ์Šต๋‹ˆ๋‹ค. 0.03 % ์ž…๋‹ˆ๋‹ค.

@cenwangumass ์‹œ๊ฐ„์„๋‚ด์–ด ์ •๋Ÿ‰ํ™”

ํ•œ ๊ฐ€์ง€ ๊ณ ๋ ค ์‚ฌํ•ญ์€ Rust๊ฐ€ let์œผ๋กœ ๋ณ€์ˆ˜ ๋ฆฌ ๋ฐ”์ธ๋”ฉ์„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— await ์ ‘๋‘์‚ฌ์— ๋Œ€ํ•ด ๋งค๋ ฅ์ ์ธ ์ธ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ await await๋งˆ๋‹ค ๋ณ„๋„์˜ ์ฝ”๋“œ ์ค„์ด ์ƒ๊น๋‹ˆ๋‹ค. -ํฌ์ธํŠธ. ์žฅ์ ์€ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ค„ ๋ฒˆํ˜ธ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์œ„์น˜์— ๋Œ€ํ•œ ๋” ํฐ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์Šคํƒ ์ถ”์ ๊ณผ ๋ณ€์ˆ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ณ„ ๋Œ€๊ธฐ ์ง€์ ์— ์ค‘๋‹จ ์ ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ฏ€๋กœ ๋””๋ฒ„๊น… ์ค‘๋‹จ ์ ์˜ ์šฉ์ด์„ฑ์€ ํ•œ ์ค„์˜ ์ฝ”๋“œ.

๊ฐœ์ธ์ ์œผ๋กœ https://github.com/rust-lang/rust/issues/57640#issuecomment -457457727์„ ์ฝ์€ ํ›„ ์ ‘๋‘์‚ฌ ์Šคํƒ€์ผ๊ณผ ์ ‘๋ฏธ์‚ฌ์‹œ๊ธธ ์‚ฌ์ด์—์„œ ์ฐข์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ๋œ ์ ‘๋‘์‚ฌ ์Šคํƒ€์ผ :

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

    Ok(user)
}

๋ Œ๋”๋ง ๋œ ์ ‘๋ฏธ์‚ฌ ์Šคํƒ€์ผ :

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

    Ok(user)
}

๋ Œ๋”๋ง ๋œ ์ ‘๋ฏธ์‚ฌ sigil @ :

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

    Ok(user)
}

๋ Œ๋”๋ง ๋œ ์ ‘๋ฏธ์‚ฌ์‹œ๊ธธ ๋ฒˆํ˜ธ :

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

    Ok(user)
}

Stream ๋Œ€ํ•ด await ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ๋งŽ์ด ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด ๋‚ฌ์ง€๋งŒ Stream ์—์„œ ์•ฝ๊ฐ„์˜ ์„ ๊ฒฌ์ง€๋ช…์œผ๋กœ await ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ

for await response in stream {
    let response = response?;
    ...
}

// In which case an `await?` variant might be beneficial
for await? response in stream {
    ...
}

์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ

for response in stream await {
    let response = response?;
    ...
}
for response in stream.await!() {
    let response = response?;
    ...
}

// Or a specialized variant of `await` and `?`
//     Note (Not Obvious): The `?` actually applies to each response of `await`
for response in stream await? {
    ...
}
for response in stream.await!()? {
    ...
}

๊ฐ€์žฅ ์ธ์ฒด ๊ณตํ•™์ ์ด๊ณ  ์ผ๊ด€๋œ ๊ตฌ๋ฌธ

let results: Vec<Result<_, _>> = ...;
for value in? results {
    ...
}
for response await? stream {
    ...
}

Future ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ๋Š” postfix๊ฐ€ ์ข‹์ง€๋งŒ ์–ธ๋œป๋ณด๊ธฐ์—๋Š” Stream ๋Œ€ํ•ด ๊ฐ€์žฅ ์ง๊ด€์ ์ด์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์—์ด ์˜ˆ์ œ๋ฅผ ์กฐ๊ธˆ์ด๋ผ๋„ ๋…ผ์˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์˜ฌ๋ฐ”๋ฅธ ํ•ด๊ฒฐ์ฑ…์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ์ ‘๋ฏธ์‚ฌ์— await ์— ๋Œ€ํ•ด Future ๊ณผ์˜ ๋‹ค๋ฅธ ์Šคํƒ€์ผ await ์— ๋Œ€ํ•ด Stream ? ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์˜ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ ๋ถ„์„์ด ๋ชจํ˜ธํ•˜์ง€ ์•Š์€์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋‚ด ์ดˆ๊ธฐ ์ƒ๊ฐ ์ผ ๋ฟ์ด๋ฉฐ Stream ์œ ์Šค ์ผ€์ด์Šค์— postfix ๊ด€์ ์—์„œ ๋” ๋งŽ์€ ์ƒ๊ฐ์„ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ postfix๊ฐ€ Stream ์—์„œ ์–ด๋–ป๊ฒŒ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ตฌ๋ฌธ์ด ์žˆ์–ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ŠคํŠธ๋ฆผ ๋ฐ˜๋ณต์„์œ„ํ•œ ๊ตฌ๋ฌธ์€ ์ œ๊ฐ€ ์ƒ์ƒํ•˜๋Š” ๊ฝค ์˜ค๋žซ๋™์•ˆ ์ผ์–ด๋‚  ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. while let ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ํ•„๋“œ
while let Some(value) = stream.try_next().await? {
}
"์ผ๊ด€๋œ"์šฐ์„  ์ˆœ์œ„์™€ ์„คํƒ•์ด์žˆ๋Š” ์ ‘๋‘์‚ฌ
while let Some(value) = await? stream.try_next() {
}
ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ
while let Some(value) = await { stream.try_next() }? {
}

์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ˜„์žฌ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค (+ await ).


์ด ์˜ˆ์—์„œ๋Š” "๊ตฌ๋ถ„์ž๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ"๊ฐ€ ๋‚˜์—๊ฒŒ ํŠนํžˆ ๋‚˜์˜๊ฒŒ ๋ณด์ธ๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. await(...)? ๊ฐ€ ๋”๋ณด๊ธฐ ์ข‹๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ "๊ตฌ๋ถ„์ž ์ ‘๋‘์‚ฌ"๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ _one_ ์ข…๋ฅ˜์˜ ๊ตฌ๋ถ„์ž (์˜ˆ try { ... } ) ๋งŒ ํ—ˆ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋น ๋ฅธ ์ ‘์„ ์ด์ง€๋งŒ "๊ตฌ๋ถ„์ž๋กœ ๊ธฐ๋‹ค๋ฆผ"์€ ๊ทธ๋ƒฅ ... ์ผ๋ฐ˜ ์ ‘๋‘์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค? await ๋Š” ํ‘œํ˜„์‹์„ ๊ธฐ๋‹ค๋ฆฌ๋ฏ€๋กœ await expr ๋ฐ await { expr } ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ๋ถ„ ๊ธฐํ˜ธ ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ชจ๋“  ํ‘œํ˜„์‹์ด {}๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ๊ณ  ๋™์ผํ•œ ํ‘œํ˜„์‹์ด ๊ณ„์† ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ Rust์˜ ๊ฒฝ์šฐ ํ‘œํ˜„์‹์˜ ์—ฐ์‚ฐ์ž๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒจํ„ด์˜ ์ˆ˜์ • ์ž๋กœ์„œ๋„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ž์—ฐ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ํ•˜๊ฒŒํ–ˆ์Šต๋‹ˆ๋‹ค.

// These two lines mean the same - both await the future
let x = await my_future;
let async x = my_future;

๊ทธ๋Ÿฌ๋ฉด for ์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

for async x in my_stream { ... }

๋ฟก ๋นต๋€จ

"ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ ๋Œ€๊ธฐ"๊ฐ€ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ? ์ฃผ์œ„์˜ ์šฐ์„  ์ˆœ์œ„ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. _mandatory_ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ์„  ์ˆœ์œ„ ์งˆ๋ฌธ์ด ์—†์Šต๋‹ˆ๋‹ค.

_similar_ (์•ˆ์ •์ ) ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด์„œ๋Š” try { .... } ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. Try์—๋Š” ? ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ฑฐ์˜ ๋™์ผํ•œ ์ด์œ ๋กœ ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๊ด„ํ˜ธ ์•ˆ์˜ ? ๋Š” ์™ธ๋ถ€์™€ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

@yazaddaruvala ๋‚˜๋Š” Iterator<Item = Result<...>> ๋‹ค๋ฃจ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์—์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋กœ ๋” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง„ for ๋ฃจํ”„๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋น„๋™๊ธฐ ํŠน์ • ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

// postfix syntax
for response in stream await {
    ...
}

์ด๋Š” stream: impl Future<Output = Iterator> ์ด๊ณ  ๊ฐ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ˜๋ณต๊ธฐ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” async for item in stream ๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค ( @tanriol ์–ธ๊ธ‰๊ณผ ๊ฐ™์€๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์—†์ด).


@ivandardi ์ฐจ์ด์ ์€ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ์˜ ๋์— ์—ฐ๊ฒฐ์„ ์‹œ์ž‘ํ•˜๋ฉด ์šฐ์„  ์ˆœ์œ„์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— "๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„ ์ ‘๋‘์‚ฌ", "์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„ ์ ‘๋‘์‚ฌ"(์ ์–ด๋„ "์œ ์šฉํ•œ"์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ดํ•ด)๋กœ ๋‹ค๋ฅด๊ฒŒ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. "ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ ์ ‘๋‘์‚ฌ".

await (foo.bar()).baz()?;
await { let foo = quux(); foo.bar() }.baz()?;

ํŒŒ์‹ฑ โ€‹โ€‹๋Œ€์ƒ (์„ธ ๊ฐ€์ง€ ๋ณ€ํ˜• ๋ชจ๋‘์— ๋Œ€ํ•ด ๋ชจํ˜ธํ•˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ์ถฉ๋ถ„ํ•œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ ํฌํ•จ)

// obvious precedence prefix
await ((foo.bar()).baz()?);
await ({ let foo = quux(); foo.bar() }.baz()?);

// useful precedence prefix
(await ((foo.bar()).baz()))?;
(await ({ let foo = quux(); foo.bar() }.baz())?;

// mandatory delimiters prefix
(await (foo.bar())).baz()?;
(await { let foo = quux(); foo.bar() }).baz()?;

๋‚ด ์ƒ๊ฐ์— https://github.com/rust-lang/rust/issues/57640#issuecomment -457457727์˜ C #์—์„œ @scottmcm ์˜ ์˜ˆ๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ (await foo).bar ์œ„์น˜์—์„œ await(foo).bar ์œ„์น˜ :

await(response.Content.ReadAsStringAsync()).Should().Be(text);
var previous = await(branch.ListHistoryAsync(timestampUtc, null, cancellationToken, 1)).HistoryEntries.SingleOrDefault();

๋“ฑ๋“ฑ. ์ด ๋ ˆ์ด์•„์›ƒ์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ์ต์ˆ™ํ•˜๊ณ  ๊ธฐ์กด ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ œ์–ด ํ๋ฆ„์— ์ต์ˆ™ํ•˜๋ฉฐ ๋‹ค๋ฅธ ์–ธ์–ด (C # ํฌํ•จ)์— ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ƒํ•œ ์˜ˆ์‚ฐ์„ ๊นจ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  await ์ฒด์ธ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํ‹€๋ฆผ์—†์ด ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ try! ๋ฉ€ํ‹ฐ์— ๋Œ€ํ•œ await ์ฒด์ธ, ๊ทธ๊ฒŒ ์œ„ํ•ด์ด์—ˆ๋‹ค์œผ๋กœ ๊ฑฐ๋ž˜์˜ ํฐ๋Œ€๋กœ ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค Result ? ๋‚˜๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋“œ๋ฌผ๊ณ  ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€์—†๋Š” ํŒจํ„ด์„ ์ˆ˜์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์—ฌ๊ธฐ์„œ ๊ตฌ๋ฌธ์˜ ์ด์ƒ ํ•จ์„ ํ›จ์”ฌ ์ œํ•œํ•˜๊ณ ์žํ•œ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด (C # ํฌํ•จ)์— ์ต์ˆ™ ํ•จ

์ด๊ฒƒ์€ C # (๋˜๋Š” Javascript ๋˜๋Š” Python)์—์„œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.

await(response.Content.ReadAsStringAsync()).Should().Be(text);

๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

var future = (response.Content.ReadAsStringAsync()).Should().Be(text);
await future;

(์  ์—ฐ์‚ฐ์ž๋Š” await ๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฏ€๋กœ await ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ ํ•ด๋„ ๋” ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋ฐ”์ธ๋”ฉ๋ฉ๋‹ˆ๋‹ค.)

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ์ฃผ์žฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•ˆ๋‹ค. ์ˆœ์„œ๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋˜๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์ด ๊ด„ํ˜ธ ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด๋˜๊ณ  ๊ธฐ์กด ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ตฌ๋ฌธ์ด ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

์ด ๋ ˆ์ด์•„์›ƒ์€ [...] ๊ธฐ์กด ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ œ์–ด ํ๋ฆ„์—์„œ ์ต์ˆ™ํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ธฐ์กด ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ œ์–ด ํ๋ฆ„์—์„œ ํ•ด๋‹น ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ _ ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค _.

warning: unnecessary parentheses around `return` value
 --> src/lib.rs:2:9
  |
2 |   return(4);
  |         ^^^ help: remove these parentheses
  |
  = note: #[warn(unused_parens)] on by default

๊ทธ๋ฆฌ๊ณ  rustfmt ์€ return (4); ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ณต๋ฐฑ์„ _ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ ์žํ•˜๋Š” ์š”์ ์— ์‹ค์ œ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์œผ๋ฉฐ ๋จธ๋ฆฌ์นด๋ฝ์„ ์ชผ๊ฐœ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. return (4) , return(4) , ์Šคํƒ€์ผ ๋ฌธ์ œ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ „์ฒด ๋ฌธ์ œ๋ฅผ ์ฝ์—ˆ๊ณ  {} ์ค‘๊ด„ํ˜ธ์™€ ์ ‘๋‘์‚ฌ๊ฐ€ ๊ดœ์ฐฎ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ค๊ธฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

๋ณด์ž :

let foo = await some_future();
let bar = await {other_future()}?.bar

๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ ์ฒด์ธ์— await ๋” ๋งŽ์ด ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

let foo = await some_future();
let bar = await {
                await {other_future()}?.bar_async()
          }?;

IMHO๋ณด๋‹ค ํ›จ์”ฌ ๋‚˜๋น  ๋ณด์ž…๋‹ˆ๋‹ค.

let foo = some_future() await;
let bar = other_future() await?
           .bar_async() await?;

๊ทธ๋Ÿฌ๋‚˜ @cenwangumass ์˜ ๊ฒŒ์‹œ๋ฌผ์— ์“ฐ์—ฌ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋น„๋™๊ธฐ ์ฒด์ธ์„ ๋ฏฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋‚ด์ž…๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ async/await ์ด ๊ตฌ์ฒด์ ์ธ ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์šฉ ํ•  ์ˆ˜ ์ฒด์ธ ๊ฒฝ์šฐ ํ•˜์ดํผ ์„œ๋ฒ„์— ๋ณด์—ฌ์ฃผ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ์ •๋ง ์œ ํ˜น์„ ๋ฐ›๊ณ  ๋†๋‹ด์ด ์•„๋‹™๋‹ˆ๋‹ค.


์•ž์˜ ์˜ˆ์—์„œ ๋Œ€๋ถ€๋ถ„์€ ๊ฒฐํ•ฉ ์ž์— ์˜ํ•ด ์–ด๋–ค ์‹ ์œผ๋กœ๋“  "์†์ƒ"๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ

let responses: Vec<Response> = await {
    stream::iter(all_ids)
        .then(|id| self.request(URL, Method::GET, vec![("info".into(), id.into())]))
        .and_then(|mut res| res.json().err_into())
        .try_buffer_unordered(10)
        .try_collect()
}?;

๊ทธ๋ƒฅ

let responses: Vec<Response> = all_ids
   .map(async |id|  {
      let response = self.request(URL, Method::GET, vec![("info".into(), id.into())]) await?;
      Ok(res.json() await?)
   })
   .join_all() await
   .collect()?

์„ ๋ฌผ์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

let responses: Vec<Response> = all_ids
   .map(async |id|  {
      let response = self.request(URL, Method::GET, vec![("info".into(), id.into())])? await?;
      Ok(res.json()? await?)
   })
   .join_all()? await
   .collect()?

@lnicola , @nicoburns ,

https://internals.rust-lang.org/t/pre-rfc-extended-dot-operator-as-possible-syntax-for-await ์—์„œ val.[await future] ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ Pre-RFC ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. -์ฒด์ธ / 9304

@Dowwie ์ ˆ์ฐจ ์งˆ๋ฌธ์€ https://internals.rust-lang.org ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋…ผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š”์ด ํ† ๋ก ์—์„œ ๋‘ ๊ฐ€์ง€ ์ง„์˜์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–‘๋ณด ์ ์„ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ๊ณผ ๋œ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค.

2018 ๋…„๊ฒฝ Rust์˜ Async ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค๋ช…์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Async / await ํ‘œ๊ธฐ๋ฒ•์€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๋” ๋น„์Šทํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์œ„์˜ ๊ฐ„๋‹จํ•œ tokio ์˜ˆ์ œ ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค ( unwrap() ๋ฅผ ? ) :

let response = await!({
    client.get(uri).timeout(Duration::from_secs(10))
})?;

์ ‘๋ฏธ์‚ฌ์‹œ๊ธธ์„ ์ ์šฉํ•˜๋ฉด

let response = client.get(uri).timeout(Duration::from_secs(10))!?

์ด๊ฒƒ์€ ๋™๊ธฐ์‹ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณผ await ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ๋Š” ! ๋ฅผ ์ ‘๋ฏธ์‚ฌ์‹œ๊ธธ๋กœ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๊ทธ ์ œ์•ˆ์ด ์ด์ „ ๋Œ“๊ธ€์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฐ˜๋Œ€ํ‘œ๋ฅผ ์–ป์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ . ๋‚˜๋Š” ๋Š๋‚Œํ‘œ๊ฐ€์ด ๋ฌธ๋งฅ์—์„œ ๋‚˜์—๊ฒŒ ๋‚ด์žฌ ๋œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒํ–ˆ๋‹ค. @ (๋‚ด ๋‘๋‡Œ๋Š” "at"๋กœ ์ฝ์Œ)์™€ # ๋‘˜ ๋‹ค ๋ถ€์กฑํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ์ทจํ–ฅ์˜ ๋ฌธ์ œ์ด์ง€ ๋‚ด ์š”์ ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋งค์šฐ ๋ˆˆ์— ๊ฑฐ์Šฌ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ชจ๋“  ๋Œ€์•ˆ๋ณด๋‹ค ๋‹จ์ผ ๋ฌธ์ž ์ ‘๋ฏธ์‚ฌ์‹œ๊ธธ์„ ๋งค์šฐ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ๊ณ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…๊ณผ ๋น„๋™๊ธฐ์‹ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ „ํ˜€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์ง€ ์•Š์ง€๋งŒ ? ๊ฒฝ์šฐ ์กฐ๊ธฐ ๋ฐ˜ํ™˜๋ณด๋‹ค ์ฝ”๋“œ ํ๋ฆ„์— ๋œ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ง๋กœํ•˜๋ฉด, ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ์—๋Š” ์ฃผ๋กœ ์–‘๋ณด ์ ์— ๊ด€์‹ฌ์ด ์žˆ๊ณ  ์ฝ๋Š” ๋™์•ˆ์—๋Š” ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์“ฐ์—ฌ์ง„ ๊ฒƒ๋ณด๋‹ค ๋” ์ž์ฃผ ์ฝํžˆ๋ฏ€๋กœ await ๋Œ€ํ•ด ๋ˆˆ์— ์ž˜ ๋„์ง€ ์•Š๋Š” ๊ตฌ๋ฌธ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

C # ํŒ€ ๊ฒฝํ—˜์„ ์ƒ๊ธฐ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค (๊ฐ•์กฐ๋Š” ๋‚ด ๊ฒƒ์ž„).

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ 'await'์— ๋Œ€ํ•ด '์•”์‹œ ์ 'ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ด์œ ์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ๊ณ , ์ฝ”๋“œ์—์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ์˜ ์ „๋ฉด ์ค‘์•™์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„, ์‹ฌ์ง€์–ด ๋ช‡ ๋…„์ด ์ง€๋‚œ ํ›„์—๋„ ์ด๋Ÿฌํ•œ ๊ฒฝํ–ฅ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋•Œ๋•Œ๋กœ ์šฐ๋ฆฌ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ์žฅํ™ฉํ•œ ๊ฒƒ์„ ๋ช‡ ๋…„ ํ›„ ํ›„ํšŒ ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ์ข‹์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์ต์ˆ™ํ•ด์ง€๋ฉด ๋” ๊ฐ„๊ฒฐํ•œ ๊ฒƒ์— ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. 'await'๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ์‚ฌ๋žŒ๋“ค์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ทธ ํ‚ค์›Œ๋“œ์˜ ๋ฌด๊ฑฐ์šด ํŠน์„ฑ์„ ์ •๋ง ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹œ๊ธธ ์บ๋ฆญํ„ฐ๋Š” ์ ์ ˆํ•œ ๊ฐ•์กฐ ํ‘œ์‹œ ์—†์ด๋Š” ๊ฑฐ์˜ ๋ณด์ด์ง€ ์•Š์œผ๋ฉฐ ์‹ ๊ทœ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” ๋œ ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค (์ด์ „์— ๋งํ–ˆ๋“ฏ์ด).


๊ทธ๋Ÿฌ๋‚˜์‹œ๊ธธ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋ฉด @ ์•„๋งˆ๋„ ์˜์–ด๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž (์˜ˆ : ๋‚˜)๋ฅผ ํ˜ผ๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ at ๋กœ ์ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๋•Œ ์ž๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ด๋ฆ„์ด ์žˆ์œผ๋ฏ€๋กœ ๊ทธ ์ž์ฒด์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ์ „์ฒด ์ƒํ˜• ๋ฌธ์ž๋กœ ์ดํ•ดํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

@huxi ๋‚˜๋Š” ์ธ์žฅ์ด ์ด๋ฏธ ๊ฝค ๋ฐฐ์ œ ๋œ ๋Š๋‚Œ์„ ๋ฐ›๋Š”๋‹ค. await ๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ์ด์œ ๋Š” Centril์˜ ๊ฒŒ์‹œ๋ฌผ์„ ๋‹ค์‹œ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.


๋˜ํ•œ, postfix๋ฅผ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  "๊ธ€์Ž„, ์‹ค์ œ๋กœ ์—ฐ๊ฒฐ๋  ์ˆ˜์žˆ๋Š” ์‹ค์ œ ์ฝ”๋“œ๊ฐ€ ๋งŽ์ง€ ์•Š์œผ๋ฏ€๋กœ postfix await๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค"๋ผ๋Š” ์‹ค์šฉ์ ์ธ ์ฃผ์žฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์•ฝ๊ฐ„์˜ ์ผํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (๋‚˜์œ ๊ธฐ์–ต ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ ๋„์‚ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค) :

์ œ 2 ์ฐจ ์„ธ๊ณ„ ๋Œ€์ „ ๋‹น์‹œ ์ „ํˆฌ ๊ตญ๊ฐ€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ทธ๊ณณ์—์„œ ๋งŽ์€ ๋น„ํ–‰๊ธฐ๋ฅผ ์žƒ๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์–ด๋–ป๊ฒŒ ๋“  ๋น„ํ–‰๊ธฐ๋ฅผ ๊ฐ•ํ™”ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋“ค์ด ์–ด๋””์— ์ง‘์ค‘ํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ ์ˆ˜์žˆ๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์€ ๋Œ์•„์˜จ ๋น„ํ–‰๊ธฐ๋ฅผ๋ณด๊ณ  ์ด์•Œ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋งž์€ ๊ณณ์„ ๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น„ํ–‰๊ธฐ์—์„œ ํ‰๊ท  70 %์˜ ๊ตฌ๋ฉ์ด ๋‚ ๊ฐœ์—, 10 %๊ฐ€ ์—”์ง„ ์˜์—ญ์—, 20 %๊ฐ€ ๋น„ํ–‰๊ธฐ์˜ ๋‹ค๋ฅธ ์˜์—ญ์— ์žˆ์Œ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ํ†ต๊ณ„๋กœ ๋‚ ๊ฐœ๋ฅผ ๊ฐ•ํ™”ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ! ๊ทธ ์ด์œ ๋Š” ๋Œ์•„์˜จ ๋น„ํ–‰๊ธฐ ๋งŒ๋ณด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋น„ํ–‰๊ธฐ์—์„œ๋Š” ๋‚ ๊ฐœ์˜ ์ด์•Œ ํ”ผํ•ด๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ์•„์˜จ ๋ชจ๋“  ๋น„ํ–‰๊ธฐ๋Š” ์—”์ง„ ์˜์—ญ์— ๊ฒฝ๋ฏธํ•œ ์†์ƒ ๋งŒ ์ž…ํ˜€ ์—”์ง„ ์˜์—ญ์— ํฐ ์†์ƒ์ด ์น˜๋ช…์ ์ด๋ผ๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—”์ง„ ์˜์—ญ์„ ๋Œ€์‹  ๋ณด๊ฐ•ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ์ผํ™”์˜ ์š”์ ์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋Œ€๊ธฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๋ฏธ์‚ฌ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜์žˆ๋Š” ์‹ค์ œ ์ฝ”๋“œ ์˜ˆ์ œ๊ฐ€ ๋งŽ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์ ‘๋‘์‚ฌ ๋Œ€๊ธฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์ต์ˆ™ํ•˜๊ณ  ์ต์ˆ™ํ•˜์ง€๋งŒ ์ ‘๋ฏธ์‚ฌ ๋Œ€๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์ฒด์ธ์„ ์‹œ์ž‘ํ• ์ง€ ๋” ๋งŽ์€ ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆด ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ตœ์„ ์˜ ์กฐ์น˜๋Š” ์•ผ๊ฐ„ ๋นŒ๋“œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์œ ์—ฐ์„ฑ์„ ํ™œ์šฉํ•˜๊ณ  ํ•˜๋‚˜์˜ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ๊ณผ ํ•˜๋‚˜์˜ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ์„ ํƒํ•˜์—ฌ ์–ธ์–ด์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "Obvious Precedence"์ ‘๋‘์‚ฌ์— ํˆฌํ‘œํ•˜๊ณ  .await ์ ‘๋ฏธ์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ์ตœ์ข… ๊ตฌ๋ฌธ ์„ ํƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ฒ˜์Œ์— ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผํ•˜๋ฉฐ,์ด ๋‘ ๊ฐ€์ง€ ๊ตฌ๋ฌธ ์„ ํƒ์€ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ์„ ํƒ์— ๋น„ํ•ด ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์„ ์ œ๊ณต ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ผ๊ฐ„์— ๊ตฌํ˜„ ํ•œ ํ›„์—๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์ฝ”๋“œ ์ž‘์—…์— ๋Œ€ํ•œ ์‚ฌ์šฉ ํ†ต๊ณ„์™€ ์˜๊ฒฌ์„ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ตฌ๋ฌธ ๋…ผ์˜๋ฅผ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋” ๋‚˜์€ ์‹ค์šฉ์ ์ธ ์ฃผ์žฅ์„ ๋ฐ”ํƒ•์œผ๋กœํ•ฉ๋‹ˆ๋‹ค.

@ivandardi ์ผํ™”๋Š” ๋งค์šฐ ๋ฌด๊ฒ๊ณ  IMHO๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌํ–‰ ์‹œ์ž‘์‹œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ฐพ๊ณ  ๋ชจ๋“  ๊ฐ๋„๋ฅผ ์ปค๋ฒ„ํ•˜๋„๋ก ์ƒ๊ธฐ์‹œํ‚ค๋Š” ๋™๊ธฐ ๋ถ€์—ฌ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. ํ† ๋ก . ํŠน์ • ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด์—†๋Š” Rust 2018์— ์ ํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ† ๋ก ์—์„œ ๋‹ค๋ฅธ์ชฝ์— ๋Œ€ํ•ด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ก€ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์ด ๋ณด๊ฑฐ๋‚˜ ๋” ๋งŽ์€ ๋น„์ „์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์˜ ์ž…์žฅ์„ ์ฃผ์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ทธ๋ฆผ์— ๋จธ๋ฌผ๋ฉด์„œ postfix๋Š” ๊ฒฐ์ฝ” ์ง‘์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— postfix๊ฐ€ ์–ธ์–ด๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.).

์‚ฌ๋žŒ๋“ค์€ ์‹ค์ œ๋กœ ์ธก์ •ํ•˜๊ณ  ์‚ดํŽด ๋ดค์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Rust ( ? )์— ์—ฐ๊ฒฐ์— ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์—ฐ๊ฒฐ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/rust/issues/57640#issuecomment -458022676

@cenwangumass ๊ฐ€ ์—ฌ๊ธฐ์— ๋ฉ‹์ง€๊ฒŒ ์ž…๋ ฅ _only_ ์ธก์ •์ด๋ผ๋Š” ๊ฒƒ๋„ ๋ฉ‹์ง€๊ฒŒ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค : https://github.com/rust-lang/rust/issues/57640#issuecomment -457962730. ๊ทธ๋ž˜์„œ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ์ตœ์ข… ์ˆซ์ž๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋‚˜๋Š” postfix๊ฐ€ ์ •๋ง๋กœ ๊ฐˆ ๊ธธ์ด๋ผ๋ฉด ์ฒด์ด๋‹์ด ์ค‘๊ฐ„ ์ง€๋ฐฐ์  ์ธ ์Šคํƒ€์ผ์ด๋˜๋Š” ์ด์•ผ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ API๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์„ ํƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ ๋œ ์ง€๋ฐฐ์  ์ธ ์˜ˆ์ œ ( reqwest )๋Š” 2 ๊ฐœ์˜ await ๋งŒ ํ•„์š”ํ•˜๊ณ  2 ๊ฐœ์˜ await๊ฐ€ ํ•„์š”์—†๋Š” ํŽธ๋ฆฌํ•œ ์ฒด์ธ API๋Š” ์˜ค๋Š˜๋‚  ์‰ฝ๊ฒŒ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฐ๊ตฌ ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์š”๊ตฌ์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ, ๊ธฐ๋‹ค๋ฆผ์ด ์ด๋ฏธ ์‹ฌ๊ฐํ•˜๊ฒŒ ์ง€์—ฐ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์—ฐ๊ตฌ ๋‹จ๊ณ„ ๋“  ๋” ์•…ํ™” ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋งŽ์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์Šค์Šค๋กœ ์—ฐ์„ค ์„ธํŠธ๋ฅผ ์กฐ๋ฆฝํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž ์กฐ์‚ฌ๋ฅผ ์›ํ•˜์ง€๋งŒ ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์„ค์ •๊ณผ ์‹คํ–‰์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

@Pzixel ๋•Œ๋ฌธ์— ๋ฆฌ ๋ฐ”์ธ๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

let foo = await some_future();
let bar = await {
                await {other_future()}?.bar_async()
          }?;

๊ฐ™์ด

```
let foo = await some_future ();
let bar = await {other_future ()} ?. bar_async ();
let bar = await {bar} ?;

@Pzixel C # ํŒ€ ๊ฒฝํ—˜ ๊ฒฌ์ ์— ๋Œ€ํ•œ ์†Œ์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด๊ฐ€ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ์ด ๋Œ“๊ธ€ ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋น„๋‚œ์ด๋‚˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด ํ…์ŠคํŠธ๋ฅผ ์ฝ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋‘๋‡Œ๋Š” ์ด๋ฉ”์ผ ์ฃผ์†Œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— @ ๋ฅผ "at"๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ƒ์ง•์€ ๋‚˜์˜ ๋ชจ๊ตญ์–ด๋กœ "Klammeraffe"๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ ๋Œ€๋žต "์ง‘์ฐฉ ์›์ˆญ์ด"๋กœ ๋ฒˆ์—ญ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ๋‘๋‡Œ๊ฐ€ ๋Œ€์‹ ์— "at"์— ์ •์ฐฉ ํ•œ ๊ฒƒ์„ ์‹ค์ œ๋กœ ๊ฐ์‚ฌํ•œ๋‹ค.

๋น„๊ต์  ์ƒˆ๋กœ์šด Rust ์‚ฌ์šฉ์ž๋กœ์„œ 2 ์„ผํŠธ์ž…๋‹ˆ๋‹ค (C ++ ๋ฐฐ๊ฒฝ์ด ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

์—ฌ๋Ÿฌ๋ถ„ ์ค‘ ์ผ๋ถ€๋Š” ์‹ ๊ทœ ์ด๋ฏผ์ž๋ฅผ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ฐ”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์šฐ์„ , await!( ... ) ๋งคํฌ๋กœ๋Š” ์‚ฌ์šฉ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์˜คํ•ด ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ ์—†์–ด์„œ๋Š” ์•ˆ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. println!() , panic!() , ...์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ด๋ฉฐ ๊ฒฐ๊ตญ try! ์ผ์–ด๋‚œ ์ผ์ž…๋‹ˆ๋‹ค.
  • ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋„ ๊ฐ„๋‹จํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ•„๋“œ, ํ•จ์ˆ˜ ๋˜๋Š” ๋งคํฌ๋กœ์˜ ์ ‘๋ฏธ์‚ฌ ๋ฒ„์ „์€ IMHO๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์˜จ ์‚ฌ๋žŒ๋“ค์ด "์ข‹์•„, ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜๋Š” ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. "๋น„์ •์ƒ์ "์ด์ง€๋งŒ "์™œ ์•ˆ ๋˜๋Š”๊ฐ€"์ž…๋‹ˆ๋‹ค.
  • ์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ ํ‘œ๊ธฐ๋ฒ•์— ๊ด€ํ•ด์„œ๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. await ๋” ๋‹จ๋‹จํžˆ ๋ฌถ์—ฌ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋งˆ์Œ์„ ์‚ฌ๋กœ ์žก์„ ๊ฒƒ์ด๋ฉฐ, ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” ๋ช…ํ™•ํ•˜๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๊ด„ํ˜ธ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์„ ์„ ํ˜ธ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (์ฒด์ธ ์—ฐ๊ฒฐ ์—ฌ๋ถ€).
  • ์„คํƒ•์ด ์—†๋Š” ๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„๋Š” ์ดํ•ดํ•˜๊ณ  ๊ฐ€๋ฅด์น˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฃผ๋ณ€์— ์„คํƒ•์„ ์†Œ๊ฐœํ•˜๋ ค๋ฉด await? ๋ฅผ ์œ ์šฉํ•œ ํ‚ค์›Œ๋“œ๋กœ ๋ถ€๋ฅด์„ธ์š”. ๋ฒˆ๊ฑฐ๋กœ์šด ๊ด„ํ˜ธ๊ฐ€ ํ•„์š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
    `` c# let response = (await http::get("https://www.rust-lang.org/"))?; // see kids? ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค ... unwraps the future, so you have to use ? to unwrap the Result // but there is some sugar if you want, thanks to the await?`์—ฐ์‚ฐ์ž
    ์‘๋‹ตํ•˜์ž = ๊ธฐ๋‹ค๋ ค? http :: get ( "https://www.rust-lang.org/");
    // ๊ทธ๋Ÿฌ๋‚˜์ด ๊ตฌ๋ฌธ์€ ์ฝ์„ ์ˆ˜์žˆ๋Š” ์ฒด์ธ ์ฝ”๋“œ๋กœ ์ด์–ด์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฒด์ธ์„ ์—ฐ๊ฒฐํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.
- sigils can be understood quite easily *if the chosen character makes sense* if it is introduced to be "the `?` for futures".

That being said, since no agreement seems to be reached, I think it would be reasonable to ship `await!()` to stable Rust. Then this discussion can be extended without blocking the whole process. Same that what happened for `try!()`/`?`, so again newcomers won't be lost. And if [Simple postfix macros](https://github.com/rust-lang/rfcs/pull/2442) get accepted, the problem will disappear since we'll get postfix macro for "free".

---

Just a thought, what about a postfix keyword, but which can be put as prefix as well, similar in some ways to the `const` keyword of C++? (I don't know if that was already proposed) In prefix position, it behaves like "prefix `await` with obvious precedence and optional sugar":
```c#
// preferred without chaining:
let response = await? http::get("https://www.rust-lang.org/");

// but also possible: (rustfmt warning)
let response = http::get("https://www.rust-lang.org/") await?;
let response = (http::get("https://www.rust-lang.org/") await)?;
let response = (await http::get("https://www.rust-lang.org/"))?;

// chains well
let matches = http::get("https://www.rust-lang.org/") await?
    .body?
    .async_regex_search("(?=(\d+))\w+\1") await;

// any of these are also allowed, but arguably ugly (rustfmt warning again)
let matches = await ((http::get("https://www.rust-lang.org/") await?)
    .body?
    .async_regex_search("(?=(\d+))\w+\1"));
let matches = (await? http::get("https://www.rust-lang.org/"))
    .body?
    .async_regex_search("(?=(\d+))\w+\1") await;
let matches = await http::get("https://www.rust-lang.org/") await?
        .body?
        .async_regex_search("(?=(\d+))\w+\1");
let matches = await (await http::get("https://www.rust-lang.org/"))?
    .body?
    .async_regex_search("(?=(\d+))\w+\1");
let matches = await!(
    http::get("https://www.rust-lang.org/")) await?
        .body?
        .async_regex_search("(?=(\d+))\w+\1")
);
let matches = await { // <-- parenthesis or braces optional here, but they clarify
    (await? http::get("https://www.rust-lang.org/"))
        .body?
        .async_regex_search("(?=(\d+))\w+\1")
};

๊ทธ๊ฒƒ์„ ๊ฐ€๋ฅด์น˜๋Š” ๋ฐฉ๋ฒ• :

  • ( await!() ๋งคํฌ๋กœ ๊ฐ€๋Šฅ)
  • ์ฒด์ธ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๋•Œ ๊ถŒ์žฅ๋˜๋Š” ์ ‘๋‘์‚ฌ, ์„คํƒ• (์œ„ ์ฐธ์กฐ)
  • ์—ฐ๊ฒฐ์‹œ ๊ถŒ์žฅ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ
  • ํ˜ผํ•ฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐํ•ฉ ์ž์™€ ์—ฐ๊ฒฐ์‹œ ์ ‘๋‘์‚ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋‚ด ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์ ‘๋‘์‚ฌ await๋Š” ์—ฐ๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฒด์ด๋‹์€ ๋‚ด ์˜๊ฒฌ์œผ๋กœ๋Š” ๊ฐ€๋…์„ฑ์„ ์žƒ์ง€ ์•Š๊ณ  ์ ‘๋‘์‚ฌ await ๋ฐ f.then(x => ...) ์™€ ๊ฐ™์€ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Javascript ์ฝ”๋“œ์— ๋งŽ์ด ์ถ”๊ฐ€ํ•˜๋ฉฐ ์ ‘๋ฏธ์‚ฌ๋ฅผ ์œ„ํ•ด ๊ฒฐํ•ฉ๊ธฐ๋ฅผ ๊ตํ™˜ ํ•  ํ•„์š”๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•  ๊ฒƒ:

let ret = response.await!().json().await!().to_string();

์™€ ๊ฐ™๋‹ค:

let ret = await future.then(|x| x.json()).map(|x| x.to_string());

๋‚˜๋Š” combinator ์ฒด์ธ ์œ„์— postfix์˜ ์ด์ ์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์‹ค์ œ๋กœ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ ์˜ˆ์—์„œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ์—์„œ ๊ฐ€๋…์„ฑ, ์—ฐ๊ฒฐ ๋˜๋Š” ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {

    let user = await? fetch(format!("/user/{0}", name).as_str())
        .map(|x| serde_json::from_str::<User>(x?))
        .then(|x| fetch(format!("/permissions/{0}", x?.id).as_str()))
        .map(|x| serde_json::from_str::<Vec<Permission>>(x?));

    Ok(user)
}

์ด ์ ‘๋‘์‚ฌ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ์นœ์ˆ™ ํ•จ.
  • ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ์™€์˜ ์ •๋ ฌ (return, break, continue, yield ๋“ฑ).
  • ์—ฌ์ „ํžˆ Rust์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค (์ดํ„ฐ๋ ˆ์ดํ„ฐ์—์„œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒฐํ•ฉ ์ž ํฌํ•จ).

Async / await๋Š” ์–ธ์–ด์— ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ฉฐ,์ด ์ถ”๊ฐ€ ๋ฐ ์•ˆ์ •ํ™” ์ดํ›„ ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์€ ๋ฏธ๋ž˜ ๊ด€๋ จ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ Rust๋กœ ์ฒ˜์Œ์œผ๋กœ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐœ๊ฒฌ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋น„๋™๊ธฐ์˜ ๊ฐœ๋…์€ ์ด๋ฏธ ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ์–ธ์–ด ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ๋ฅผ ๋ชจ๋‘ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

@huxi ์˜ˆ, ์ด๋ฏธ ์œ„์— ๋งํฌํ–ˆ์ง€๋งŒ ๋ฌผ๋ก  ๋‹ค์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/rust-lang/rust/issues/50547#issuecomment -388939886

๋‚ด ๋‘๋‡Œ๋Š” @๋ฅผ ์ด๋ฉ”์ผ ์ฃผ์†Œ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— "at"์œผ๋กœ ๋ฒˆ์—ญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ƒ์ง•์€ ๋‚˜์˜ ๋ชจ๊ตญ์–ด๋กœ "Klammeraffe"๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ ๋Œ€๋žต "์ง‘์ฐฉ ์›์ˆญ์ด"๋กœ ๋ฒˆ์—ญ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ๋‘๋‡Œ๊ฐ€ ๋Œ€์‹ ์— "at"์— ์ •์ฐฉ ํ•œ ๊ฒƒ์„ ์‹ค์ œ๋กœ ๊ฐ์‚ฌํ•œ๋‹ค.

๋น„์Šทํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ ์–ธ์–ด๋กœ๋Š” "๊ฐœ"์ด์ง€๋งŒ ์ด๋ฉ”์ผ ์ฝ๊ธฐ์—๋Š” ์˜ํ–ฅ์„์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜๋„ ๊ฒฝํ—˜์„ ๋ณด๋‹ˆ ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค.

@llambda ์งˆ๋ฌธ์€ ์ฒด์ธ์— ๊ด€ํ•œ ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ถ”๊ฐ€ ๋ณ€์ˆ˜๋ฅผ ๋„์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  await? foo ๋˜๋Š” foo await? ๋Œ€์‹  await { foo }? foo await? ๊ฐ€) ์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋ฟก ๋นต๋€จ
์ข‹์€ ๊ฒŒ์‹œ๋ฌผ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‘ ๋ฒˆ์งธ ์ œ์•ˆ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋„์ž…ํ•˜๋ฉด ํ˜ผ๋ž€๊ณผ ๋ฌธ์ œ ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด rustfmt ์˜ต์…˜์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ๊ฐ€ ์—‰๋ง์ด๋ฉ๋‹ˆ๋‹ค.

@Hirevo async/await ์€ (๋Š”) ๊ฒฐํ•ฉ๊ธฐ ์—์„œ ํ•„์š”๋ฅผ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. "ํ•˜์ง€๋งŒ ์ฝค๋น„ ๋„ค์ดํ„ฐ๋งŒ์œผ๋กœ๋Š” ํ•  ์ˆ˜์žˆ๋‹ค"๋กœ ๋Œ์•„ ๊ฐ€์ง€ ๋ง์ž. ๊ท€ํ•˜์˜ ์ฝ”๋“œ๋Š”

future.then(|x| x.json()).map(|x| x.to_string()).map(|ret| ... );

๊ทธ๋Ÿผ async/await ์ œ๊ฑฐํ•ฉ์‹œ๋‹ค.

์ฆ‰, ๊ฒฐํ•ฉ์ž๋Š” ํ‘œํ˜„๋ ฅ์ด ๋–จ์–ด์ง€๊ณ  ๋œ ์„ค๋“๋ ฅ์ด ์žˆ์œผ๋ฉฐ ๋•Œ๋กœ๋Š” await ๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (์˜ˆ : ๋Œ€๊ธฐ ์ง€์  ๊ฐ„ ์ฐจ์šฉ ( Pin ์šฉ๋„)).

๋‹ค์Œ ์ฝ”๋“œ์—์„œ ๊ฐ€๋…์„ฑ, ์—ฐ๊ฒฐ ๋˜๋Š” ์šฐ์„  ์ˆœ์œ„ ๋ฌธ์ œ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {

    let user = await? fetch(format!("/user/{0}", name).as_str())
        .map(|x| serde_json::from_str::<User>(x?))
        .then(|x| fetch(format!("/permissions/{0}", x?.id).as_str()))
        .map(|x| serde_json::from_str::<Vec<Permission>>(x?));

    Ok(user)
}

๋‚˜๋Š”ํ•œ๋‹ค:

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
    let user = fetch(format!("/user/{0}", name).as_str()) await?;
    let user: User = serde_json::from_str(user);
    let permissions =  fetch(format!("/permissions/{0}", x.id).as_str()) await?;
    let permissions: Vec<Permission> = serde_json::from_str(permissions );
    Ok(user)
}

์ด์ƒํ•œ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฌธ์ œ ์—†์–ด์š”:

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
    let user = dbg!(fetch(format!("/user/{0}", name).as_str()) await?);
    let user: User = dbg!(serde_json::from_str(user));
    let permissions = dbg!(fetch(format!("/permissions/{0}", x.id).as_str()) await?);
    let permissions: Vec<Permission> = dbg!(serde_json::from_str(permissions));
    Ok(user)
}

๊ฒฐํ•ฉ ์ž์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๊ฒŒํ•˜๋Š” ๊ฒƒ์€ ๋” ๋ฒˆ๊ฑฐ ๋กญ์Šต๋‹ˆ๋‹ค. ์–ธ๊ธ‰ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•˜์—ฌ ๋‹น์‹ ์˜ ? ์—์„œ then / map ๊ธฐ๋Šฅ ๊ฒƒ์ž…๋‹ˆ๋‹ค ์˜ˆ์ƒํ•˜๊ณ ์—†๋Š” ์ฝ”๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ์ž‘ํ’ˆ์œผ๋กœํ•˜์ง€ ์ž‘์—… into_future() ์™€ ๋‹ค๋ฅธ async/await ํ๋ฆ„์—์„œ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ด์ƒํ•œ ๊ฒƒ.

๋‚˜๋Š” ๋‚ด ์ œ์•ˆ์ด async ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŽ์€ ๋ฒ•์  ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•œ๋‹ค๋Š” ์ ์—์„œ ์ตœ์ ์ด ์•„๋‹ˆ๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทœ์น™์€ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์šฐ๋ฆฌ์˜ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ๋งํ•˜๋ฉด ํ—ˆ์šฉ๋˜๋Š” ๋งŽ์€ ๋ณ€ํ˜•์ด ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • await!(...) , try!() ๋ฐ println!() ์™€ ๊ฐ™์€ ์ž˜ ์•Œ๋ ค์ง„ ๋งคํฌ๋กœ์™€์˜ ์ผ๊ด€์„ฑ
  • await , await(...) , await { ... } , ์ฆ‰. ์„คํƒ•์—†๋Š” ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ
  • await? , await?() , await? {} , ์ฆ‰. ์„คํƒ•์œผ๋กœ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ
  • ... await , ์ฆ‰. ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ (+ ... await? , ์„คํƒ•์€ ์•„๋‹˜)
  • ์ด๋“ค์˜ ๋ชจ๋“  ์กฐํ•ฉ, ๊ทธ๋Ÿฌ๋‚˜ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( ๋‚ด ์ด์ „ ๊ฒŒ์‹œ๋ฌผ ์ฐธ์กฐ)

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ๋ณผ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

  • Result ์—†๋Š” ์ ‘๋‘์‚ฌ : await ๋˜๋Š” await { ... } ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธด ์‹์œผ๋กœ ๋ช…ํ™•ํžˆ
  • Result ์ ‘๋‘์‚ฌ : await? ๋˜๋Š” await? {} ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธด ์‹์œผ๋กœ ๋ช…ํ™•ํžˆ
  • ์—ฐ๊ฒฐ์‹œ ์ ‘๋ฏธ์‚ฌ : ... await , ... await?

await! () ๋งคํฌ๋กœ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๋ฐฐ์†กํ•˜๋ ค๋ฉด +1ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์ผ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๐Ÿ˜„

์ด ํŒจํ„ด์ด ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ๋งŽ์€ ์ถ”์ธก์ด ์žˆ์œผ๋ฉฐ ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ธ์ฒด ๊ณตํ•™์— ๋Œ€ํ•œ ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์šฐ๋ ค์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋ฐ˜๋ณต์  ์ธ ๋ณ€๊ฒฝ์ด ๋  ์ˆ˜์—†๋Š” ์ด์œ ๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‚˜์ค‘์— ์ตœ์ ํ™”๋ฅผ ์•Œ๋ฆด ์ˆ˜์žˆ๋Š” ์‹ค์ œ ์‚ฌ์šฉ๋Ÿ‰ ๋ฉ”ํŠธ๋ฆญ์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •).

๋น„๋™๊ธฐ Rust๋ฅผ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์ด ์ดํ›„์˜ _optional_ ๋ฆฌํŒฉํ† ๋ง ๋…ธ๋ ฅ๋ณด๋‹ค ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ํ‘œํ˜„์ ์ธ ๊ตฌ๋ฌธ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฉ”์ด์ € ํฌ๋ ˆ์ดํŠธ / ํ”„๋กœ์ ํŠธ์— ๋” ํฐ ๋…ธ๋ ฅ์ด ๋“ ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๊ทธ ์ฑ„ํƒ ๋…ธ๋ ฅ์ด ์ง€๊ธˆ ์‹œ์ž‘๋  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ•๋ ฅํžˆ ์˜นํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†๋˜๋Š” ๋ถˆํ™•์‹ค์„ฑ์€ ๊ณ ํ†ต์„ ์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—‰
(๋จผ์ € fetch_user ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” async / await๊ฐ€ ์“ธ๋ชจ์—†๊ณ  combinator๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.
Await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ๋กœ ์œ ์šฉํ•˜๊ณ  ๊ฒฐํ•ฉ ์ž๋งŒ์œผ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ๋™์ผํ•œ ๋ฒ”์œ„ ๋‚ด์˜ ๋ณ€์ˆ˜์— ๋ฏธ๋ž˜ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
await๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ์š”์ ์ด ์•„๋‹™๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋‹จ์ง€ ์ฝค๋น„ ๋„ค์ดํ„ฐ๊ฐ€ await์™€ ์•„์ฃผ ์ž˜ ์–ด์šธ๋ฆด ์ˆ˜ ์žˆ๊ณ , ์ฝค๋น„ ๋„ค์ดํ„ฐ์— ์˜ํ•ด ๊ตฌ์ถ• ๋œ ์ „์ฒด ํ‘œํ˜„์‹์„ ๊ธฐ๋‹ค๋ฆผ์œผ๋กœ์จ ๋งŒ ์—ฐ๊ฒฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค ( await (await fetch("test")).json() ๋˜๋Š” await { await { fetch("test") }.json() } ์˜ ํ•„์š”์„ฑ ์ œ๊ฑฐ).

๋‚ด ์ฝ”๋“œ ์˜ˆ์ œ์—์„œ ? ๋Š” ๋‹จ๋ฝ์— ์˜ํ•ด ์˜๋„ ํ•œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ ํด๋กœ์ €๊ฐ€ ์ „์ฒด ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ Err(...) ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค (ํ•ด๋‹น ๋ถ€๋ถ„์€ await? ์ฒ˜๋ฆฌ๋จ). ์ „์ฒด ์ฒด์ธ์—์„œ).

๋‚ด ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ๋ฐ”์ธ๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ฒด์ธ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๋””๋ฒ„๊น… ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์€ ํ•„์š”ํ•œ dbg๋งŒ์œผ๋กœ ๋˜‘๊ฐ™์€ ๋™์ž‘์„ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๋” ์ด์ƒ์€ ์—†์Šต๋‹ˆ๋‹ค (์ถ”๊ฐ€ ๊ด„ํ˜ธ๋„ ์•„๋‹˜) :

async fn fetch_permissions(name: &str) -> Result<Vec<Permission>, Error> {
    let user = await? fetch(format!("/user/{0}", name).as_str())
        .map(|x| dbg!(serde_json::from_str::<User>(dbg!(x)?)))
        .then(|x| fetch(format!("/permissions/{0}", x?.id).as_str())))
        .map(|x| dbg!(serde_json::from_str::<Vec<Permission>>(dbg!(x)?)));
    Ok(user)
}

๊ฒฐํ•ฉ ์ž๋‚˜ ์ถ”๊ฐ€ ๋ฐ”์ธ๋”ฉ์ด๋‚˜ ๊ด„ํ˜ธ์—†์ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.
์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ ๋ฒ”์œ„๋ฅผ ์ž„์‹œ ๋ณ€์ˆ˜๋กœ ์ฑ„์šฐ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐ์„ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹จ์ง€ ๊ฒฐํ•ฉ์ž๊ฐ€ ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ทธ๊ฒƒ์˜ ์—ฐ๊ฒฐ ๋Šฅ๋ ฅ์— ๊ด€ํ•œ ํŠน์ • ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๋•Œ ๋ฌด์‹œํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ, ํ˜ธ๊ธฐ์‹ฌ์œผ๋กœ ์ธํ•ด .into_future() ์—†์ด ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ์ด๋ฏธ ๋ฏธ๋ž˜์ž…๋‹ˆ๊นŒ? (์ €๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ด๋ฏธ ๋ฏธ๋ž˜ ์ผ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค)?

fut await ์˜ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ‘œํ˜„์‹์—๋Š” ์ž์—ฐ์–ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ํŠน์ • ๊ฐ’์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ for value in collection {..} ์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์—์„œ a + b ์“ฐ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. ( "a plus b") ๋Œ€์‹  a b + ์ด๊ณ  "await something"์„ ์“ฐ๊ฑฐ๋‚˜ ์ฝ๋Š” ๊ฒƒ์€ "something await"๋ณด๋‹ค ์˜์–ด (๋ฐ ๊ธฐํƒ€ SVO ์–ธ์–ด)์—์„œ ํ›จ์”ฌ ๋” ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ? ๋Œ€์‹  try ํ‚ค์›Œ๋“œ : let val = foo() try; ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.

fut.await!() ๋ฐ fut.await() ์€ (๋Š”) ์ต์ˆ™ํ•œ ์ฐจ๋‹จ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๊ทธ๋Ÿฌ๋‚˜ "๋งคํฌ๋กœ"๋Š” ๊ด€๋ จ "๋งˆ๋ฒ•"์„ ์ถ”๊ฐ€๋กœ ๊ฐ•์กฐ ํ•จ). ๋ถ„๋ฆฌ ๋œ ๊ณต๋ฐฑ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์ธ์‹๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์–ด. ์‹œ๊ธธ์€ ์ž์—ฐ์–ด ๊ตฌ๋ฌธ๊ณผ ์ง์ ‘์ ์ธ ์œ ์‚ฌ์ ์—†์ด ์ข€ ๋” ์ถ”์ƒ์  ์ธ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅด๊ฒŒ ์ธ์‹ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ ์‚ฌ๋žŒ๋“ค์ด ์ œ์•ˆ ๋œ์‹œ๊ธธ์„ ์ฝ๋Š” ๋ฐฉ์‹์€ ๋ฌด๊ด€ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ํ‚ค์›Œ๋“œ๋ฅผ ๊ณ ์ˆ˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด ์ ‘๋‘์‚ฌ ๋ณ€ํ˜•์—์„œ๋งŒ ์„ ํƒํ•ด์•ผํ•œ๋‹ค๊ณ  ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋ฏฟ์Šต๋‹ˆ๋‹ค.

@rpjohnst ๋‹น์‹ ์˜ ์š”์ ์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. actual_fun(a + b)? ์™€ break (a + b)? ๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•˜๋ฏ€๋กœ await(a + b)? ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €๋Š”์ด ํ† ๋ก ์„ ๋ฉ€๋ฆฌ์„œ ๋”ฐ๋ผ ์™”๊ณ  ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ๊ณผ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฒซ ๋ฒˆ์งธ ์˜๊ฒฌ์€ .await!() ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์ ์„ ์ œ์™ธํ•˜๊ณ  Centril์˜ ๋ชจ๋“  ์ฃผ์š” ๋ชฉํ‘œ๋ฅผ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

" await ์€ (๋Š”) ํ–ฅํ›„ ์–ธ์–ด ๋””์ž์ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค."

์•ž์œผ๋กœ await ํ‚ค์›Œ๋“œ์˜ ๋‹ค๋ฅธ ์šฉ๋„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?


ํŽธ์ง‘ : ์ •ํ™•ํžˆ await ๊ธฐ๋Šฅ์„ ์˜คํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ์ž˜๋ชป๋œ ์ง„์ˆ ์„ ํ›‘์–ด๋ณด๊ณ  ์˜ˆ์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜๊ฒฌ์€ Rust์˜ await ํ‚ค์›Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ await ์™€๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ผ์„ํ•˜๋ฉฐ ์ด๋Š” ํ˜ผ๋ž€๊ณผ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ์œ ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

async function waitFor6SecondThenReturn6(){
  let result1 = await waitFor1SecondThenReturn1(); // executes first
  let result2 = await waitFor2SecondThenReturn2(); // executes second
  let result3 = await waitFor3SecondThenReturn3(); // executes third
  return result1 + result2 + result3;
}

์ ‘๋‘์‚ฌ async ๊ฐ€ ๋น„๋™๊ธฐ ๊ฐ’์ด ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ๊ตฌ์„ฑ๋œ ์ƒํƒœ ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€์ž„์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

async function waitFor6SecondThenReturn6(){
  let async result1 = waitFor1SecondThenReturn1(); // executes first
  let async result2 = waitFor2SecondThenReturn2(); // executes second
  let async result3 = waitFor3SecondThenReturn3(); // executes third
  return result1 + result2 + result3;
}

async ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ async ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋น„๋™๊ธฐ ๊ธฐ๊ณ„๊ฐ€ ์žˆ๊ณ  ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ง๊ด€์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ตฌ๋ฌธ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ๊ณผ ๋ช…ํ™•ํ•œ ๊ตฌ์„ฑ ์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜๋Š” ์œ„์น˜๋ฅผ ๋ช…ํ™•ํžˆํ•˜๊ณ  ๋” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๊ณ  ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ .await!() ๋Œ€ํ•œ ๋™๊ธฐ์‹ ๋ณด์™„ ์—ญํ• ์„ํ•ฉ๋‹ˆ๋‹ค.

์ด์ „ ์ ˆ์ฐจ ์Šคํƒ€์ผ ์˜ˆ์ œ์—์„œ ์ผ๋ถ€ ํ‘œํ˜„์‹์˜ ๋์—์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ await ๋ฅผ ์•Œ์•„ ์ฐจ๋ฆฌ์ง€ ๋ชป ํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ์€์ด ์ œ์•ˆ ๋œ ๊ตฌ๋ฌธ์œผ๋กœ ํ‘œ์‹œ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
    let async user = dbg!(fetch(format!("/user/{0}", name).as_str()));
    let user: User = dbg!(serde_json::from_str(user?));
    let async permissions = dbg!(fetch(format!("/permissions/{0}", user.id).as_str()));
    let permissions: Vec<Permission> = dbg!(serde_json::from_str(permissions?));
    Ok(user)
}

(์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•  ์ˆ˜์žˆ๋Š” .dbg!() ๋งคํฌ๋กœ์— ๋Œ€ํ•œ ์ฃผ์žฅ๋„ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ํฌ๋Ÿผ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

Tue, Jan 29, 2019 at 11:31:32 PM -0800, Sphericon์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

์ €๋Š”์ด ํ† ๋ก ์„ ๋ฉ€๋ฆฌ์„œ ๋”ฐ๋ผ ์™”๊ณ  ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ๊ณผ ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฒซ ๋ฒˆ์งธ ์˜๊ฒฌ์€ .await!() ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์ ์„ ์ œ์™ธํ•˜๊ณ  Centril์˜ ๋ชจ๋“  ์ฃผ์š” ๋ชฉํ‘œ๋ฅผ ์ถฉ์กฑํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

" await ์€ (๋Š”) ํ–ฅํ›„ ์–ธ์–ด ๋””์ž์ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค."

.await!() ๊ตฌ๋ฌธ์˜ ์ฃผ์š” ์ง€์ง€์ž ์ค‘ ํ•œ ๋ช…์œผ๋กœ์„œ ์ €๋Š”
์ ˆ๋Œ€์ ์œผ๋กœ await ๊ฐ€ ํ‚ค์›Œ๋“œ๋กœ ๋‚จ์•„ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€
์–ด์จŒ๋“  ์ปดํŒŒ์ผ๋Ÿฌ์— ๋นŒ๋“œํ•˜๋ ค๋ฉด .await!() ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜์ฐฎ์€.

ํžˆ ๋ ˆ๋ณด

๋‚ด ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ๋ฐ”์ธ๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ฒด์ธ ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด "์ฒด์ธ ์—ฐ๊ฒฐ"์ ‘๊ทผ ๋ฐฉ์‹์„ ์–ป์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ฒด์ด๋‹์€ ์ข‹์„ ๋•Œ ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์“ธ๋ชจ์—†๋Š” ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. "๋‹น์‹ ์€ ์ฒด์ธ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์•„๋ฌด๋Ÿฐ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋””๋ฒ„๊น… ๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋‹ค์Œ์€ ํ•„์š”ํ•œ dbg๋งŒ์œผ๋กœ ๋˜‘๊ฐ™์€ ๋™์ž‘์„ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๋” ์ด์ƒ์€ ์—†์Šต๋‹ˆ๋‹ค (์ถ”๊ฐ€ ๊ด„ํ˜ธ์กฐ์ฐจ๋„)

์•„๋‹ˆ, ๋‹น์‹ ์ด ํ•œ

async fn fetch_user(name: &str) -> Result<Vec<Permission>, Error> {
    let user = fetch(format!("/user/{0}", name).as_str()) await?;
    let user: User = dbg!(serde_json::from_str(dbg!(user)));
    let permissions =  fetch(format!("/permissions/{0}", x.id).as_str()) await?;
    let permissions: Vec<Permission> = dbg!(serde_json::from_str(dbg!(permissions));
    Ok(user)
}

๊ฐ™์€ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” combinator๊ฐ€ await์™€ ๋งค์šฐ ์ž˜ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๊ณ , ์—ฐ๊ฒฐ ๋ฌธ์ œ๋Š” combinator์— ์˜ํ•ด ๊ตฌ์ถ• ๋œ ์ „์ฒด ํ‘œํ˜„์‹์„ ๊ธฐ๋‹ค๋ฆผ์œผ๋กœ์จ ํ•ด๊ฒฐ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. {await {fetch ( "test")} .json ()}).

์ ‘๋‘์‚ฌ await ์˜ ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ์ด๋ฉฐ ๋‹ค๋ฅธ ํ˜•ํƒœ์˜ ๊ฒฝ์šฐ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒฐํ•ฉ ์ž๋‚˜ ์ถ”๊ฐ€ ๋ฐ”์ธ๋”ฉ์ด๋‚˜ ๊ด„ํ˜ธ์—†์ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ”์ธ๋”ฉ ๊ฐ’์„ ์ธ์‡„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•  ์ˆ˜์—†๋Š” ๋””๋ฒ„๊ฑฐ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐ”์ธ๋”ฉ์€ ํ•ญ์ƒ ๋…์ž์—๊ฒŒ ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์‹ค์ œ๋กœ ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฐฉ๊ธˆ let user = ... ํ–ˆ๋˜ ๊ณณ์—์„œ labmda |user| ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์ด์ œ์ด ์ฝ”๋“œ๋Š” ์ฝ๊ธฐ ์–ด๋ ต๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๋ถ€๋ชจ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค (์˜ˆ : ์ž์ฒด ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ๋ฉ”์„œ๋“œ ์ฒด์ธ์—์„œ ์™ธ๋ถ€ ์ ์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ๋ž˜ํ•‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ).


๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์ฒด์ธ์€ ๊ทธ ์ž์ฒด๋กœ ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ์ค‘ ํ•˜๋‚˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ 6 ๋…„ ์ด์ƒ์— ๋Œ€ํ•œ ๋น„๋™๊ธฐ / await๋ฅผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‚˜๋Š” ๋‹น์‹ ์ด ์ด์ œ๊นŒ์ง€ ์ฝ”๋“œ ๋น„๋™๊ธฐ ์ฒด์ธ ์“ฐ๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค ๋ฏฟ๋Š”๋‹ค. ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹ˆ๋ผ ๋ถˆํŽธํ•˜๊ณ  ๋ฐ”์ธ๋”ฉ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํ•ญ์ƒ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ์ฝค๋น„ ๋„ค์ดํ„ฐ๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. async/await ๊ฒฝ์šฐ futures / streams ์— ์ด๋Ÿฌํ•œ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ join ๋ฐ select ๋‘ ๊ฐ€์ง€๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@Sphericon AFAIK ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” await ๋ฅผ ํ‚ค์›Œ๋“œ ๋˜๋Š”์‹œ๊ธธ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋™์˜ ํ–ˆ์œผ๋ฏ€๋กœ async ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์•„์ด๋””์–ด์—๋Š” ๋‹ค๋ฅธ RFC๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์˜๊ฒฌ์€ Rust์˜ await ํ‚ค์›Œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ await์™€๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ผ์„ํ•˜๋ฉฐ ์ด๊ฒƒ์€ ํ˜ผ๋ž€๊ณผ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ์œ ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ํ“จ์ฒ˜๊ฐ€ ํด ๊ธฐ๋ฐ˜์ด๋ผ๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด JS / C # await์˜ ์ฐจ์ด์ ์„ ๋ณด์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ async/await ์ฒ˜๋ฆฌ ํ•  ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ œ์•ˆ ๋œ await? ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ๊ณผ ๊ด€๋ จํ•˜์—ฌ :
```C #
let foo = await? bar_async ();

How would this look with ~~futures of futures~~ result of results *) ? I.e., would it be arbitrarily extensible:
```C#
let foo = await?? double_trouble();

IOW, ์ ‘๋‘์‚ฌ await? ๋Š” ๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ํŠน์ˆ˜ํ•œ ๊ตฌ๋ฌธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

) * ์ˆ˜์ • ๋จ.

๋ฏธ๋ž˜์˜ ๋ฏธ๋ž˜์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋ณด์ผ๊นŒ์š”? ์ฆ‰, ์ž„์˜๋กœ ํ™•์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

let foo = await?? double_trouble();

IOW, await? ๋Š” ๋‚˜์—๊ฒŒ ๋„ˆ๋ฌด ํŠน์ˆ˜ํ•œ ๊ตฌ๋ฌธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@rolandsteiner by "futures of futures"๋Š” impl Future<Output = Result<Result<_, _>, _>> ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ ( await + ? 2 ๊ฐœ๋Š” ์ค‘์ฒฉ ๋œ ์„ ๋ฌผ์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ๋‚˜์—๊ฒŒ ๋‹จ์ผ ์„ ๋ฌผ๊ณผ 2 ๊ฐœ์˜ ๊ฒฐ๊ณผ๋ฅผ "์–ธ ๋ž˜ํ•‘"ํ•œ๋‹ค๋Š” ์˜๋ฏธ) ).

await? _is_ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ด์ง€๋งŒ await ์˜ 90 % ์ด์ƒ ์‚ฌ์šฉ์— ์ ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์˜ ์ „์ฒด ์‹œ์ ์€ ๋น„๋™๊ธฐ _IO_ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. IO๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ async fn ์˜ 90 % +๋Š” io::Result<_> (๋˜๋Š” IO ๋ณ€ํ˜•์„ ํฌํ•จํ•˜๋Š” ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์œ ํ˜•)์„ ๋ฐ˜ํ™˜ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ). Result<Result<_, _>, _> ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋งค์šฐ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

@ Nemo157 ๋ฌผ๋ก  ๋งž์Šต๋‹ˆ๋‹ค : ๊ฒฐ๊ณผ์˜ ๊ฒฐ๊ณผ. ๋‚ด ๋Œ“๊ธ€์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š”

  1. await!(future?) ์— future: Result<Future<Output=T>,E>
  2. await!(future)? ์— future: Future<Output=Result<T,E>>

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ await future? ๋ฅผ ์“ฐ๋ฉด ๊ทธ๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์„ ์ฐพ์•„ ๋‚ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ผ€์ด์Šค 1์ด ํ•ญ์ƒ ์ผ€์ด์Šค 2๋กœ ๋ฐ”๋€” ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๊นŒ? ๊ฒฝ์šฐ 1์—์„œ ํ‘œํ˜„์‹์€ ๋ฏธ๋ž˜ ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค๋ฅ˜๋Š” ์ง€์—ฐ๋˜๊ณ  ๋ฏธ๋ž˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ€์ด์Šค 2๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์—ฌ๊ธฐ์„œ ์ž๋™ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๊ด€์ ์—์„œ Result<Future<Output=T>,E> ๋Š” ์˜ค๋ฅ˜ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์กฐ๊ธฐ ๋ฐ˜ํ™˜์„ ๋ณด์žฅํ•˜์ง€๋งŒ ๋‘˜์ด ๋™์ผํ•œ ์‹œ๋ฉ˜ํ‹ฑ์„ ๊ฐ–๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š”. ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ด๋ฏธ์ง€ํ™”ํ•˜์—ฌ ์˜ค๋ฅ˜ ์‚ฌ๋ก€๊ฐ€ ์ฆ‰์‹œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ poll ํ˜ธ์ถœ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ œ์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

await exp? ๊ฒƒ์œผ๋กœ ํ•ด์„ ๋  ์ˆ˜ await (exp?) EXP ์ธ ๊ฒฝ์šฐ Result<Future<Output=T>,E> ๋ฐ ํ•ด์„ (await exp)? EXP ๊ฒฝ์šฐ Future<Output=Result<T,E>> . ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์˜ค๋ฅ˜๋กœ ์กฐ๊ธฐ์— ๋ฐ˜ํ™˜๋˜๊ณ  ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด ์‹ค์ œ ๊ฒฐ๊ณผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋” ๋ณต์žกํ•œ ๊ฒฝ์šฐ์—๋Š” ์ž๋™ ๋ฉ”์†Œ๋“œ ์ˆ˜์‹ ์ž ์—ญ ์ฐธ์กฐ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

> await exp???? ์ธํ„ฐ ํผํŒ… ํ•  ๋•Œ ๋จผ์ € exp ํ•˜๊ณ  Result ์ด๋ฉด try ๊ฒฐ๊ณผ๊ฐ€ Result ์ด๋ฉด ๊ณ„์† ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ? ์ด (๊ฐ€) ๋–จ์–ด์ง€๊ฑฐ๋‚˜ Result ๊ฐ€ ์•„๋‹Œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ฐ€์งˆ ๋•Œ๊นŒ์ง€. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋ฏธ๋ž˜ ์—ฌ์•ผํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— await ๋ฅผ ์ ์šฉํ•˜๊ณ  ๋‚˜๋จธ์ง€ ? ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ ‘๋ฏธ์‚ฌ ํ‚ค์›Œ๋“œ /์‹œ๊ธธ ์„œํฌํ„ฐ ์˜€์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘๋‘์‚ฌ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ์—ฐ์Šต์—์„œ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ €๋Š” Rust ํŒ€์›๋“ค์ด ์•”์‹œ์ ์ธ ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์••๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ž ์žฌ์  ์ธ ์นจ๊ฐ• ํ˜„์ƒ ์‚ฌ์ด์— ์ฐจ์ด๊ฐ€ ๋„ˆ๋ฌด ์ ๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ํ•  ์ˆ˜์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

await? ์€ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ด์ง€๋งŒ await ์˜ 90 % ์ด์ƒ ์‚ฌ์šฉ์— ์ ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด์žˆ๋Š” ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์˜ ์ „์ฒด ์‹œ์ ์€ ๋น„๋™๊ธฐ IO ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. IO๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ async fn ์˜ 90 % +๋Š” io::Result<_> (๋˜๋Š” IO ๋ณ€ํ˜•์„ ํฌํ•จํ•˜๋Š” ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์œ ํ˜•)์„ ๋ฐ˜ํ™˜ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ). Result<Result<_, _>, _> ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋งค์šฐ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์˜ ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๋Š” ๊ตฌ์„ฑ, ํ™•์žฅ ๋˜๋Š” ํ•™์Šตํ•˜๊ธฐ์— ์ข‹์ง€ ์•Š์œผ๋ฉฐ ๊ฒฐ๊ตญ์—๋Š” ์ˆ˜ํ•˜๋ฌผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. ๋‹จ์ผ ์ด๋ก ์  ์œ ์šฉ์„ฑ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•ด ์–ธ์–ด ๊ทœ์น™์— ์˜ˆ์™ธ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ํƒ€ํ˜‘์ด ์•„๋‹™๋‹ˆ๋‹ค.

Result<T, E> where T: Future ๋Œ€ํ•ด Future๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋‹น์‹ ์ด ํ•  ์ˆ˜ ๋‹จ์ง€ await result_of_future ๋กœ ๋žฉ์„ ํ•ด์ œ ํ•  ํ•„์š”์—†์ด ? . ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฏ€๋กœ await result_of_future ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉด (await result_of_future)? ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด await? ๊ตฌ๋ฌธ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์ด ์ข€ ๋” ์ผ๊ด€๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” await ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ธ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (๊ฐœ์ธ์ ์œผ๋กœ ์–ด๋–ค ๊ตฌ๋ฌธ์ด ์ „๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋งˆ์Œ์— ๋“œ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค).

  • ? ์—ฐ์‚ฐ์ž์˜ ๋Œ€์†Œ ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์Œ, await? ๋˜๋Š” await??
  • loop , while ๋ฐ for ์™€ ๊ฐ™์€ ๊ธฐ์กด ์ œ์–ด ํ๋ฆ„ ์—ฐ์‚ฐ์ž์™€ ์ผ์น˜ํ•˜๋ฉฐ ํ•„์ˆ˜ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ์‚ฌํ•œ ๊ธฐ์กด Rust ๊ตฌ์กฐ์— ๊ฐ€์žฅ ์ง‘์—์žˆ๋Š” ๋Š๋‚Œ
  • ํŠน์ˆ˜ ์ผ€์ด์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋งคํฌ๋กœ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ธ์žฅ์ด๋‚˜ ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ์ด์ƒํ•œ ์˜ˆ์‚ฐ์œผ๋กœ ์ง€์ถœ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

let p = if y > 0 { op1() } else { op2() };
let p = await { p }?;

ํ•˜์ง€๋งŒ ์—๋””ํ„ฐ์—์„œ ์ด๊ฑธ ๊ฐ€์ง€๊ณ  ๋†€๋‹ค ๋ณด๋‹ˆ ์—ฌ์ „ํžˆ ๋ฒˆ๊ฑฐ ๋กญ๋‹ค. break ๋ฐ return ์™€ ๊ฐ™์ด ๊ตฌ๋ถ„ ๊ธฐํ˜ธ์—†์ด await ๋ฐ await? return ์ข‹์Šต๋‹ˆ๋‹ค.

Future for Result ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ• ๊นŒ์š”?์–ด๋”” T : ๋ฏธ๋ž˜?

๋‹น์‹ ์€ ์—ญ์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ awaitable์€ ์ถœ๋ ฅ ์œ ํ˜•์ด ๊ฒฐ๊ณผ ์ธ Future์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ? ๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ํก์ˆ˜ํ•˜์ง€ ์•Š๋Š” ๋ช…์‹œ์ ์ธ ์ธ์ˆ˜๊ฐ€ ๋Œ€๊ธฐ ์ค‘์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ๋“ฑ์„ ์ผ์น˜์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด?

Result<Future<Result<T, E2>>, E1> ๊ฒฝ์šฐ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ Result<Result<T, E2>, E1> ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Future<Result<T, E1>> ์ด์žˆ๋Š” ๊ฒฝ์šฐ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹จ์ˆœํžˆ Result<T, E1> ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๊ธฐ๋กœ ? ๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ํก์ˆ˜ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ๋‚˜์ค‘์— ๊ฒฐ๊ณผ๋กœ ํ•„์š”ํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค. ๋‚˜๋Š” ๋‹น์‹ ์„ ์˜คํ•ดํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ? ์™€ 99 %์˜ ์‹œ๊ฐ„์„ ๊ธฐ๋‹ค๋ ค์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋„์›€์ด๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.


์˜ค. await? ๊ตฌ๋ฌธ์€ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ์ธ (await future)? ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”๋กœ ๊ทธ๊ฑฐ์ฃ . ๋”ฐ๋ผ์„œ await ๋ฐ”์ธ๋”ฉ์„ await expr? ์—์„œ ๋” ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ํ‘œํ˜„์‹์ด Result<Future<Result<T, E2>>, E1> ์ด๋ฉด Result<T, E2> ์œ ํ˜•์œผ๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. . ๊ฒฐ๊ณผ ์œ ํ˜•์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐ ํŠน๋ณ„ํ•œ ์ผ€์ด์Šค๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ์ ์ธ ํŠน์„ฑ ๊ตฌํ˜„์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

@ivandardi Result<Future<Item=i32, Error=SomeError>, FutCreationError> ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@Pzixel ์ฐธ๊ณ , ๊ทธ ๋ฏธ๋ž˜์˜ ํ˜•ํƒœ๋Š” ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•˜๋‚˜์˜ ์—ฐ๊ด€๋œ ์œ ํ˜• ์ธ ์ถœ๋ ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์•„๋งˆ๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค).


@ivandardi ์ข‹์•„์š”. ๋‚˜๋Š” ์ง€๊ธˆ ๊ทธ๊ฒƒ์„ ๋ณธ๋‹ค. ๋‹น์‹ ์ด ๋‹น์‹ ์—๊ฒŒ ๋ถˆ๋ฆฌํ•˜๊ฒŒ ๋  ์œ ์ผํ•œ ๊ฒƒ์€ ๋‹น์‹ ์ด ๊ฑฐ๊ธฐ์—์„œ ๋ฐฐ์›Œ์•ผ ํ•  ์ด์ƒํ•œ ๋ฌด์–ธ๊ฐ€๋ผ๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ํŽธ์ฐจ์ด์ง€๋งŒ await ๊ฐ€์ง„ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฏธ๋ž˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฐ๊ณผ๋Š” ๋งค์šฐ ๋“œ๋ฌผ์ง€๋งŒ ์ œ๊ฑฐ ๋œ tokio ์ฝ”์–ด์—์„œ ๋ถ„๋ฆฌ ๋œ ์ผ€์ด์Šค๋ฅผ ํ•˜๋‚˜๋„ ์ฐพ์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—์ด ๊ฒฝ์šฐ๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์„คํƒ• / ํŠน์„ฑ ๊ฐ„์ฒด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@ivandardi Result<Future<Item=i32, Error=SomeError>, FutCreationError> ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ธ€์Ž„, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , Future ํŠธ๋ ˆ์ด ํŠธ๋Š” ์˜ค์ง Output ๊ด€๋ จ ์œ ํ˜•๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


@mehcode ๊ธ€์Ž„, ์ด์ „์— ์ œ๊ธฐ ๋œ ๋ช‡ ๊ฐ€์ง€ ์šฐ๋ ค ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ "๋ช…๋ฐฑํ•œ ์šฐ์„  ์ˆœ์œ„"๋ฐ "์œ ์šฉํ•œ ์šฐ์„  ์ˆœ์œ„"์„ ํƒ ํ•ญ๋ชฉ ๋Œ€์‹  ํ•˜๋‚˜์˜ ์ ‘๋‘์‚ฌ ๋Œ€๊ธฐ ๊ตฌ๋ฌธ์ด ์žˆ์œผ๋ฏ€๋กœ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , Future ํŠธ๋ ˆ์ด ํŠธ์—๋Š” ์ถœ๋ ฅ ๊ด€๋ จ ์œ ํ˜• ๋งŒ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ ์•ˆ๋ผ?

fn probably_get_future(val: u32) -> Result<impl Future<Item=i32, Error=u32>, &'static str> {
    match val {
        0 => Ok(ok(15)),
        1 => Ok(err(100500)),
        _ => Err("Coulnd't create a future"),
    }
}

@Pzixel https://doc.rust-lang.org/std/future/trait.Future.html ์ฐธ์กฐ

futures ์ƒ์ž์— ์žˆ๋˜ ์˜ค๋ž˜๋œ ํŠน์„ฑ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•˜๋ฉด ์ ‘๋‘์‚ฌ ์œ„์น˜์— ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๊ฐ™์€ ์œ„์น˜์—์„œ ์ธ์žฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํฐ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‹ค๋ฅธ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๊ณ  ํ‘œํ˜„ ์•ž์— ์ค‘๋ณต ๊ณต๋ฐฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋ˆˆ์— ๋„๋Š” ๊ฑฐ๋ฆฌ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


๊นŠ๊ฒŒ ์ค‘์ฒฉ ๋œ ๋ฒ”์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ™•์žฅ ๋œ ์  ๊ตฌ๋ฌธ ( Pre-RFC )๊ณผ ํ•จ๊ป˜ sigil์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋˜ํ•œ ์ฒด์ธ ๋ฉ”์„œ๋“œ์— ๊ฐ€๋Šฅ์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ๋‹น์—ฐํžˆ * ๋ฅผ @ ๋Œ€์ฒด ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ์—ฌ๊ธฐ์— ์ข‹์•„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค @ ์— ๋ฐ˜์˜ await ํ•˜๋ฉด์„œ, ํ•จ์ˆ˜ ์„ ์–ธ์˜ ์ขŒ์ธก์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค ? ์— ๋ฐ˜์˜ Result<User> ์šฐ๋ณ€์— ์œ„์น˜ ํ•จ์ˆ˜ ์„ ์–ธ์˜. ๋”ฐ๋ผ์„œ @ ๋Š” ? ์™€ ๋งค์šฐ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.


์ด๊ฒƒ์— ๋Œ€ํ•œ ์–ด๋–ค ์ƒ๊ฐ?

์ด๊ฒƒ์— ๋Œ€ํ•œ ์–ด๋–ค ์ƒ๊ฐ?

์—ฌ๋ถ„์˜ ์ค‘๊ด„ํ˜ธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

@mehcode ๋„ค, ์„ ๋ฌผ์— Error ์œ ํ˜•์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์š”์ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์–ด๋–ค ์ƒ๊ฐ?

์˜ˆ! Centril์˜ ์˜๊ฒฌ ์— ๋”ฐ๋ฅด๋ฉด

ํ™•์žฅ ๋œ ์  ๊ตฌ๋ฌธ ์ œ์•ˆ์— ๊ด€ํ•ด์„œ๋Š” ํ›จ์”ฌ ๋” ๊นŠ์ด ์„ค๋ช…ํ•˜์—ฌ ๋ชจ๋“  ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์˜๋ฏธ์™€ ํƒˆ๋‹น์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ํ•ด๋‹น ๊ตฌ๋ฌธ์œผ๋กœ ๊ฒŒ์‹œ ํ•œ ์ฝ”๋“œ ์กฐ๊ฐ์˜ ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿฌ๋‚˜ ์š”์ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ๊ณผ ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ Future<Item=Result<T, E>> ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธ€์Ž„, ๊ทธ ๊ฒฝ์šฐ, ๋‹น์‹ ์€ ... ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜

์—์„œ์™€ ๊ฐ™์ด foo ์ด Future<Item=Result<T, E>> ์œ ํ˜•์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด await foo ๊ฐ€ Result<T, E> ๋˜๊ณ  ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

await foo?;
await foo.unwrap();
match await foo { ... }
await foo.and_then(|x| x.bar())

์•ˆ๋…•ํ•˜์„ธ์š”.

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๋ฏธ๋ž˜๋ฅผ ๊ฐ€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค> ๋งž์ฃ ? ๊ธ€์Ž„, ๊ทธ ๊ฒฝ์šฐ, ๋‹น์‹ ์€ ... ๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜

์•„๋‹ˆ์š”, Result<Future<Item=Result<T, E>>, OtherE>

์ ‘๋ฏธ์‚ฌ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๋ฉด

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

@melodicstream ๋‚ด ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์‚ฌ์ „ RFC ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค ์ด๋Ÿฐ ... ์„ธ ๋ฒˆ์งธ๋กœ ๋ชจ๋“  ๋Œ“๊ธ€์„ ๋‹ค์‹œ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค ...

์œ ์ผํ•œ ์ผ๊ด€๋œ ๋Š๋‚Œ์€ await Future ๊ฐ€ ํ•ด๋‹น ๊ตฌ๋ฌธ์—์„œ .await ์ ‘๋ฏธ์‚ฌ ํ‘œ๊ธฐ๋ฒ•์— ๋Œ€ํ•œ ๋‚˜์˜ ์‹ซ์–ดํ•จ์ž…๋‹ˆ๋‹ค. "์ ์˜ ํž˜"์€ IDE์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์•ˆ์ •๋œ ๊ตฌ๋ฌธ์ด๋ผ๋ฉด ํ™•์‹คํžˆ ์ ์‘ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋‚˜์—๊ฒŒ ์ •๋ง๋กœ "์˜ณ์€"๋Š๋‚Œ์„ ์ค„์ง€ ์˜์‹ฌ ์Šค๋Ÿฝ๋‹ค.

์ฃผ๋กœ KISS ์›์น™ ๊ณผ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ์œ ์‚ฌํ•˜๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ๋งŽ์€ ๊ฐ€์น˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์ˆ˜ ๊ด„ํ˜ธ์—†์ด ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ await ์ ‘๋‘์‚ฌ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

await? future ์—์„œ (await future)? ๋กœ ์„คํƒ•์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ๊ณ  ๊ฐ์‚ฌ ํ•  ๊ฒƒ์ด์ง€๋งŒ ๊ทธ ์ด์ƒ์˜ ๋ชจ๋“  ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ฌธ์ œ์—†๋Š” ํ•ด๊ฒฐ์ฑ…์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ let ๋ฆฌ ๋ฐ”์ธ๋”ฉ์€ ๋Œ€๋ถ€๋ถ„์˜ ์˜ˆ์ œ์—์„œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ ์‹œ์ผฐ์œผ๋ฉฐ, ๊ฐœ์ธ์ ์œผ๋กœ ์‰ฌ์šด ์ฒด์ธ์ด ์˜ต์…˜์ด๋”๋ผ๋„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๋”ฐ๋ผ๊ฐˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

๊ทธ ๋ง์„ ๋“ฃ๊ณ  ๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฒฐ์ •ํ•  ์œ„์น˜์— ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋” ๋งŽ์€ ์†Œ์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋Œ€์‹ ์ด ๋ฌธ์ œ๋ฅผ ๋‚ด๋ฒ„๋ ค๋‘๊ณ  ์ตœ์ข… ํ‰๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

... ์ ์–ด๋„ ์†”์งํžˆ ๊ทธ๋ ‡๊ฒŒํ•˜๋ ค๊ณ  ...

@Pzixel foo ๊ฐ€ Result<Future<Item=Result<T, E1>>, E2> ์œ ํ˜•์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋ฉด foo await foo ์ด Result<Result<T, E1>, E2> ์œ ํ˜•์ด๋˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

await foo?;
await foo.and_then(|x| x.and_then(|y| y.bar()));
await foo.unwrap().unwrap();

@melodicstream ์•„๋‹ˆ, ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Result, ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค Future. So you have to do foo ()๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? to unwrap Future from Result , then do await to get a result, then again ?`๊ฐ€ ๋ฏธ๋ž˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ธ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ ๋ฐฉ์‹์œผ๋กœ foo? await? , ์ ‘๋‘์‚ฌ๋กœ ... ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ท€ํ•˜์˜ ์˜ˆ์ œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

(await foo.unwrap()).unwrap()

๊ทธ๋Ÿฌ๋‚˜ @huxi ๊ฐ€ async/await ์ฑ„ํƒ ํ›„ ์‹ค์ œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@Pzixel ๊ทธ๋ž˜์„œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ Result<Future<Item=T>, E> Future ๊ตฌํ˜„์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€์™€ OK์ž…๋‹ˆ๋‹ค ๋งŒ await foo?? ์— ๋Œ€ํ•ด Result<Future<Output=Result<T, E1>>, E2> , ๋‚˜๋Š” ํ–‰๋ณตํ•˜์ง€ ์•Š๋‹ค await foo.unwrap().unwrap() . ๋‚ด ์ฒซ ๋ฒˆ์งธ ๋‡Œ ๋ชจ๋ธ์—์„œ ์ด๊ฒƒ์€

(await foo.unwrap()).unwrap()

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ •๋ง ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ? ๋Š” ์ผ๋ฐ˜ ์—ฐ์‚ฐ์ž์ด๊ณ  unwrap ๋Š” ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” . ์™€ ๊ฐ™์€ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ํŠน๋ณ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ• ์ธ ๊ฒฝ์šฐ ํ•ญ์ƒ ์™ผ์ชฝ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ‘œํ˜„์‹๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

await ๋Š” ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ํ‚ค์›Œ๋“œ ์ผ ๋ฟ์ด๋ฏ€๋กœ unwrap() ์ด์ „์— ํ‘œํ˜„์‹์˜ ์ผ๋ถ€ ์—ฌ์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ foo.unwrap() await.unwrap() ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. unwrap() .

์ ‘๋ฏธ์‚ฌ ์Šคํƒ€์ผ ๋งคํฌ๋กœ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ๋Œ€๋ถ€๋ถ„์„ ํ›Œ๋ฅญํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜์ง€๋งŒ, ๊ธฐ์กด ์–ธ์–ด์— ๋Œ€ํ•œ ์นœ์ˆ™ ํ•จ์„ ์œ ์ง€ํ•˜๊ณ  ์ ‘๋‘์‚ฌ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ์ ‘๋ฏธ์‚ฌ ์Šคํƒ€์ผ์— ํˆฌํ‘œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ๊ฐ™์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๊นŒ?

fn foo(n: u32) -> impl Future<Item = u32> {
   if n == 0 {
      panic!("Can't be zero");
   } else {
      do_async_call().map(|_| 10)
   }
}

๊ณผ

async fn foo(n: u32) -> u32 {
   if n == 0 {
      panic!("Can't be zero");
   } else {
      await!(do_async_call());
      10
   }
}

์ฒซ ๋ฒˆ์งธ๋Š” ๋ฏธ๋ž˜๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ํŒจ๋‹‰์„ ์ฑ„์šฐ๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ์ฒซ ๋ฒˆ์งธ ํˆฌํ‘œ์—์„œ ํŒจ๋‹‰์„ ์ผ์œผํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ๋ญ”๊ฐ€๋ฅผํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fn foo(n: u32) -> impl Future<Item = u32> {
   if n == 0 {
      panic!("Can't be zero");
   } else {
      async {
         await!(do_async_call());
         10 
      }
   }
}

๊ทธ๋Ÿฌ๋‚˜ ํ›จ์”ฌ ๋œ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

@Pzixel : ์ด๊ฒƒ์€ ๋‚ด๋ฆฐ ๊ฒฐ์ •์ž…๋‹ˆ๋‹ค. async fn ์€ ์™„์ „ํžˆ ๊ฒŒ์œผ๋ฅด๊ณ  ํด๋ง ๋  ๋•Œ๊นŒ์ง€ ์ „ํ˜€ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ–ฅํ›„ ์ „์ฒด ์ˆ˜๋ช… ๋™์•ˆ ๋ชจ๋“  ์ž…๋ ฅ ์ˆ˜๋ช…์„ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ impl Future ๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ž˜ํ•‘ ํ•จ์ˆ˜์™€ ์ง€์—ฐ๋œ ๊ณ„์‚ฐ์— async ๋ธ”๋ก (๋˜๋Š” fn)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํด๋ง ํ›„์—๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฐ ์กฐํ•ฉ ์‚ฌ์ด์— ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  Future ์กฐํ•ฉ์ž๋ฅผ ์Šคํƒํ•˜๋Š” ๋ฐ _required_์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์™„๋ฃŒ๋œ ๊ฒฐ์ •์ด๋ฉฐ ์™œ ์•”์‹œ ์  ๋Œ€๊ธฐ ์‹œ์Šคํ…œ์ด Rust์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ (์ž˜) ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ C # ๊ฐœ๋ฐœ์ž์ด๋ฉฐ ์ ‘๋‘์‚ฌ ์Šคํƒ€์ผ์„ ์˜นํ˜ธ ํ•  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐ˜๋Œ€ ํˆฌํ‘œ๋ฅผ ์ค€๋น„ํ•˜์‹ญ์‹œ์˜ค.

์  ( read().await ๋˜๋Š” read().await() )์ด์žˆ๋Š” ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์€ ๋งค์šฐ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ํ•„๋“œ ์•ก์„ธ์Šค ๋˜๋Š” ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์„ ์ œ์•ˆํ•˜๋ฉฐ await ๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์–ธ์–ด ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋…ธ๋ จํ•œ Rustacean์€ ์•„๋‹ˆ์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ํšจ๊ณผ์ ์œผ๋กœ ์žฌ ์ž‘์„ฑ ๋  ํ‚ค์›Œ๋“œ ์ธ ๋‹ค๋ฅธ .something ์ผ€์ด์Šค๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒƒ์€ ? ์ ‘๋ฏธ์‚ฌ์ž…๋‹ˆ๋‹ค.

๋ช‡ ๋…„ ๋™์•ˆ C #์—์„œ async / await๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ํ‘œ์ค€ prefix-with-a-space ๊ตฌ๋ฌธ ( await foo() )์€ ๊ทธ๋™์•ˆ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋œ await ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ช…์‹œ ์  ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•œ ํ‘œ์ค€ ๊ตฌ๋ฌธ ์ธ ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฒˆ๊ฑฐ๋กญ์ง€ ์•Š์œผ๋ฏ€๋กœ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```c #
var list = (await GetListAsync ()). ToList ();

`await` is essentially a unary operator, so treating it as such makes sense.

In C# 8.0, currently in preview, we have async enumerables (iterators), which comes with an `IAsyncEnumerable<T>` interface and `await foreach (var x in QueryAsync())` syntax. The lack of async enumerables has been an issue since async was added in C# 5; for example, we have ORMs that return a `Task<IEnumerable>` which is only half asynchronous; we have to block on calls to `MoveNext()`. Having proper async enumerables is a big deal.

If a postfix `await` is used and similar async iterator support is added to Rust, that would look something like

```rust
for val in v_async_iter {
    println!("Got: {}", val);
} await // or .await or .await()

์ด์ƒํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด์™€์˜ ์ผ๊ด€์„ฑ๋„ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋น„๋™๊ธฐ์‹ ์•ž์— await ํ‚ค์›Œ๋“œ๋Š” C #, VB.NET, JavaScript ๋ฐ Python์˜ ๊ตฌ๋ฌธ์ด๋ฉฐ C ++์—๋„ ์ œ์•ˆ ๋œ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์„ธ๊ณ„ 7 ๋Œ€ ์–ธ์–ด ์ค‘ 5 ๊ฐœ์ž…๋‹ˆ๋‹ค. C์™€ Java๋Š” ์•„์ง async / await๊ฐ€ ์—†์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ”๋‹ค๋ฉด ๋†€๋ž„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฑฐ๊ธฐ์— ๋‹ค๋ฅธ ๊ธธ์„ ๊ฐˆ ์ˆ˜์žˆ๋Š” ์ •๋ง ์ข‹์€ ์ด์œ ๋Š”, ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ์˜ ์žฅ์ ๊ณผ ํƒ€ํ˜‘์˜ ์ธก๋ฉด์—์„œ ๋™์ผ์„ ๋ฌด๊ฒŒ ๊ฒฝ์šฐ, ๊ทธ๊ฒƒ์„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๋„ฃ์–ดํ•˜์ง€ ์•Š๋Š” ํ•œ, ๋‚˜๋Š” "๋งŽ์ด๋Š” ๋น„๊ณต์‹์ ๋ผ๊ณ  ํ•  ๊ฑฐ๊ธฐ ์žˆ๋‹ค๋Š” ์ข‹์„ ๊ฒƒ ํ‘œ์ค€ "๊ตฌ๋ฌธ.

@markrendle ์ €๋Š” 2013 ๋…„๋ถ€ํ„ฐ async/await ์“ฐ๋Š” C # ๊ฐœ๋ฐœ์ž์ด๊ธฐ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust๋Š” ๋งŽ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

(await Foo()).ToList() ๊ฐ€ ๋“œ๋ฌธ ๊ฒฝ์šฐ๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ await Foo() ํ•˜๊ณ  ๋‹ค๋ฅธ ์œ ํ˜•์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Foo ์„œ๋ช…์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋…น์€ ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ? ์žˆ๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ „ํŒŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. C #์—์„œ async / await๋Š” ์ž๋™์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ณ  ๋Œ€๊ธฐ ์ง€์ ์—์„œ ์˜ˆ์™ธ๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค. ๋…น์Šฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. C #์—์„œ await ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

var response = (await client.GetAsync("www.google.com")).HandleException();
var json =  (await response.ReadAsStreamAsync()).HandleException();
var somethingElse = (await DoMoreAsyncStuff(json)).HandleException();
...

์ด ๋ชจ๋“  ๊ต์ •๊ธฐ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ง€๋ฃจํ•ฉ๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ๊ฐ€์žˆ๋Š” OTOH

var response = client.GetAsync("www.google.com") await.HandleException();
var json =  response.ReadAsStreamAsync() await.HandleException();
var somethingElse = DoMoreAsyncStuff(json) await.HandleException();
...

๋˜๋Š” ๋…น ์šฉ์–ด๋กœ

let response = client.get_async("www.google.com") await?;
let json =  response.read_as_Stream_async() await?;
let somethingElse = do_more_async_stuff(json) await?;
...

๊ทธ๋ฆฌ๊ณ  imaine ์šฐ๋ฆฌ๋Š” ์ถ”๊ฐ€๋กœ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ณ€์••๊ธฐ๋ฅผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค ? ๋ฐ await ์˜ ์ด๋ฆ„ ๊ทธ๊ฒƒ์„ ๋ณด์ž, @ . await? ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ตฌ๋ฌธ์„ ๋ฐœ๋ช…ํ•˜๋ฉด ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด await@ , @? , await@? , ...์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.


๋‚˜๋Š” ์ ‘๋‘์‚ฌ await ๋„ ์ข‹์•„ํ•˜์ง€๋งŒ Rust๊ฐ€ ๊ดœ์ฐฎ์€์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด์— ์ถ”๊ฐ€ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๋” ์‰ฝ๊ฒŒ ์ฝ์„ ๊ฐ€์น˜๊ฐ€์—†๋Š” ๋ถ€๋‹ด์ž…๋‹ˆ๋‹ค.

์ถ”์  ๋ฌธ์ œ ์Šค๋ ˆ๋“œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๋Œ“๊ธ€์„ ๋‹ค์‹œ ์ฝ์œผ์‹ญ์‹œ์˜ค (๊ฑฐ์˜ 3 ์‹œ๊ฐ„ ์†Œ์š”). ๊ทธ๋ฆฌ๊ณ  ๋‚ด ์š”์•ฝ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. @ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๊ฐ€์žฅ ๊ณผ์†Œ ํ‰๊ฐ€ ๋œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ (ํŽธํ–ฅ๋œ) ์˜๊ฒฌ์ด ์žˆ์œผ๋ฉฐ ์•„๋ž˜์— ๊ทธ๋“ค์— ๋Œ€ํ•œ ๋‚ด ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.


async-await ์€ ์ ‘๋ฏธ์–ด @ ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋™์ผํ•œ async fn ๊ตฌ๋ฌธ์ด ์ œ๊ณต๋˜๊ณ  await ์™€ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ์ ˆ๋ฐ˜์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

Rust์—๋Š” ๋งŽ์€ ์ธ์žฅ์ด ์žˆ์œผ๋ฉฐ ์šฐ๋ฆฌ๋Š” ์•„์ง ๋‹ค๋ฅธ ์ธ์žฅ์„ ๋„์ž…ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค

๊ทธ๋Ÿฌ๋‚˜์‹œ๊ธธ์€ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ๊ตฌ๋ฌธ๊ณผ ์ผ์น˜ ํ•  ๋•Œ๊นŒ์ง€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ์ธ์žฅ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋“  ์ƒํ™ฉ์„ ์•…ํ™”์‹œํ‚ฌ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ ๊ด€์ ์—์„œ ์ ‘๋ฏธ์‚ฌ @ ๋Š” ์ ‘๋‘์‚ฌ / ์ ‘๋ฏธ์‚ฌ await ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์€ ๊ตฌ๋ฌธ์ž…๋‹ˆ๋‹ค.

?!@# ์™€ ๊ฐ™์€ ์Šค ๋‹ˆํŽซ์€ Perl์„ ์ƒ๊ฐ ๋‚˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” IMO๊ฐ€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์ธ์ฒด ๊ณตํ•™์ ์œผ๋กœ ๋ณด์ด๋Š” @? ์ด์™ธ์˜ ๋‹ค๋ฅธ ์กฐํ•ฉ์„ ๊ฑฐ์˜ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. impl Try<impl Future<T>> , impl Future<impl Try<impl Try<T>>> ๋ฐ impl Future<T> ์™€ ๊ฐ™์€ ๋ฐ˜ํ™˜ ์œ ํ˜•์€ ์‹ค์ œ ITT ์˜ˆ์ œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ตœ๋Œ€ 10 % ์‚ฌ์šฉ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”์šฑ์ด,์ด 10 % ์ค‘ 90 %์˜์‹œ๊ธธ ์ง‘๋‹จ์€ API๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜์ด๋ฅผ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ ๋ฐ”์ธ๋”ฉ์„ ๋„์ž…ํ•ด์•ผ ํ•  ๋•Œ ์ฝ”๋“œ ๋ƒ„์ƒˆ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ @ ๋Š” ๋ˆˆ์— ๋„๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ async-await ์ปจํ…์ŠคํŠธ์—์„œ ํฐ ์ด์ ์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌ๋ฌธ์€ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ์‹์ฒ˜๋Ÿผ ํ‘œํ˜„ํ•  ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋ฏ€๋กœ๋ณด๋‹ค ์นจ์ž…์ ์ธ await ๋Š” ์›๋ž˜ ๋ชฉ์ ์—๋งŒ ๋ฐฉํ•ด๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์œ„์˜ ์˜ˆ๋Š” ์–‘๋ณด ์ง€์ ์˜ ๋ฐœ์ƒ์ด ๋„ˆ๋ฌด ๋ช…์‹œ์ ์ผ ๋•Œ ์ฝ”๋“œ๋ฅผ ๋ถ€ ํ’€๋ฆด๋งŒํผ ์กฐ๋ฐ€ ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ถ„๋ช…ํžˆ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋ˆˆ์— ๋„์–ด ์•ผํ•˜์ง€๋งŒ @ ์‹œ๊ธธ์€ ์ฝ”๋“œ๋ฅผ ๋ถ€ ํ’€๋ฆฌ์ง€ ์•Š๊ณ  await ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์šด์˜์ด๋ฉฐ ์šฐ๋ฆฌ๋Š”

์ •๋ง ๋ง์ด๋˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ ๊ทธ๋ฆฌ๊ณ  ๋„ˆ๋ฌด ํฌ๊ฒŒ ๋งํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ณ€์ด ๊ตฌ๋ฌธ์— ๋น„์œ ๊ฐ€ ์ œ๊ณต ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค : mut ๋Š” ๋ช…์‹œ ์ ์œผ๋กœ ํ•œ ๋ฒˆ๋งŒ ํ•„์š”ํ•˜๋ฉฐ ๋” ๋‚˜์•„๊ฐ€ ๋ณ€์ด ๊ฐ€๋Šฅํ•œ ๋ฐ”์ธ๋”ฉ์„ ์•”์‹œ ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋น„์œ ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ตฌ๋ฌธ์œผ๋กœ ์ œ๊ณต ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ ์  unsafe ๋Š” ํ•œ ๋ฒˆ๋งŒ ํ•„์š”ํ•˜๋ฉฐ ๋” ๋‚˜์•„๊ฐ€ ์›์‹œ ํฌ์ธํ„ฐ๋ฅผ ์—ญ ์ฐธ์กฐํ•˜๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„๋ธ” ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ๋˜ ๋‹ค๋ฅธ ๋น„์œ ๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…์‹œ ์  impl Try return ๋˜๋Š” ์˜ˆ์ •๋œ try ๋ธ”๋ก์€ ํ•œ ๋ฒˆ๋งŒ ํ•„์š”ํ•˜๋ฉฐ ๋” ๋‚˜์•„๊ฐ€ ? ์—ฐ์‚ฐ์ž๋ฅผ ์ž์‹ ์žˆ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ช…์‹œ ์  async ๊ฐ€๋Šฅํ•œ ๋‚ด๊ตฌ์„ฑ์žˆ๋Š” ์ž‘์—…์— ํ•œ ๋ฒˆ๋งŒ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ ํ•  @ ์—ฐ์‚ฐ์ž๋ฅผ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

await ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ฝ์—ˆ ๊ธฐ ๋•Œ๋ฌธ์— ์ด์ƒํ•˜๊ณ  ์‰ฝ๊ฒŒ ์ž…๋ ฅ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

& ๋ฅผ "ref"๋กœ, ! ๋ฅผ "not"์œผ๋กœ ์ฝ์œผ๋ฉด ํ˜„์žฌ @ ๋ฅผ ์ฝ๋Š” ๋ฐฉ๋ฒ•์ด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒ์ง•. ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๋” ์ค‘์š”ํ•œ ์šฐ์„  ์ˆœ์œ„์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž…๋ ฅ ์†๋„๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ @ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

@ ์ด ์ด๋ฏธ ํŒจํ„ด ์ผ์น˜์— ์‚ฌ์šฉ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจํ˜ธํ•ฉ๋‹ˆ๋‹ค.

! ์ด๋ฏธ ๋งคํฌ๋กœ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  & ์ด๋ฏธ ์ฐจ์šฉ์— ์‚ฌ์šฉ๋˜๊ณ  && ์—ฐ์‚ฐ์ž์—์„œ๋Š” | ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค & ํด๋กœ์ €, ํŒจํ„ด ๋ฐ || ์—ฐ์‚ฐ์ž์—์„œ + / - ๋„ ์ ‘๋‘์‚ฌ ์œ„์น˜์— ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ . ๋Š” ์•„์ง ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋‹ค๋ฅธ ๋งฅ๋ฝ. ๋‹ค๋ฅธ ๊ตฌ๋ฌธ ๊ตฌ์กฐ์—์„œ ๋™์ผํ•œ ๊ธฐํ˜ธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋†€๋ผ์šด ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ์ž˜๋ชป๋œ ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

grepํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ถ€ ์†Œ์Šค์— ๋น„๋™๊ธฐ ํŒจํ„ด์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด rg async ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ๋ชจ๋“  ์ˆ˜์ต๋ฅ  ํฌ์ธํŠธ๋ฅผ ์ฐพ๊ณ  ์‹ถ๋‹ค๋ฉด rg "@\s*[;.?|%^&*-+)}\]]" ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ํ•„์š”ํ•œ์ง€ ๊ณ ๋ คํ•  ๋•Œ IMO์ด ์ •๊ทœ์‹์€ ์ ˆ๋Œ€์ ์œผ๋กœ ์ข‹์Šต๋‹ˆ๋‹ค.

@ ์€ (๋Š”) ์ดˆ๋ณด์ž์—๊ฒŒ ์นœ์ˆ™ํ•˜์ง€ ์•Š์œผ๋ฉฐ Google๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

? ์—ฐ์‚ฐ์ž์™€ ์ผ๊ด€๋˜๊ฒŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๋ณด์ž๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ๋” ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ ‘๋‘์‚ฌ / ์ ‘๋ฏธ์‚ฌ await ๋Š” ์—ฐ๊ด€์„ฑ / ํ˜•์‹ํ™” / ์˜๋ฏธ์— ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ๋„์ž…ํ•˜๋Š” ๋‹ค๋ฅธ Rust ๊ตฌ๋ฌธ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ํ‚ค์›Œ๋“œ๋Š” ์ „์ฒด ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์„ค๋ช… ํ•  ์ˆ˜์—†๊ณ  ์ดˆ๋ณด์ž๋Š” ์–ด์จŒ๋“  ์ฑ…์—์„œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— await ๊ฐ€ ์ž์ฒด ๋ฌธ์„œํ™” ๊ฐ€์น˜๋ฅผ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Rust๋Š” ๊ฐ€๋Šฅํ•œ ๊ฐ ๊ตฌ๋ฌธ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ผ๋ฐ˜ ํ…์ŠคํŠธ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์–ธ์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ @ ๊ธฐํ˜ธ์˜ ์˜๋ฏธ๋ฅผ ์žŠ์–ด ๋ฒ„๋ฆฐ ๊ฒฝ์šฐ (์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ธฐ์–ตํ•  ์—ฐ๊ด€์„ฑ์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค)-ํ˜„์žฌ rust @ symbol ๋•Œ๋ฌธ์— ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰๋„ ์„ฑ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํŒจํ„ด ์ผ์น˜์—์„œ @ ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ await ํ‚ค์›Œ๋“œ๋ฅผ ์˜ˆ์•ฝ ํ–ˆ์œผ๋ฏ€๋กœ ์–ด์จŒ๋“  ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์™œ? ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์˜ˆ์•ฝ ํ‚ค์›Œ๋“œ๊ฐ€์—†๋Š” ๊ฒฝ์šฐ ์ตœ์ข… ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ๋” ๋‚ซ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์ง€๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ •ํ™•ํžˆ await ํ‚ค์›Œ๋“œ๊ฐ€ ๋„์ž… ๋  ๊ฒƒ์ด๋ผ๋Š” ์•ฝ์†๋„ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ์ด ์‹๋ณ„์ž๋Š” ์‹ค์ œ ์ฝ”๋“œ์—์„œ ๊ทธ๋‹ค์ง€ ํ”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์Œ ๋ฒ„์ „๊นŒ์ง€ ์˜ˆ์•ฝ ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ ๋  ๋•Œ ์•„๋ฌด๊ฒƒ๋„ ์žƒ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

? ๋Š” ์‹ค์ˆ˜ ์˜€๊ณ  @ ๋Š” ๋‘ ๋ฒˆ์งธ ์‹ค์ˆ˜

์•„๋งˆ๋„ ๋‹น์‹ ์€ ๋” ์–ดํœ˜ ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ๊ทธ ๋•Œ๋ฌธ์— ๊ธฐํ˜ธ ๋Œ€์‹  ๋‹จ์–ด๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋•Œ๋ฌธ์— ๋” ์–‡์€ ๊ตฌ๋ฌธ์—์„œ ์–ด๋–ค ๊ฐ’๋„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‹œ๊ฐ์ ์œผ๋กœ ๋” ๋งŽ์ด ์ƒ๊ฐํ•˜๊ณ , ๋ฐฉํ•ด๊ฐ€๋˜๋Š” ๋‹จ์–ด๋Š” ๋Œ€์‹  ์ž‘์—…ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ์„œ ์ข‹์€ ์ ˆ์ถฉ์•ˆ์€ try!() ๊ฐ€ ? ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋œ ๊ฒƒ์ฒ˜๋Ÿผ await!() ๋งคํฌ๋กœ๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ @ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค @ ์ •๋ง ๋ถˆํŽธํ•˜๋‹ค๋ฉด

^^^^^^^ ์ œ ๋Œ“๊ธ€๋„ ๋‹ค์‹œ ์ฝ์—ˆ๋‚˜์š”?

๋‚˜๋Š” @ I60R ์˜ ์ฃผ์„์„ ์ฝ๊ณ  ์ ‘๋ฏธ์‚ฌ์‹œ๊ธธ์„ ์„ ํ˜ธํ–ˆ์œผ๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€์‹œ๊ธธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค (๋Œ€์‹  ์–ด๋–ค ํ˜•ํƒœ์˜ ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

์šฐ๋ฆฌ์˜ await ์ž‘์—…์€ await ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ ์–ด๋„ await ์ด async / await ์นœ์ˆ™ ํ•จ์˜ ๊ฐ€์žฅ ํฐ ๋‘ ์†Œ์Šค ์ธ C # ๋ฐ JavaScript์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์–ธ์–ด์—์„œ Task (C #) / Promise (JS)๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์˜๋ฏธ๋Š” ์ž‘์—…์ด ์ฆ‰์‹œ ์‹คํ–‰๋  ์ž‘์—… ๋Œ€๊ธฐ์—ด์— ๋ฐฐ์น˜๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. C #์—์„œ๋Š” ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ์ด๊ณ  JS์—์„œ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์—์„œ await foo ์˜๋ฏธ ์ƒ "์ด ์ž‘์—…์„ ํŒŒํ‚นํ•˜๊ณ  foo ์ž‘์—…์ด ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ์ด ์ž‘์—…์— ์‚ฌ์šฉ๋˜๋Š” ๊ณ„์‚ฐ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ".

์ด๊ฒƒ์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Task / Promise s (๋‹จ์ผ ์Šค๋ ˆ๋“œ ์‹คํ–‰๊ธฐ์—์„œ๋„)๋ฅผ ์ƒ์„ฑ ํ•œ ํ›„ ๋ณ„๋„์˜ await ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. await ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. '์ด ์ž‘์—…์„ ์‹คํ–‰'ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋Œ€๊ธฐ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ '์ผ๋ถ€ ์ž‘์—…์„ ์‹คํ–‰'ํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์ง€๋งŒ ์ƒ์„ฑ ๋  ๋•Œ ์ž‘์—… ์‹œ์ž‘์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ง€์—ฐ ๋˜๋Š” ์—ด๋ง๊ณผ๋Š” ์™„์ „ํžˆ ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. ๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„ ๋‚˜๋จธ์ง€ ์ž‘์—…์„ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ง€์—ฐ ๋ฐ˜๋ณต์ž์™€ ํ˜„์žฌ ๋ฏธ๋ž˜์˜ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ์ด ๋ผ์ธ์„ ๋”ฐ๋ผ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” await ๊ตฌ๋ฌธ์ด ์šฐ๋ฆฌ์—๊ฒŒ ํ˜ธ์˜๋ฅผ ๋ฒ ํ’€์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ await!(foo) ๋Š” "์ „ํ†ต์ ์ธ"C # ๋˜๋Š” JS ๋ฐฉ์‹์˜ await foo ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์˜๋ฏธ๋ก ๊ณผ ๋” ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋œ ์–ธ์–ด๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ง€๊ธˆ์€ ๋‹จ๋‹จํžˆ (๋‚˜๋Š” ์„ธ๋ถ€ ์ž˜๋ชป์žˆ์–ด ๊ฒฝ์šฐ์— ์ €๋ฅผ ์ •์ • @matklad) ์ฝ” ํ‹€๋ฆฐ์˜๋ผ๊ณ  ์ƒ๊ฐ suspend fun . ๋˜๋Š” Rust ์ธ์ ‘ ํ† ๋ก ์—์„œ ์–ธ๊ธ‰ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ "๋ช…์‹œ ์  ๋น„๋™๊ธฐ, ์•”์‹œ ์  ๋Œ€๊ธฐ"์ž…๋‹ˆ๋‹ค.

๊ฐ„๋žตํ•œ ๊ฒ€ํ†  : Kotlin์—์„œ๋Š” suspend ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ๋งŒ suspend fun ๋ฅผ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ํ˜ธ์ถœ ๋œ ํ•จ์ˆ˜๊ฐ€ ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ์ฆ‰์‹œ ์‹คํ–‰๋˜์–ด ์ž์‹ ํ•จ์ˆ˜์— ํ•„์š”ํ•œ ์Šคํƒ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ผ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ž์‹ suspend fun ์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋น„๋™๊ธฐ ํด๋กœ์ €์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์„ ๋งŒ๋“ค๊ณ  suspend fun ๊ฒฐํ•ฉ ์ž์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์—ฌ๋Ÿฌ suspend ํด๋กœ์ €๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๊ฒƒ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.) ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ suspend fun ์ž์‹์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ•ด๋‹น ์ž‘์—…์„ ์‹คํ–‰๊ธฐ์— ๋„ฃ๊ณ  .await() suspend fun ๋…ธ์ถœํ•˜๋Š” ์ž‘์—… ์œ ํ˜•์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด ์•„ํ‚คํ…์ฒ˜๋Š” Rust์˜ Future ์™€๋Š” ๋‹ค๋ฅธ ๋™์‚ฌ๋กœ ์„ค๋ช…๋˜์—ˆ์ง€๋งŒ ๋งค์šฐ ์นœ์ˆ™ํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์ „์— ์™œ ์•”์‹œ ์  ๊ธฐ๋‹ค๋ฆผ์ด Rust์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”์ง€ ์„ค๋ช…ํ–ˆ๊ณ  ๊ทธ ์ž…์žฅ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. async fn() -> T ์™€ fn() -> Future<T> ๋Š” ์‚ฌ์šฉ์ด ๋™์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ "do some initial work"ํŒจํ„ด์ด ๊ฒŒ์œผ๋ฅธ ๋ฏธ๋ž˜์—์„œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ •์„ ์œ„ํ•ด ๊ฐ ์„ ๋ฌผ ์‚ฌ์ด์— ๊ฐ„์ ‘์  ์ธ ๊ณ„์ธต์—†์ด ์„ ๋ฌผ์„ ์Œ“์„ ์ˆ˜ ์žˆ๋„๋ก ์ง€์—ฐ ์„ ๋ฌผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด์ œ๋Š” foo@ (๋˜๋Š” ๋‹ค๋ฅธ์‹œ๊ธธ)์˜ "๋ช…์‹œ ์ ์ด์ง€๋งŒ ์กฐ์šฉํ•œ"๊ตฌ๋ฌธ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ฒƒ์ด ์‹ซ์ง€๋งŒ,์ด ๊ฒฝ์šฐ @ ๋Š” async ์—์„œ ๋ชจ๋‚˜ ๋”• ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค. ? ๋Š” try ์—์„œ ๋ชจ๋‚˜ ๋”• ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ์— ? ๋ฅผ ๋ฟŒ๋ฆฌ๋Š” ๊ฒƒ์€ ๋‹จ์ง€ Result ๋ฐ˜ํ™˜ ํ•  ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ถˆํ‰์„ ๋ฉˆ์ถ”๊ฒŒํ•˜๋Š” ๊ฒƒ์ด๋ผ๋Š” ์˜๊ฒฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์˜๋ฏธ์—์„œ ๋‹น์‹ ์€ ์ด๊ฒƒ์„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์ฝ”๋“œ์˜ ๋กœ์ปฌ ๋ช…ํ™•์„ฑ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ์ด์ƒ์„ ๋ณด์กดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์—…์ด ๋ชจ๋‚˜๋“œ๋ฅผ ํ†ตํ•ด ์••์ถ• ํ•ด์ œ๋˜์—ˆ๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋กœ์ปฌ๋กœ ๊ฐ€์ ธ ์˜ค๋Š”์ง€ ์•Œ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

(๋ชจ๋‚˜๋“œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์ž˜๋ชป๋˜๋ฉด ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‚˜๋ฅผ ๊ณ ์น  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ๋‚ด ์š”์ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์กด์žฌํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.)

@ ์ด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋ฉด ์ด๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ํšŒ์ „์‹œํ‚จ ๋‹ค์Œ await ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์™„๋ฃŒ๊นŒ์ง€ ํŽŒํ”„ํ•ด์•ผํ•˜๋Š” ์ƒํƒœ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

์š”์•ฝ :์ด ๋ฏธ๋‹ˆ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ํ•œ ๊ฐ€์ง€๋ฅผ ๊ฐ€์ ธ ์˜ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. Rust์˜ await!() ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด ์—์„œ์ฒ˜๋Ÿผ await ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์˜ ์˜๋ฏธ๋Š” ํฌ๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์œผ๋กœ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋Š” ๊ณตํ†ต์  ์ธ ๋™์ž‘์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณตํ†ต ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

(์ด์ „ ํ† ๋ก ์—์„œ ๊ฒŒ์œผ๋ฅธ ๋ฏธ๋ž˜์—์„œ ์—ด๋งํ•˜๋Š” ๋ฏธ๋ž˜๋กœ ๋ณ€๊ฒฝ๋œ ์–ธ์–ด์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” await foo ๊ฐ€ foo ๊ฐ€ ์ด๋ฏธ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์Œ์„ ์•”์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ณผ.)

ํŽธ์ง‘ : ์ข€ ๋” ๋™๊ธฐํ™” ๋œ ๋ฐฉ์‹์œผ๋กœ ๋…ผ์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด Rust ๊ฐœ๋ฐœ Discord (๋งํฌ๋Š” 24 ์‹œ๊ฐ„) ๋˜๋Š” ๋‚ด๋ถ€ ๋˜๋Š” ์‚ฌ์šฉ์ž (@ CAD97)์—์„œ @ CAD๋ฅผ ํ•‘ํ•ด์ฃผ์„ธ์š”. ๋‚˜๋Š” ์ง์ ‘์ ์ธ ์กฐ์‚ฌ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ๋‚ด ์ž…์žฅ์„ ๋†’์ด๊ณ  ์‹ถ๋‹ค.

ํŽธ์ง‘ 2 : ์šฐ์—ฐํ•œ ํ•‘์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค GitHub @ cad; ๋‚˜๋Š” @๋ฅผ ํƒˆ์ถœํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๊ณ  ๋‹น์‹ ์„ ์ด๊ฒƒ์œผ๋กœ ๋Œ์–ด๋“ค์ด๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@ I60R

?!@# ์™€ ๊ฐ™์€ ์Šค ๋‹ˆํŽซ์€ Perl์„ ์ƒ๊ฐ ๋‚˜๊ฒŒํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” @? ์ด์™ธ์˜ ๋‹ค๋ฅธ ์กฐํ•ฉ์„ ๊ฑฐ์˜ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜ํƒ€๋‚  ๋•Œ๊นŒ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ฝ”๋“œ ๋ณ€ํ™˜๊ธฐ (์˜ˆ : yield sigil)๊ฐ€ ์žˆ๋‹ค๋ฉด ์‹ค์ œ Perl ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

์ ‘๋ฏธ์‚ฌ @ ๋Š” ๋ˆˆ์— ๋„๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ async-await ์ปจํ…์ŠคํŠธ์—์„œ ํฐ ์ด์ ์ž…๋‹ˆ๋‹ค.

await ํฌ์ธํŠธ๋ฅผ ์•Œ์•„ ์ฐจ๋ฆฌ๋Š” ์–ด๋ ค์›€์€ ์ด์ ์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ž˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์šด์˜์ด๋ฉฐ ์šฐ๋ฆฌ๋Š”

์ •๋ง ๋ง์ด๋˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ ๊ทธ๋ฆฌ๊ณ  ๋„ˆ๋ฌด ํฌ๊ฒŒ ๋งํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

C # ๊ฒฝํ—˜์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ๋‹ค์‹œ ์ฝ์œผ์‹ญ์‹œ์˜ค. ์‹ค์ œ๋กœ ํฐ ์†Œ๋ฆฌ๋กœ์ด ์ž์ฃผ์ด ๋ง์„์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


๋‹ค๋ฅธ ์š”์ ์€ ์ƒ๋‹นํžˆ ํƒ€๋‹นํ•˜์ง€๋งŒ ์ œ๊ฐ€ ๋‹ต์žฅ ํ•œ ์ ์€ ๊ณ ์น  ์ˆ˜์—†๋Š” ๊ฐ„๊ฒฉ์ž…๋‹ˆ๋‹ค.

@ CAD97 Rust์—์„œ async ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ๋งํ•  ์ˆ˜์žˆ๋Š” C # ๊ฐœ๋ฐœ์ž๋กœ์„œ. ๊ธ€์Ž„, ๋‹น์‹ ์ด ์„ค๋ช…ํ•˜๋Š”๋Œ€๋กœ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IMHO ๊ท€ํ•˜์˜ ์˜๋ฏธ๋Š” ์ž˜๋ชป๋œ ์ „์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•ฉ๋‹ˆ๋‹ค

๋”ฐ๋ผ์„œ await!(foo) ์€ "์ „ํ†ต์ ์ธ"C # ๋˜๋Š” JS ๋ฐฉ์‹์˜ await foo ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

C # ๊ฐœ๋ฐœ์ž ๋งˆ์Œ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์„ ๋ฌผ์€ ํด๋ง ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜์ง€ ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ await ๋Š” "ํ–ฅํ›„ F ์—์„œ ํ’€๋ฆฐ ๊ฐ’์„ x ๋ณ€์ˆ˜๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค"๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํด๋ง ๋  ๋•Œ๊นŒ์ง€ ๋ฏธ๋ž˜๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ C # ์„ธ๊ณ„ ์ดํ›„์— ์•ˆ์‹ฌ์ด๋˜๋ฏ€๋กœ ์‚ฌ๋žŒ๋“ค์€ ๊ณ ๋ง™๊ฒŒ๋„ ํ–‰๋ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋„ C #์€ Iterators / generatos์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ฒŒ์œผ ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— C # ๊ตฐ์ค‘์€ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์ž˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, await ์ž‘์—…์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ % younameit % ์–ธ์–ด๋กœ await ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š”์‹œ๊ธธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‰ฝ์ง€๋งŒ ๊ทธ๋ ‡์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๋‹น์‹ ์ด ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ๋งŽ์€ ๊ฑฐ๋ž˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ์ด์— ํ˜ผ๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. eager / lazy ์‹คํ–‰์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์€ ๋งค์šฐ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์š” ์„ค๊ณ„ ๋ฌธ์ œ๊ฐ€๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

@Pzixel C # ๊ฐœ๋ฐœ์ž ๋งˆ์Œ์—์„œ๋„ ๋˜‘๊ฐ™์€ ์ผ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์„ ๋ฌผ์€ ํด๋ง ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜์ง€ ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

eager / lazy ์‹คํ–‰์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์€ _ ์ •๋ง _ ๋“œ๋ฌผ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์š” ์„ค๊ณ„ ๋ฌธ์ œ๊ฐ€๋˜์–ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. "์ผ๋ถ€ ์•ฝ์†์„ ์ƒ์„ฑ ํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— await ๊ทธ๋“ค์„ ์ƒ์„ฑ"ํ•˜๋Š” ํŒจํ„ด ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ด๊ณ  ๋ฐ”๋žŒ์ง ํ•˜์ง€๋งŒ Rust์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

๊ทธ๊ฒƒ์€ ๋งค์šฐ ํฐ ์ฐจ์ด์ด๋ฉฐ, ์‹ฌ์ง€์–ด Rust ํšŒ์›๋“ค์„ ๋†€๋ผ๊ฒŒํ•˜๊ธฐ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค!

Rust์˜ async / await๋Š” ์‹ค์ œ๋กœ ๋ชจ๋‚˜ ๋”• ์‹œ์Šคํ…œ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript / C #๊ณผ ๊ณตํ†ต์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

  • ๊ตฌํ˜„์€ ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค (์ƒํƒœ ๋จธ์‹ ์„ ๋นŒ๋“œ ํ•œ ๋‹ค์Œ ๋ชจ๋‚˜๋“œ์™€ ์ผ์น˜ํ•˜๋Š” ํƒœ์Šคํฌ์—์„œ ์‹คํ–‰).

  • API๋Š” ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค (ํ’€ vs ํ‘ธ์‹œ).

  • ๊ฒŒ ์œผ๋ฅด๋Š” ๊ธฐ๋ณธ ๋™์ž‘์€ ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค (๋ชจ๋‚˜๋“œ์™€ ์ผ์น˜).

  • ์†Œ๋น„์ž๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•˜๋‚˜๋งŒ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ชจ๋‚˜๋“œ์™€ ์ผ์น˜).

  • ์˜ค๋ฅ˜๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ? ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค (๋ชจ๋‚˜๋“œ ๋ณ€ํ™˜๊ธฐ์™€ ์ผ์น˜ ํ•จ).

  • ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์€ ์™„์ „ํžˆ ๋‹ค๋ฅด๋ฏ€๋กœ Rust Futures์˜ ๊ตฌํ˜„๊ณผ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ Futures๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

์œ ์ผํ•œ ๊ณตํ†ต์ ์€ ๋ชจ๋“  ์‹œ์Šคํ…œ์ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋‹ค์•ผ. ๊ทธ๊ฒƒ์€ ์ „ํ˜€ ๊ณตํ†ต์ ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด C #์„ ์–ธ๊ธ‰ํ–ˆ๋‹ค. ์šฐ๋ฆฐ ์•Œ์•„.

์šฐ๋ฆฌ๋Š” C #์ด ๋ฌด์—‡์„ํ–ˆ๋Š”์ง€, JavaScript๊ฐ€ ๋ฌด์—‡์„ํ–ˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ ์–ธ์–ด๊ฐ€ ์™œ ๊ทธ๋Ÿฐ ๊ฒฐ์ •์„ ๋‚ด ๋ ธ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

C #์˜ ๊ณต์‹ ํŒ€์›์ด async / await๋กœ ์ด๋Ÿฌํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฐ ์ด์œ ๋ฅผ ์ž์„ธํžˆ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„๋ฌด๋„ ์ด๋Ÿฌํ•œ ์–ธ์–ด, ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ๋˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ฌด์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ณ ๋ ค๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Rust๋Š” ์‹ค์ œ๋กœ C #์ด๋‚˜ JavaScript (๋˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด)์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ํ•˜๋Š” ์ผ์„ ๋งน๋ชฉ์ ์œผ๋กœ ๋ชจ๋ฐฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์—์„œ await foo๋Š” ์˜๋ฏธ ์ƒ "์ด ์ž‘์—…์„ ํŒŒํ‚นํ•˜๊ณ  ์ž‘์—… foo์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

Rust์—์„œ๋„ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ํ•จ์ˆ˜์˜ ์˜๋ฏธ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ fn (Future ์ƒ์„ฑ)์„ ํ˜ธ์ถœํ•˜๋ฉด ์•„์ง ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ JS ๋ฐ C # ์„ธ๊ณ„์™€ ์‹ค์ œ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ๋‹ค๋ฅธ ๊ณณ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฏธ๋ž˜๊ฐ€ ์™„์„ฑ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. "์ผ๋ถ€ ์•ฝ์†์„ ์ƒ์„ฑ ํ•œ ๋‹ค์Œ ๋‚˜์ค‘์— await ๊ทธ๋“ค์„ ์ƒ์„ฑ"ํ•˜๋Š” ํŒจํ„ด ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ด๊ณ  ๋ฐ”๋žŒ์ง ํ•˜์ง€๋งŒ Rust์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

๋” ์ž์„ธํžˆ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์—ˆ์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

let foos = (1..10).map(|x| some_future(x)); // create futures, unlike C#/JS don't actually run anything
let results = await foos.join(); // awaits them

๋ฌผ๋ก  ๋‘ ๋ฒˆ์งธ ์ค„๊นŒ์ง€ ์‹คํ–‰๋˜์ง€๋Š” ์•Š์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฐ”๋žŒ์งํ•œ ๋™์ž‘์ด๋ฉฐ await ํ‚ค์›Œ๋“œ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ํฐ ์ฐจ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์ œ ์ด๋ฆ„ ์ž์ฒด๋Š” await ๋‹จ์–ด๊ฐ€ ์—ฌ๊ธฐ์„œ ์˜๋ฏธ๊ฐ€ ์žˆ์Œ์„ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค.

์•„๋ฌด๋„ ์ด๋Ÿฌํ•œ ์–ธ์–ด, ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ ๋˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ฌด์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๊ณ ๋ ค๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ™์€ ์ฃผ์žฅ์„ ๋ฐ˜๋ณตํ•ด์„œ ์„ฑ๊ฐ€ ์‹œ๊ฒŒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๋‚ด๊ฐ€ํ•ด์•ผ ํ•  ์ผ์„ ์ „๋‹ฌํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ๋” ์ด์ƒํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.


์ถ”์‹ 

  • API๋Š” ์™„์ „ํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค (ํ’€ vs ํ‘ธ์‹œ).

์ž์‹ ์˜ ๋ฏธ๋ž˜๋งŒ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 99 (100?) %์˜ ๊ฒฝ์šฐ์—๋Š”์ด ์ฐจ์ด๋ฅผ ์ˆจ๊ธฐ๋Š” ๊ฒฐํ•ฉ ์ž pf ์„ ๋ฌผ ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์€ ์™„์ „ํžˆ ๋‹ค๋ฅด๋ฏ€๋กœ Rust Futures์˜ ๊ตฌํ˜„๊ณผ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ Futures๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๋” ์ž์„ธํžˆ ๋ง์”€ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ Hyper์—์„œ ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ด๋ฏธ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ ์–ด๋–ค ์ฐจ์ด๋„ ๋Š๋ผ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— async , ๊ฑฐ๊ธฐ์— await ๋„ฃ์–ด, ์™„๋ฃŒ .

rust์˜ async / await๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋ญ”๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์„ํ•ด์•ผํ•œ๋‹ค๋Š” ์ฃผ์žฅ์€ ๊ฝค ์„ค๋“๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. C

for (int i = 0; i < n; i++)

๊ทธ๋ฆฌ๊ณ  ํŒŒ์ด์ฌ

for i in range(n)

ํ™•์‹คํžˆ ๋™์ผํ•œ ๊ธฐ๋ณธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ณต์œ ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ Python์ด for ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? i in range(n) @ ๋˜๋Š” i in range(n) --->> ๋˜๋Š”์ด ์ค‘์š”ํ•œ ์ฐจ์ด์ ์„ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๋ฌด์—‡์ด๋“  ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ผ์ƒ ์—…๋ฌด์— ์ฐจ์ด๊ฐ€ ์ค‘์š”ํ•œ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค!

์ „ํ˜•์ ์ธ ๋…น ์‚ฌ์šฉ์ž ์˜ ์ผ์ƒ ์ƒํ™œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ผ๋ถ€ HTTP API์™€ ์ƒํ˜ธ ์ž‘์šฉ
  2. ๋„คํŠธ์›Œํฌ ์ฝ”๋“œ ์ž‘์„ฑ

๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Š” ์ •๋ง

  1. ๊ทธ๋Š” ๋น ๋ฅด๊ณ  ์ธ์ฒด ๊ณตํ•™์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ผ์„ ๋งˆ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. Rust๋Š” ๊ทธ์˜ ์ผ์„ ์ž˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋Š” ๋‚ฎ์€ ์ˆ˜์ค€์˜ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

NOT rust์—๋Š” C #, JS์™€ ๋‹ค๋ฅธ ๋ฐฑ๋งŒ ๊ฐ€์ง€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ด€๋ จ์—†๋Š” ์ฐจ์ด์ ์„ ์ˆจ๊ธฐ๊ณ  ์œ ์šฉํ•œ ์ฐจ์ด์  ๋งŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์–ธ์–ด ๋””์ž์ด๋„ˆ์˜ ์ž„๋ฌด ์ž…๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€, "๋‚˜๋Š” ๊ทธ๊ฒƒ์˜ ์ƒํƒœ ๋จธ์‹ ์„ ๋ชจ๋ฅธ๋‹ค", "๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ’€ ๊ธฐ๋ฐ˜์ธ์ง€ ๋ชจ๋ฅธ๋‹ค"์™€ ๊ฐ™์€ ์ด์œ ๋กœ await!() ๋ฅผ ๋ถˆํ‰ํ•˜์ง€ ์•Š๊ณ ์žˆ๋‹ค.

์‚ฌ์šฉ์ž๋Š” ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์œผ๋ฉฐ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ๋‹ค๋ฅธ ๊ณณ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฏธ๋ž˜๊ฐ€ ์™„์„ฑ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋‚œ ๊ทธ๋ƒฅ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ let result = await!(future) ์—์„œ async fn ๊ฐ€ ์ง‘ํ–‰์ž์— ๋ฐฐ์น˜ํ•˜๊ณ  ๊ทธ๊ฒƒ์— ์˜ํ•ด ํด๋ง ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋Šฅ, ์•„๋ฌด๊ฒƒ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ ํ•˜๊ณ  ์ „ํ™”๋ฅผ.

@ ben0x539 ์˜ˆ, ๋‹ค์‹œ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค ...ํ•˜์ง€๋งŒ ํ˜„์žฌ๋Š” ์ถ”๊ฐ€ ํ•  ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค.

@ CAD97 ๋‚ด ๊ฒŒ์‹œ๋ฌผ์ด ์˜๊ฐ์„ ์–ป์€ ๊ฒƒ์„ ๋ณด๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. Kotlin์— ๋Œ€ํ•ด ๋Œ€๋‹ต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฝ์šฐ Rust์™€ ๊ฐ™์€ ๊ฒŒ์œผ๋ฅธ ๋™์ž‘์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : val lazy = async(start=LAZY) { deferred_operation() }; ). ์œ ์‚ฌํ•œ ์˜๋ฏธ๋ก ์— ๋Œ€ํ•ด : IMO์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์˜๋ฏธ๋ก ์€ ๋ฐ˜์‘ ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜์‘ ํ˜• ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝœ๋“œ (๊ฒŒ์œผ๋ฅธ)์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (์˜ˆ : val lazy = Observable.fromCallable { deferred_operation() }; ). ๊ตฌ๋…์€ Rust์—์„œ await!() ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‹ค์ œ ์ž‘์—…์„ ์˜ˆ์•ฝํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์€ ๋น„ ์ฐจ๋‹จ ์ž‘์—…์ด๊ณ  ๋น„๋™๊ธฐ ์ ์œผ๋กœ ๊ณ„์‚ฐ ๋œ ๊ฒฐ๊ณผ๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ํ˜„์žฌ ์ œ์–ด ํ๋ฆ„๊ณผ๋Š” ๋ณ„๋„๋กœ ํด๋กœ์ €์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ทจ์†Œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” Rust async ๋™์ž‘์ด ๋…ํŠนํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  await ๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ด ์—ฌ๊ธฐ์„œ ์žฅ์  ์ผ ๋ฟ์ด๋ผ๋Š” ๋‹น์‹ ์˜ ์ฃผ์žฅ์„ ์ „์ ์œผ๋กœ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค!

@Pzixel ๋‚˜๋Š” ์ƒˆ๋กœ์šด ์ธ์žฅ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. yield ๋ฅผ์‹œ๊ธธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ if / match / loop / return ์™€ ๊ฐ™์€ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ์šฐ์„  ์ˆœ์œ„์— ์žˆ์œผ๋ฏ€๋กœ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ @ ๋ฐ ? ์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ์ด๋ฉฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋…ผ๋ฆฌ๋Š” ๋œ ์ค‘์š”ํ•˜๋ฏ€๋กœ ๋ฏธ๋ฌ˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํฐ await ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ (ํ…์ŠคํŠธ์˜ ์–‘์„ ๊ณ ๋ คํ•  ๋•Œ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ๋†“์น  ์ˆ˜ ์žˆ์Œ์„ ๊ณ ๋ คํ•  ๋•Œ)์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์„ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ๋“ค ๋ชจ๋‘๊ฐ€ ๊ถŒ์œ„ ๋‚˜ ๊ฒฝํ—˜์— ํ˜ธ์†Œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์˜ ๊ถŒ์œ„ ๋‚˜ ๊ฒฝํ—˜์„ ๋ฌด์‹œ ํ•˜์‹ญ์‹œ์˜ค .

@tajimaha ๊ท€ํ•˜๊ฐ€ ์ œ๊ณต ํ•œ Python์˜ ์˜ˆ์ œ์—๋Š” ์‹ค์ œ๋กœ ๋” ๋งŽ์€ "๊ตฌํ˜„ ์„ธ๋ถ€ ์ •๋ณด"๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. for ๋ฅผ async , (int i = 0; i < n; i++) ์„ await , i in range(n) ์„ @ ๊ฐ„์ฃผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python์€ ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ- in (Java์—์„œ๋Š” ์‹ค์ œ๋กœ sigil- : )๋ฅผ ๋„์ž…ํ–ˆ์œผ๋ฉฐ ์ถ”๊ฐ€๋กœ ์ƒˆ๋กœ์šด ๋ฒ”์œ„ ๊ตฌ๋ฌธ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋„์ž…ํ•˜๋Š” ๋Œ€์‹  (i=0, n=0; i<n; i++) ์™€ ๊ฐ™์€ ๋” ์นœ์ˆ™ํ•œ ๊ฒƒ์„ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์€ ๊ธ์ •์ ์ผ ๋ฟ์ด๋ฉฐ ๊ตฌ๋ฌธ์€ ๋” ๊ฐ„๋‹จํ•˜๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์ •๋ง ๊ด€์‹ฌ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

@Pzixel ๋‚˜๋Š” ์ƒˆ๋กœ์šด ์ธ์žฅ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. yield ๋ฅผ์‹œ๊ธธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ if / match / loop / return ์™€ ๊ฐ™์€ ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๊ฐ€ ํ•ญ์ƒ ์šฐ์„  ์ˆœ์œ„์— ์žˆ์œผ๋ฏ€๋กœ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ @ ๋ฐ ? ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ์ด๋ฉฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋…ผ๋ฆฌ๋Š” ๋œ ์ค‘์š”ํ•˜๋ฏ€๋กœ ๋ฏธ๋ฌ˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

await ์€ "์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
์ž˜๋ชป๋œ ์ „์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ์˜ ์˜๋ฏธ๋„ ๊ฑฐ์ง“์ž…๋‹ˆ๋‹ค.

์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋„ ์ œ์–ด ํ๋ฆ„์ด์ง€๋งŒ ์•„๋ฌด๋„ ? ์ด ๋‚˜์œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ํฐ await ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ (ํ…์ŠคํŠธ์˜ ์–‘์„ ๊ณ ๋ คํ•  ๋•Œ ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ๋“ค์„ ๋†“์น  ์ˆ˜ ์žˆ์Œ์„ ๊ณ ๋ คํ•  ๋•Œ)์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๊ถŒ์œ„ ๋‚˜ ๊ฒฝํ—˜์— ํ˜ธ์†Œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€์˜ ๊ถŒ์œ„ ๋‚˜ ๊ฒฝํ—˜์„ ๋ฌด์‹œํ•˜์‹ญ์‹œ์˜ค. _ ์—ฌ๊ธฐ _์—์„œ ์™„์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ ์šฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.)

Rust๋Š” ์ž์ฒด ๊ฒฝํ—˜์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€, ๋‹ค๋ฅธ ํŒ€์ด ๊ฒฝํ—˜ํ•˜๋Š” ๋“ฑ ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ธ์žฅ์— ๋„ˆ๋ฌด ์ž์‹ ์ด ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ ํ–ˆ๋Š”์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Rust์—์„œ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์„ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ ๋งŽ์€ ์ ‘๋ฏธ์‚ฌ ๋Œ€ ์ ‘๋‘์‚ฌ ์ธ์ˆ˜๋ฅผ ๋ณด์•˜์œผ๋ฉฐ ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ์„ธ๊ณ„๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๋ฏธ ์ด๊ฒƒ์„ C ++๋กœ ์ œ์•ˆํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. C ++ ๋ฐ Coroutine TS ์ œ์•ˆ์ด ์—ฌ๊ธฐ์—์„œ ๋ช‡ ๋ฒˆ ์–ธ๊ธ‰๋˜์—ˆ์ง€๋งŒ, ํ•„์ž์˜ ๊ฒฌํ•ด๋กœ๋Š” Core Coroutines ๋ผ๋Š” ๋Œ€์ฒด ์ œ์•ˆ์ด ๋” ๋งŽ์€์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Core Coroutines์˜ ์ž‘์„ฑ์ž๋Š” co_await ๋ฅผ ์ƒˆ๋กœ์šด ์šด์˜์ž์™€ ์œ ์‚ฌํ•œ ํ† ํฐ์œผ๋กœ ๋Œ€์ฒด ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
unwrap operator syntax ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ํ†ตํ•ด ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ ํ‘œ๊ธฐ๋ฒ•์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋ชจํ˜ธํ•จ์—†์ด) :

futureโ€‹<string>โ€‹ gโ€‹();
stringโ€‹ s โ€‹=โ€‹โ€‹ [<-]โ€‹ fโ€‹();

optional_structโ€‹[->].โ€‹optional_sub_structโ€‹[->].โ€‹field

ํฅ๋ฏธ ๋กญ๊ฑฐ๋‚˜ ์ ์–ด๋„ ํ† ๋ก ์„ ๋” ์™„๋ฒฝํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Rust๋Š” ์‹ค์ œ๋กœ C #์ด๋‚˜ JavaScript (๋˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด)์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ํ•˜๋Š” ์ผ์„ ๋งน๋ชฉ์ ์œผ๋กœ ๋ชจ๋ฐฉ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋น„ ์ •ํ†ต ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ์„ฑํ–ฅ์— ๋Œ€ํ•œ ๋ณ€๋ช…์œผ๋กœ "์ฐจ์ด"๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ธ๊ธฐ์žˆ๋Š” ์–ธ์–ด, Java, C, Python, JavaScript, C #, PHP, Ruby, Go, Swift ๋“ฑ ์ •์ , ๋™์ , ์ปดํŒŒ์ผ, ํ•ด์„์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๊ธฐ๋Šฅ ์„ธํŠธ๋Š” ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€๋งŒ ๊ตฌ๋ฌธ์—๋Š” ์—ฌ์ „ํžˆ ๋งŽ์€ ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์–ธ์–ด๊ฐ€ 'brainf * ck'์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋Š” ์ˆœ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด์ƒํ•œ ๊ตฌ๋ฌธ์ด ์•„๋‹Œ ๋‹ค์–‘ํ•˜์ง€๋งŒ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์€ ํ›„ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฒด์ธ์— ๋Œ€ํ•œ ๊ธด๊ธ‰ํ•œ ํ•„์š”์„ฑ์„ ๋ฌดํšจํ™”ํ•˜๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์‹œ์ ์ธ ๋ณ€์ˆ˜๋กœ ์ธํ•ด ์งœ์ฆ์„ ๋‚ธ๋‹ค๋Š” ์ฃผ์žฅ์„ ๋ฌดํšจํ™”ํ•˜๋ฉด ๋…ผ์Ÿ์ด ๋Œ€์ฒด๋กœ ๋๋‚ฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

IMO, ๋‹น์‹ ์€ postfix ๊ตฌ๋ฌธ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. "์ฐจ์ด"์—๋งŒ ์˜์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ํ•„์‚ฌ์  ์ธ ์‹œ๋„์ž…๋‹ˆ๋‹ค.

@tensorduruk ๋‹น์‹ ์˜ ๋ง์ด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋„ˆ๋ฌด ์ ๋Œ€์ ์ด๋ผ๋Š” ๋Š๋‚Œ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.


๊ทธ๋ฆฌ๊ณ  ์†”์งํžˆ ๋งํ•ด์„œ ์ ‘๋ฏธ์‚ฌ ๊ตฌ๋ฌธ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์œผ๋ฉด ์ง€๊ธˆ์€ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ ๊ฒฐ์ •ํ•˜๊ณ  ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์ด์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑ๋˜๋Š”์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์˜ ์–‘์„ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ ‘๋ฏธ์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด postfix์™€ ๊ฐ™์€ ํ˜์‹ ์ ์ธ ๋ณ€๊ฒฝ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๋‹ฌ๋ž˜๋Š” ๋™์‹œ์— postfix๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ข‹์€ ์‹ค์šฉ์ ์ธ ์ฃผ์žฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์œผ๋กœ ์ตœ์•…์˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ ‘๋‘์‚ฌ await๋ณด๋‹ค ์–ด๋–ป๊ฒŒ ๋“  ์™„์ „ํžˆ ๋” ๋‚˜์€ ์ ‘๋ฏธ์‚ฌ await ๊ตฌ๋ฌธ์„ ์ƒ๊ฐํ•ด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋” ๋‚˜์€ ํ˜•ํƒœ์˜ await๋กœ ์ „ํ™˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋งŽ์€ ์ฝ”๋“œ ๋ณ€๋™์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ €๋Š”์ด ๋ชจ๋“  ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์‹ค์ œ๋กœ ์—ฐ๊ฒฐ์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฒด์ด๋‹์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด postfix await๊ฐ€ ์™„์ „ํžˆ ์ฐฝ ๋ฐ–์œผ๋กœ ๋‚˜์˜ค๊ณ  ์ ‘๋‘์‚ฌ await์— ์ •์ฐฉํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฒด์ธ์€ Rust์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ฏ€๋กœ ๋‹ค์Œ ์ฃผ์ œ์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค.

if we should have only postfix await:
    what's the best syntax for it that:
         benefits chaining?
         is also ok in non-chaining scenarios
         is readable in both chainable and non-chainable contexts?
else if we should have only prefix await:
    what's the best syntax for it that:
         isn't ambiguous in the sense of order of operation (useful vs obvious)
else if we should have both prefix and postfix await:
    what's the best syntax for it that:
         benefits chaining?
         is also ok in non-chaining scenarios
         is readable in both chainable and non-chainable contexts?
         isn't ambiguous in the sense of order of operation (useful vs obvious)
    should it be a single unified syntax that somehow works for both prefix and postfix?
    would there be clear situations where prefix syntax is favored over postfix?
    would there be a situation where postfix syntax isn't allowed, but prefix is, and vice-versa?

์•„๋‹ˆ๋ฉด ๊ทธ๋Ÿฐ ๊ฒƒ. ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜๋ณด๋‹ค ๋” ์ข‹์€ ์ ์ˆ˜๋กœ ๋” ๋‚˜์€ ๊ฒฐ์ • ํŒจํ„ด์„ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•ด์ฃผ์„ธ์š”! XD

๋”ฐ๋ผ์„œ ๋จผ์ € ๊ตฌ๋ฌธ์„ ๋…ผ์˜ํ•˜๋Š” ๋Œ€์‹  ์ ‘๋ฏธ์‚ฌ, ์ ‘๋‘์‚ฌ ๋˜๋Š” ์ ‘๋ฏธ์‚ฌ์™€ ์ ‘๋‘์‚ฌ๋ฅผ ๋ชจ๋‘ ์›ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•œ ์„ ํƒ์„ ์›ํ•˜๋Š” ์ด์œ ๋ฅผ ๊ฒฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ๊ตฌ๋ฌธ ์„ ํƒ๊ณผ ๊ด€๋ จ๋œ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

IMO, ๋‹น์‹ ์€ postfix ๊ตฌ๋ฌธ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. "์ฐจ์ด"์—๋งŒ ์˜์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ํ•„์‚ฌ์  ์ธ ์‹œ๋„์ž…๋‹ˆ๋‹ค.

์ง„์ง€ํ•˜๊ฒŒ, ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ ๋Œ€๊ฐ ๋Œ€์‹  ๋‹น์‹ ์ด ๋งํ•œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋‹น์‹ ์˜ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋‹ค๋ฅธ ์ „ํ†ต์ ์ธ ์–ธ์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— rust๋Š” ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ์šฉ์„ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ฒด์ธ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐํšŒ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ฒด์ธ์ด ์ต๋ช…์œผ๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋‹ค๋ฉด ์ž„์‹œ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•ผ๊ฐ„์ฒ˜๋Ÿผ await๋ฅผ ์œ„ํ•ด ํ˜„์žฌ ๋งคํฌ๋กœ ํ‚ค์›Œ๋“œ๋ฅผ ๊ณ ์ˆ˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ผ๊ฐ„ ๊ธฐ๋Šฅ์œผ๋กœ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋†€๊ฒŒํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ, ์ผ๋‹จ ํ•ด๊ฒฐ๋˜๋ฉด ์ดํƒˆ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ rustfix์—์„œ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

IMO, ๋‹น์‹ ์€ postfix ๊ตฌ๋ฌธ์˜ ํ•„์š”์„ฑ์— ๋Œ€ํ•œ ๋…ผ์Ÿ์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. "์ฐจ์ด"์—๋งŒ ์˜์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ํ•„์‚ฌ์  ์ธ ์‹œ๋„์ž…๋‹ˆ๋‹ค.

์ง„์ง€ํ•˜๊ฒŒ, ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ ๋Œ€๊ฐ ๋Œ€์‹  ๋‹น์‹ ์ด ๋งํ•œ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
๋‹น์‹ ์˜ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๋ฉด, ๋‹ค๋ฅธ ์ „ํ†ต์ ์ธ ์–ธ์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— rust๋Š” ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์•ผํ•ฉ๋‹ˆ๋‹ค. Rust๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ์šฉ์„ ๊ฐ€์ ธ์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ฒด์ธ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐํšŒ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ฒด์ธ์ด ์ต๋ช…์œผ๋กœ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ๋‹ค๋ฉด ์ž„์‹œ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์•ผ๊ฐ„์ฒ˜๋Ÿผ await๋ฅผ ์œ„ํ•ด ํ˜„์žฌ ๋งคํฌ๋กœ ํ‚ค์›Œ๋“œ๋ฅผ ๊ณ ์ˆ˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ผ๊ฐ„ ๊ธฐ๋Šฅ์œผ๋กœ ์ ‘๋ฏธ์‚ฌ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๋†€๊ฒŒํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ, ์ผ๋‹จ ํ•ด๊ฒฐ๋˜๋ฉด ์ดํƒˆ์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ rustfix์—์„œ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ์œผ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์ƒํ•œ ๊ตฌ๋ฌธ์ด ์•„๋‹Œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค๊ณ  ๋งํ–ˆ๋‹ค. ๊ตฌ์กฐ์ฒด? ๋นŒ๋ฆฌ? ํ’๋ชจ!

์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค. ์‚ฌ๋žŒ๋“ค์€ ์ž„์‹œ ๋ฐ”์ธ๋”ฉ์ด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ์„ ์˜ˆ์‹œ ๋˜๋Š” ํ†ต๊ณ„์™€ ํ•จ๊ป˜ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. f await f.await ์ง€์ง€์ž๋“ค์€ ์ฆ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ๋Œ€๋ฐฉ์„ ์„ค๋“ ํ•ด ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋ฅผ ๋น„ํŒํ•˜๋Š” ๊ฒƒ๋„ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. postfix๋ฅผ ๋ฐ›์•„๋“ค์ด ๊ธฐ ์œ„ํ•ด์„œ๋Š” postfix๊ฐ€ ์œ ์šฉํ•œ ๊ณณ์„ ์ฃผ์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

C # ๋˜๋Š” JS์™€ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋Œ€๋ถ€๋ถ„์˜ ๊ฐœ๋ฐœ์ž๋Š” ์„ธ์ƒ์—์„œ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” Rust๊ฐ€ ์ƒˆ๋กœ์šด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ผ๊ด€์„ฑ์ด์—†๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Rust๋Š” ๋˜ํ•œ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ๋“ค์ด ๋ฐฐ์šฐ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ await ์ ‘๋ฏธ์‚ฌ @ insead ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋‚ด ๊ฒŒ์‹œ๋ฌผ์˜ ๋ถ€๋ก์ž…๋‹ˆ๋‹ค.


์šฐ๋ฆฌ๋Š” ๋Œ€์‹  ๋งŽ์€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๊ฒฝํ—˜์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋™์ผํ•œ ๊ฒฝํ—˜์„ ์™„์ „ํžˆ ๋ฐ˜๋ณตํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ @ ์— ๋Œ€ํ•ด ์ด๋Ÿฐ ์‹์œผ๋กœ ๋…ผ์Ÿ ํ•  ๋•Œ ์ด์ „ ๊ฒฝํ—˜์— ํ˜ธ์†Œํ•˜๋Š” ๊ฒƒ์ด ์„ค๋“๋ ฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

๋ฌธ์ œ์— ๋Œ€ํ•œ ์œ ์ „ ์  ์„ค๋ช…์€ ์‚ฌ์‹ค ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ํ˜„์žฌ ํ˜•ํƒœ๋ฅผ ์ทจํ•œ ์ด์œ ๋ฅผ ๋ฐํžˆ๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์žฅ์ ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๊ฒฐ์ •์ ์ธ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ข‹์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— await ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์‚ฌ๋žŒ๋“ค์€ ์‚ฌ๋ž‘์„ ํ•  ์ˆ˜ await ๊ทธ๊ฒƒ์˜ ๋‹ค๋ฅธ ๋งŽ์€ ์ด์œ ๋กœ, ๋‹จ์ง€ ๋•Œ๋ฌธ์— await . ์ด๋Ÿฌํ•œ ์ด์œ ๋Š” Rust์—๋„ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  @ ์— ๋Œ€ํ•ด ์ด๋Ÿฐ ์‹์œผ๋กœ ๋…ผ์Ÿํ•˜๋Š” ๊ฒƒ์€ ๋Œ€์ค‘์—๊ฒŒ ํ˜ธ์†Œํ•˜๋Š” ๊ฒƒ์ด ์„ค๋“๋ ฅ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ† ๋ก ์— ์ƒˆ๋กœ์šด ์š”์ ์„ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ธ์ˆ˜๋Š” ๊ท€๋‚ฉ ๋…ผ๋ฆฌ์—์„œ ์œ ํšจํ•œ ์ธ์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒ๋‹นํ•œ ์ธ๊ตฌ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ ์„ค๋ฌธ ์กฐ์‚ฌ์—์„œ 100 %๊ฐ€ ๋‹ค๋ฅธ ์ œํ’ˆ๋ณด๋‹ค ํŠน์ • ๋ธŒ๋žœ๋“œ์˜ ์ œํ’ˆ์„ ์„ ํ˜ธํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ณ ๋ คํ•  ๋‹ค์Œ ์‚ฌ๋žŒ์ด ํ•ด๋‹น ๋ธŒ๋žœ๋“œ๋ฅผ ์„ ํ˜ธ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์œผ๋ฉฐ (์˜ˆ์™ธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ญ์ƒ 100 %๋Š” ์•„๋‹˜) ์„ค๋ฌธ ์กฐ์‚ฌ๊ฐ€ ํ•ด๋‹น ์ฃผ์žฅ์˜ ์œ ํšจํ•œ ์ฆ๊ฑฐ๋ผ๊ณ  ์„ค๋“๋ ฅ์žˆ๋Š” (๊ฐ•๋ ฅํ•œ) ์ฃผ์žฅ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์˜ˆ๋ฅผ ๋“ค์–ด ์„ ํ˜ธํ•˜๋Š” ๋ธŒ๋žœ๋“œ๊ฐ€ ๊ตฌ์„ฑ๋ฉด์—์„œ ๊ฒฝ์Ÿ์‚ฌ๋ณด๋‹ค ์šฐ์›”ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋‹ค๋ฅธ ๋ธŒ๋žœ๋“œ๋ณด๋‹ค ์„ ํ˜ธํ•˜๋Š” ๋ธŒ๋žœ๋“œ๋ผ๋Š” ๊ฒƒ์„ ์—ฌ๋ก  ์กฐ์‚ฌ์—์„œ ์ž…์ฆํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ์—ฐ์—ญ์  ์ถ”๋ก ์„ ์ฆ๊ฑฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถ€์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.

ํ—‰

๊ทธ๋Ÿฌ๋‚˜ ๋…น์€ ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ? ์ด ์žˆ๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ „ํŒŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. C #์—์„œ async / await๋Š” ์ž๋™์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ๋ž˜ํ•‘ํ•˜๊ณ  ๋Œ€๊ธฐ ์ง€์ ์—์„œ ์˜ˆ์™ธ๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค. ๋…น์Šฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. C #์—์„œ await ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

var response = (await client.GetAsync("www.google.com")).HandleException();
var json =  (await response.ReadAsStreamAsync()).HandleException();
var somethingElse = (await DoMoreAsyncStuff(json)).HandleException();
...

์ด ๋ชจ๋“  ๊ต์ •๊ธฐ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ง€๋ฃจํ•ฉ๋‹ˆ๋‹ค.

C #์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

try
{
  var response = await client.GetAsync("www.google.com");
  var json =  await response.ReadAsStreamAsync();
  var somethingElse = await DoMoreAsyncStuff(json);
}
catch (Exception ex)
{
  // handle exception
}

propagate-error-chaining ์ธ์ˆ˜ (์˜ˆ : foo().await? ์™€ ๊ด€๋ จํ•˜์—ฌ ? ๋ฅผ ์ ‘๋‘์‚ฌ์˜ await ์—ฐ์‚ฐ์ž์— ์ถ”๊ฐ€ ํ•  ์ˆ˜์—†๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

let response = await? getProfile();

๊ทธ๋ƒฅ ๋‚ ์— ๋ฐœ์ƒํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ : ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ match A์˜ Future<Result<...>> ? ๋‹ค์Œ ์ค‘ ์–ด๋Š ๊ฒƒ์ด ๋” ์ฝ๊ธฐ ์‰ฌ์šด๊ฐ€์š”?

// Prefix
let userId = match await response {
  Ok(u) => u.id,
  _ => -1
};
// Postfix
let userId = match response {
  Ok(u) => u.id,
  _ => -1
} await;

๋˜ํ•œ async match ํ‘œํ˜„์‹์ด ๋ฌธ์ œ๊ฐ€ ๋ ๊นŒ์š”? ์—์„œ์™€ ๊ฐ™์ด ์ผ์น˜ ํ‘œํ˜„์‹์˜ ๋ณธ๋ฌธ์ด ๋น„ ๋™๊ธฐํ™”๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด match await response ์™€ await match response ์‚ฌ์ด์— ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. match ๋ฐ await ๋Š” ๋‘˜ ๋‹ค ์‚ฌ์‹ค์ƒ ๋‹จํ•ญ ์—ฐ์‚ฐ์ž์ด๊ณ  match ๋Š” ์ด๋ฏธ ์ ‘๋‘์‚ฌ์ด๋ฏ€๋กœ await ๋„ ์ ‘๋‘์‚ฌ์ธ์ง€ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ ‘๋‘์‚ฌ์™€ ํ•˜๋‚˜์˜ ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ผ์น˜ ๋˜๋Š” ์‘๋‹ต์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

let userId = match response {
  Ok(u) => somethingAsync(u),
  _ => -1
} await; // Are we awaiting match or response here?

๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// Prefix - yes, double await is weird and ugly but...
let userId = await match await response {
  Ok(u) => somethingAsync(u),
  _ => -1
} await;
// Postfix - ... this is weirder and uglier
let userId = match response {
  Ok(u) => somethingAsync(u),
  _ => -1
} await await;

๊ทธ๋Ÿด์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ

// Postfix - ... this is weirder and uglier
let userId = match response await {
  Ok(u) => somethingAsync(u),
  _ => -1
} await;

(ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋””์ž์ธ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ €๋Š” Rust๊ฐ€ match ์ ‘๋‘์‚ฌ ์ธ ๋‹จํ•ญ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ await ๋Š” ๋‹จํ•ญ ์—ฐ์‚ฐ์ž๋ผ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

C# // Postfix - ... this is weirder and uglier let userId = match response await { ... } await;

์•„๋ฆ„๋‹ค์›€์€ ๋ณด๋Š” ์‚ฌ๋žŒ์˜ ๋ˆˆ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ €๋Š” Rust๊ฐ€ match ์ ‘๋‘์‚ฌ ์ธ ๋‹จํ•ญ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•ด ์šฐ์„ ๊ถŒ์ด ์žˆ๊ณ  await ๊ฐ€ ๋‹จํ•ญ ์—ฐ์‚ฐ์ž๋ผ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ? ์€ ๋‹จํ•ญ์ด์ง€๋งŒ ์ ‘๋ฏธ์‚ฌ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‚˜๋Š” ํ† ๋ก ์ด ์ด์ œ ๋ฐฐ์ˆ˜๊ตฌ๋ฅผ ๋Œ๊ณ  ์žˆ๋‹ค๊ณ  ๋Š๋‚๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋…ผ์˜ ์‚ฌํ•ญ์„ ์ œ๊ธฐํ•˜์ง€ ์•Š๊ณ ๋Š” ๊ฐ™์€ ์ž…์žฅ์„ ๋ฐ˜๋ณตํ•ด์„œ ๋ฐ˜๋ณต ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

FWIW, ๊ตฌ๋ฌธ์— ์ƒ๊ด€์—†์ด await ์ง€์›์„๋ฐ›์„ ์ˆ˜์žˆ์–ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค. ์ œ ์ž์‹ ์˜ ์„ ํ˜ธ๋„๋Š” ์žˆ์ง€๋งŒ ํ˜„์‹ค์ ์ธ ์ œ์•ˆ ์ค‘ ์–ด๋–ค ๊ฒƒ๋„ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋„ˆ๋ฌด ๋”์ฐํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@markrendle ๋‹น์‹ ์ด ๋ฌด์—‡์— ๋Œ€๋‹ตํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

C #์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

C #์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” "์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์™ธ๊ฐ€์—†๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ์ƒํ•ด ๋ณด๋ผ"๊ณ  ๋งํ–ˆ๋‹ค. Rust๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

propagate-error-chaining ์ธ์ˆ˜ (์˜ˆ : foo().await? ์™€ ๊ด€๋ จํ•˜์—ฌ ? ๋ฅผ ์ ‘๋‘์‚ฌ์˜ await ์—ฐ์‚ฐ์ž์— ์ถ”๊ฐ€ ํ•  ์ˆ˜์—†๋Š” ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๋ฏธ ๋‘ ๋ฒˆ ๋˜๋Š” ์„ธ ๋ฒˆ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ๊ทธ๊ฒƒ์€ ์ธ๊ณต์ ์ธ ๊ตฌ์กฐ์ด๋ฉฐ, ? ์ถ”๊ฐ€๋กœ ๋ญ”๊ฐ€๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. await? as suffix๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ถ”๊ฐ€ ์ง€์›์ด ํ•„์š”ํ•œ await? ์ผ ๋•Œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  postfix await๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์—ฌ์ „ํžˆ ์ค‘๊ด„ํ˜ธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค (์—ฌ๊ธฐ์„œ๋Š” ํ•ญ์ƒ ์‹ซ์–ดํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์€ ํ•ญ์ƒ ๊ทธ๊ฒƒ์„ ์ค‘์š”ํ•œ ๊ฒƒ์œผ๋กœ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค).

๊ทธ๋ƒฅ ๋‚ ์— ๋ฐœ์ƒํ•œ ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ : ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ match A์˜ Future<Result<...>> ? ๋‹ค์Œ ์ค‘ ์–ด๋Š ๊ฒƒ์ด ๋” ์ฝ๊ธฐ ์‰ฌ์šด๊ฐ€์š”?

// Real postfix
let userId = match response await {
  Ok(u) => u.id,
  _ => -1
};
// Real Postfix 2 - looks fine, except it's better to be
let userId = match response await {
  Ok(u) => somethingAsync(u),
  _ => ok(-1)
} await;
// Real Postfix 2
let userId = match response await {
  Ok(u) => somethingAsync(u) await,
  _ => -1
};

C #์˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋กœ์„œ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ ์ธ new , await ๋ฐ C ์Šคํƒ€์ผ ์บ์ŠคํŠธ๊ฐ€ ๋‚ด ์ง๊ฐ์„ ๊ฐ€์žฅ ๋งŽ์ด ๋„˜์–ด ๋œจ๋ ธ๋‹ค ๊ณ  ๋งํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” postfix ์—ฐ์‚ฐ์ž ์˜ต์…˜์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๊ตฌ๋ฌธ์€ ์˜์‚ฌ ๋งคํฌ๋กœ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ช…์‹œ ์ ์œผ๋กœ ํ“จ์ฒ˜๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฐ์‹ฌ์ด๋ผ๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

@orthoxerox ๋‹น์‹ ์€ ์•„์ฃผ ์ข‹์€ ์ง€์ ์„ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ฃผ๊ฐ„ ์ž‘์—…์—์„œ ๋‚˜๋Š” ์ฃผ๋กœ Java๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ช…์‹œ ์  ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ชจ๋“  ํด๋ž˜์Šค (๋นŒ๋” ํŒจํ„ด๊ณผ ์ข…์†์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ ๋†€๋ž๋„๋ก ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒ ํ•จ)๊ฐ€ ์—ฐ์‚ฐ์ž๋ฅผ ์ˆจ๊ธธ ์ˆ˜์žˆ๋Š” ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ์ˆ˜์ค€์œผ๋กœ ์ƒˆ ์—ฐ์‚ฐ์ž๋ฅผ ๊ฒฝ๋ฉธํ•ฉ๋‹ˆ๋‹ค. .

ํ—‰

@markrendle ๋‹น์‹ ์ด ๋ฌด์—‡์— ๋Œ€๋‹ตํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

C #์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

C #์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” "์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์™ธ๊ฐ€์—†๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ์ƒ์ƒํ•ด ๋ณด๋ผ"๊ณ  ๋งํ–ˆ๋‹ค. Rust๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹น์‹ ์ด ๋งํ•œ ๊ฒƒ์ด ์ „ํ˜€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ ์–ธ์–ด ์žฅ๋ฒฝ ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  @rolandsteiner๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ค‘์š”ํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ์˜ async / await๋ฅผ ์–ป๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ต์‹ฌ ํŒ€์˜ ๊ฒฐ์ •์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋ชจ๋“  postfix ํŒฌ๋“ค์€ ํ•ต์‹ฌ ํŒ€์˜ ๊ฒฐ์ •์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜› โค๏ธ โ˜ฎ๏ธ

@yasammez C #์œผ๋กœ ์˜ค์„ธ์š”. v8.0์—์„œ๋Š” ์œ ํ˜• ์ด๋ฆ„์—†์ด new () ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. :)

์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ๋˜์ ธ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

foo()~; // the pause operator
foo()^^; // the road bumps operator
foo()>>>; // the fast forward operator

์ ‘๋ฏธ์‚ฌ ์—ฐ์‚ฐ์ž๊ฐ€ ๊ฐˆ ๊ธธ์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ๋งํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์„ ํƒ์—์„œ ๊ฐ€์žฅ ์‹œ๋„๋Ÿฝ๊ณ  ์ด์ƒํ•˜๊ฒŒ ๋ณด์ด๋Š” @ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. @phaux ๋Œ“๊ธ€์˜ ~ ๋Š” ํ›จ์”ฌ ๋” ์šฐ์•„ํ•˜๊ณ  ๋œ "๋ฐ”์œ"๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋น ์ง„ ๊ฒƒ์ด ์—†๋‹ค๋ฉด ์•„์ง Rust์—์„œ ์•„๋ฌด๊ฒƒ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŠนํ—ˆ๊ถŒ์„ ์ฃผ์žฅํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ @phaux ๋ณด๋‹ค ๋จผ์ € ~ ์ œ์•ˆ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค .

๋‚˜๋Š” ์ด๊ฒƒ์ด ์—์ฝ”์™€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

Hi~~~~~
Where r u~~~~~

Hay~~~~~
I am in another mountain top~~~~~

~ ๋Š” ๋•Œ๋•Œ๋กœ ๋ฌธ์žฅ ๋’ค์— ํ›„ํ–‰์„ ๋‚˜ํƒ€ ๋‚ด๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์ด๊ฒƒ์€ await์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค!

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์šฐ์Šค๊ฝ ์Šค๋Ÿฌ์›€์ด ์ตœ๊ณ ์กฐ์— ๋„๋‹ฌํ–ˆ๋Š”์ง€ ๋˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ~ ์ผ๋ถ€ ํ‚ค๋ณด๋“œ, ํŠนํžˆ ์ž‘๊ณ  ์„ฌ์„ธํ•œ ๊ธฐ๊ณ„์‹ ํ‚ค๋ณด๋“œ์—์„œ๋Š” ๋Œ€๋‹ตํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let await userId = match response {
  Ok(u) => u.id,
  _ => -1
};
let await userId = match response {
  await Ok(u) => somethingAsync(u),
  _ => ok(-1)
};

~ ๊ฐ€ ๋ถˆํŽธํ•œ ํ‚ค๋ณด๋“œ ๋ ˆ์ด์•„์›ƒ์˜ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ... ์™€ ๊ฐ™์€ ์‚ผ์ค‘ ๋ฌธ์ž๋ฅผ ๋„์ž… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ํ•„์š”ํ•œ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ await(future) ๋˜๋Š” await{future} ํ•˜๋Š” ํŽธ์ด ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ณ  ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” Rust Future๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ Future์™€๋Š” ๋‹ค๋ฅด๋‹ค๋Š” ์ œ์•ˆ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ์ฆ‰์‹œ ์‹คํ–‰์ž์— ์ž‘์—…์„ ๋„ฃ์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฌด์—‡์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ๋ชจ๋‚˜๋“œ ํ˜ธ์ถœ ์ฒด์ธ์— ๋™ํ˜•์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์ ์—์„œ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋น„๊ตํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋Š” ๋ฐ ํ˜ผ๋ž€์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ๋ถˆํ–‰ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์•„๋‚ ๋กœ๊ทธ๋Š” ์‹ค์ œ๋กœ Haskell์˜ ๋ชจ๋‚˜๋“œ do ํ‘œ๊ธฐ๋ฒ• ๋˜๋Š” Scala์˜ for comprehension (๋‚ด๊ฐ€ ๋จธ๋ฆฌ ์œ„์—์„œ ์ต์ˆ™ํ•œ ์œ ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค)์ž…๋‹ˆ๋‹ค. ๊ฐ‘์ž๊ธฐ ๊ณ ์œ  ํ•œ ๊ตฌ๋ฌธ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ? ์—ฐ์‚ฐ์ž์˜ ์กด์žฌ๋กœ ์ธํ•ด ๋‹ค๋ฅธ์‹œ๊ธธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์žฅ๋ คํ•˜๊ธฐ๋„ํ•˜๊ณ  ๊ถŒ์žฅํ•˜์ง€๋„ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ? ์˜†์—์žˆ๋Š” ๋‹ค๋ฅธ์‹œ๊ธธ ๊ธฐ๋ฐ˜ ์—ฐ์‚ฐ์ž๋Š” future@? ์™€ ๊ฐ™์ด ์‹œ๋„๋Ÿฝ๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์ด์ง€๋งŒ ํ›„์œ„์‹œ๊ธธ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •๋œ ์„ ๋ก€๋Š” ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์šฐ์Šค๊ฝ์Šค๋Ÿฝ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚˜๋Š” postfix sigil ์—ฐ์‚ฐ์ž์˜ ์žฅ์ ์„ ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ๋‹จ์ ์€ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์„ ํ˜ธํ–ˆ๋˜ ์ธ์žฅ์ด never ์œ ํ˜•์— ์˜ํ•ด ์ทจํ•ด์ง„๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. future!? ๋ฅผ ์“ธ ๋•Œ๋งˆ๋‹ค ์šฐ์Šค๊ฝ์Šค๋Ÿฝ๊ณ ๋ณด๊ธฐ์— ๊ฐ€์žฅ ์‹œ๊ฐ์  ์ธ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ! ์„ ํ˜ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ $ ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์‹œ๊ฐ์ ์œผ๋กœ ์‹๋ณ„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— future$? ์ž…๋‹ˆ๋‹ค. ~ ๋ณด๋ฉด ~ ๊ฐ€ ํž™ ํ• ๋‹น์„์œ„ํ•œ ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž์˜€๋˜ Rust์˜ ์ดˆ๊ธฐ ์‹œ์ ˆ์ด ์ƒ๊ฐ๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋ชจ๋‘ ๋งค์šฐ ๊ฐœ์ธ์ ์ด๋ฏ€๋กœ ์ตœ์ข… ๊ฒฐ์ •๊ถŒ์ž๋ฅผ ๋ถ€๋Ÿฌ์›Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๋“ค์ด๋ผ๋ฉด ์•„๋งˆ๋„ ํ•„์š”ํ•œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€์žˆ๋Š” ์ ‘๋‘์‚ฌ ์—ฐ์‚ฐ์ž๋ฅผ ๊ณต๊ฒฉ์ ์œผ๋กœ ์„ ํƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” Rust Future๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ Future์™€๋Š” ๋‹ค๋ฅด๋‹ค๋Š” ์ œ์•ˆ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ ์ฆ‰์‹œ ์‹คํ–‰์ž์— ์ž‘์—…์„ ๋„ฃ์ง€ ์•Š๊ณ  ๋Œ€์‹  ์ปจํ…์ŠคํŠธ๋ฅผ ๋ฌด์—‡์œผ๋กœ ๋ฐ”๊พธ๋Š” ์ œ์–ด ํ๋ฆ„ ๊ตฌ์กฐ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ๋ชจ๋‚˜๋“œ ํ˜ธ์ถœ ์ฒด์ธ์— ๋™ํ˜•์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ๊ธ‰ ํ•œ ๋™์ž‘์€ await ์˜ ์†์„ฑ์ด ์•„๋‹ˆ๋ผ ์ฃผ๋ณ€ async ํ•จ์ˆ˜ ๋˜๋Š” ๋ฒ”์œ„์˜ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์ด์ „ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๊ฒƒ์€ await ๊ฐ€ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ด๋Š” @ ๊ธฐํ˜ธ์˜ ๋ฌธ์ œ๋Š” ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด์ „์—๋Š” ์˜ˆ์ƒ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๊ธ€๊ผด์—์„œ ์ œ๊ณต๋˜๋Š” ๋ชจ์–‘์ด ๋„ˆ๋ฌด ๋ถˆํŽธํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ธ๊ธฐ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธ€๊ผด (๋˜๋Š” ์ตœ์†Œํ•œ Mozilla์˜ Fira Code )์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ๊ธ€๋ฆฌํ”„์™€ ์ผ๋ถ€ ํ•ฉ์ž๋ฅผ ์ œ๊ณตํ•˜๋ฉด ์ƒํ™ฉ์ด ์•ฝ๊ฐ„ ๊ฐœ์„  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฝ์šฐ์—๋Š” @ ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์œ ์ง€ ๊ด€๋ฆฌ ํ•  ๋•Œ ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ์ด์ƒํ•ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ์ฝ”๋“œ๋Š” @ ๊ธฐํ˜ธ- ๏ผ  ๊ณผ ๋‹ค๋ฅธ ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

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

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

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

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

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

    Ok(user)
}

์ผ๋ฐ˜ ANSI @ ์™€ ๋น„๊ต๋ฅผ ์œ„ํ•ด ํ™•์žฅ

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

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

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

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

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

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

    Ok(user)
}

๋ฟก๋ฟก

์ฒ˜์Œ์—๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ํ•„์š”ํ•œ ์ ‘๋‘์‚ฌ ๊ตฌ๋ฌธ์„ await(future) ๋˜๋Š” await{future} ํ•˜๋Š” ํŽธ์ด ๋งค์šฐ ๋ช…ํ™•ํ•˜๊ณ  ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋ถ„๋ช…ํ•œ if { cond } , while { cond } ๋ฐ match { expr } ...

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” Rust Future๊ฐ€ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ Future์™€ ๊ฐ™์ง€ ์•Š๋‹ค๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ œ์•ˆ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๋‹ค๋ฅธ ๋Œ€๋ถ€๋ถ„์˜ ์„ ๋ฌผ์ฒ˜๋Ÿผ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. "์Šคํฐ ๋  ๋•Œ ์ฒ˜์Œ ๋Œ€๊ธฐ ํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰"๊ณผ "ํด๋ง ๋  ๋•Œ ์ฒ˜์Œ ๋Œ€๊ธฐ ํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰"์˜ ์ฐจ์ด๋Š” ๊ทธ๋‹ค์ง€ ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‘˜ ๋‹ค ํ•จ๊ป˜ ์ผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ "์ด ์ฐจ์ด๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ"๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ฝ”๋„ˆ ์ผ€์ด์Šค ๋งŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฏธ๋ž˜๊ฐ€ ์ƒ์„ฑ ๋  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ฒซ ๋ฒˆ์งธ ํˆฌํ‘œ์—์„œ ์ƒ์„ฑ ๋  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ๋Š” ์™„์ „ํžˆ ๋™์ผํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ—‰

"์Šคํฐ ๋  ๋•Œ ์ฒ˜์Œ ๋Œ€๊ธฐ ํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰"๊ณผ "ํด๋ง ๋  ๋•Œ ์ฒ˜์Œ ๋Œ€๊ธฐ ํ•  ๋•Œ๊นŒ์ง€ ์‹คํ–‰"์˜ ์ฐจ์ด๋Š” ๊ทธ๋‹ค์ง€ ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐํ•˜๊ณ ์žˆ๋Š” ์ฐจ์ด์ ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ฒŒ์œผ๋ฅธ ๋Œ€ ์—ด๋ง์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ์€ await ๊ฐ€ ์ด๋ฏธ ์‹คํ–‰๊ธฐ์— ์ถ”๊ฐ€ ๋œ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์‹คํ–‰๊ธฐ์—์„œ ๋Œ€๊ธฐ์ค‘์ธ Promise (JS) / Task (C #)์— ํ•ฉ๋ฅ˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์ถ•์‹œ (๋”ฐ๋ผ์„œ ์ด๋ฏธ "๋ฐฑ๊ทธ๋ผ์šด๋“œ"์—์„œ ์‹คํ–‰ ์ค‘์ž„) Rust์—์„œ Future s๋Š” await! ๊ตฌ๋™ ๋  ๋•Œ๊นŒ์ง€ ๋น„ํ™œ์„ฑ ์ƒํƒœ ๋จธ์‹ ์ž…๋‹ˆ๋‹ค.

Promise / Task ๋Š” ์‹คํ–‰์ค‘์ธ ๋น„๋™๊ธฐ ์ž‘์—…์— ๋Œ€ํ•œ ํ•ธ๋“ค์ž…๋‹ˆ๋‹ค. Future ์€ ์ง€์—ฐ๋œ ๋น„๋™๊ธฐ ๊ณ„์‚ฐ์ž…๋‹ˆ๋‹ค. Rust์˜ ์ฃผ๋ชฉํ• ๋งŒํ•œ ์ด๋ฆ„์„ ํฌํ•จํ•œ ์‚ฌ๋žŒ๋“ค์€ ์ด์ „์—์ด ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ € ๊ณ , 500 ๊ฐœ ์ด์ƒ์˜ ์ฃผ์„ ์ค‘๊ฐ„์— ์˜ˆ์ œ๊ฐ€ ๋งํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ, ๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์˜๋ฏธ์˜ ๋ถˆ์ผ์น˜๊ฐ€ await ์˜ ์นœ์ˆ™ ํ•จ์„ ์ƒ์‡„ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ํฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Future ๋Š” Promise / Task ๊ณผ ๋™์ผํ•œ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜์ง€๋งŒ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.


์ผํ™”๋กœ, JavaScript์—์„œ async / await ๋ฅผ ์ฒ˜์Œ ๋ฐฐ์› ์„ ๋•Œ async ๋Š” await ์ดˆ๊ฐ•๋ ฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ์ œ๊ฐ€ ์ž‘์„ฑํ•œ "๋‹จ์ง€"์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฐ์šฐ๋Š” ๋ฐฉ๋ฒ•์€ a = fa(); b = fb(); /* later */ await [a, b]; (๋˜๋Š” ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ด๋“  JS๋ฅผ ์ž‘์„ฑํ•ด์•ผํ–ˆ๋˜ ๋‚˜์ด๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค). ๋‚ด ์ž…์žฅ์€ async ๋Œ€ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๊ฒฌํ•ด๊ฐ€ ๋‚˜์™€ ์ผ์น˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Rust์˜ ์˜๋ฏธ๋Š” async ( await ์Šˆํผ ํŒŒ์›Œ๋ฅผ ์ค˜)์—์„œ ๋ถˆ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค Future ๊ฑด์„ค ๋ฐ await! .


์ด ์‹œ์ ์—์„œ ์ €๋Š” Rust์˜ async / Future / await ์˜๋ฏธ๋ก ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์ง„ํ–‰๋˜์—ˆ์œผ๋ฉฐ ์ƒˆ๋กœ์šด ์ •๋ณด๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ž…์žฅ ๋ฐ / ๋˜๋Š” ํ†ต์ฐฐ๋ ฅ์„ ๊ฐ€์ ธ ์˜ค์ง€ ์•Š๋Š” ํ•œ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜๋ฅผ ๋– ๋‚˜๋ฉด ์Šค๋ ˆ๋“œ์— ๊ฐ€์žฅ ์ ํ•ฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋‚ด๋ถ€ ๋ฐ / ๋˜๋Š” Discord๋กœ ๊ฐ€์ ธ ๊ฐ€์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค.)

@ CAD97 ๋„ค, ๋‹น์‹ ์˜ ์ž…์žฅ์„ ๋ณด์•˜์ง€๋งŒ ๊ทธ ํŒ๊ฒฐ์ด ๊ทธ๋ ‡๊ฒŒ ํฌ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋‚  ์žก์•˜์–ด. ๋”ฐ๋ผ์„œ ํ† ๋ก ์˜ ํ๋ฆ„์„ ์œ ์ง€ํ•˜์‹ญ์‹œ์˜ค.

@ CAD97

Rust์˜ ์ฃผ๋ชฉํ• ๋งŒํ•œ ์ด๋ฆ„์„ ํฌํ•จํ•œ ์‚ฌ๋žŒ๋“ค์€ ์ด์ „์—์ด ์‹ค์ˆ˜๋ฅผ ์ €์งˆ๋ € ๊ณ , 500 ๊ฐœ ์ด์ƒ์˜ ์ฃผ์„ ์ค‘๊ฐ„์— ์˜ˆ์ œ๊ฐ€ ๋งํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Rust์— ์นœ์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์กฐ์ฐจ๋„ ๊ทธ๋Ÿฐ ์‹ค์ˆ˜๋ฅผํ•œ๋‹ค๋ฉด, ์ •๋ง ์‹ค์ˆ˜์ž…๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” Rust All Hands์—์„œ async-await์— ๋Œ€ํ•ด ๋งŽ์€ ํ† ๋ก ์„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋…ผ์˜ ๊ณผ์ •์—์„œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ๋ช…ํ™• ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, await ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ lang ํŒ€์—๋Š” (์•„์ง) ํ•ฉ์˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค . ๊ทธ๋“ค ๋ชจ๋‘์— ์ฐฌ์„ฑํ•˜๋Š” ๋งŽ์€ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ด ๋ถ„๋ช…ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋Œ€์•ˆ์„ ํƒ๊ตฌํ•˜๋Š” ๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ  ๊ฝค ๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ์•ž๋’ค๋กœ๋ฅผ ์ œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์˜ ์ฆ‰๊ฐ์ ์ธ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํ•ด๋‹น ๋ฉ”๋ชจ (์ด ์Šค๋ ˆ๋“œ์˜ ๋‹ค๋ฅธ ์ฃผ์„๊ณผ ํ•จ๊ป˜)๋ฅผ ๊ฐ ๋ณ€ํ˜•์— ๋Œ€ํ•œ ์‚ฌ๋ก€๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ผ์ข…์˜ ์š”์•ฝ ์ฃผ์„์œผ๋กœ ๋ณ€ํ™˜ ํ•œ ๋‹ค์Œ ๊ฑฐ๊ธฐ์—์„œ ๊ณ„์†ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €๋Š” @withoutboats ์™€ @cramertj ์™€ ํ•จ๊ป˜ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ฌธ ์งˆ๋ฌธ์—์„œ ๋’ค๋กœ ๋ฌผ๋Ÿฌ๋‚˜์„œ ์šฐ๋ฆฌ๊ฐ€ํ•˜๋ ค๋Š” ๋˜ ๋‹ค๋ฅธ ์ผ์€ ๊ตฌํ˜„ ์ƒํƒœ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ๋ถ„๋ฅ˜์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ๋งŽ์€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๊ตฌํ˜„์—๋Š” ํ˜„์žฌ ์›จ์ด ์ปค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์Šค๋ ˆ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ TLS๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค). ์ด๊ฒƒ๋“ค์€ ์•ˆ์ •ํ™”๋ฅผ ๋ฐฉํ•ด ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ถ๊ทน์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ์ด๋ฉฐ ์ผ๋ถ€๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ํŒ€์˜ ๊ณต๋™ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋˜ ๋‹ค๋ฅธ ๋‹ค์Œ ๋‹จ๊ณ„๋Š”์ด ์‹ฌ์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฃผ์—์ด ๋ถ„๋ฅ˜๋ฅผ ์ˆ˜ํ–‰ ํ•  ์˜ˆ์ •์ด๋ฉฐ ์—…๋ฐ์ดํŠธ๊ฐ€์žˆ์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๊ทธ ๋™์•ˆ ์œ„์˜ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑ ํ•  ๊ธฐํšŒ๊ฐ€์žˆ์„ ๋•Œ๊นŒ์ง€์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๊ธ€ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋””์ž์ธ ๊ณต๊ฐ„์„ ์ข€ ๋” ๊นŠ์ด ํƒ๊ตฌํ•˜๋ ค๋Š” ๋ชฉ์ ์„ ์ด๋ฏธ ๋‹ฌ์„ฑํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ,์ด ๋‹จ๊ณ„์—์„œ๋Š” ์ถ”๊ฐ€ ์„ค๋ช…์ด ํŠน๋ณ„ํžˆ ๋„์›€์ด๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ ํ•œ ๋ณด๊ณ ์„œ๊ฐ€ ์ค€๋น„๋˜๋ฉด ์ตœ์ข… ๊ฒฐ์ •์— ๋„๋‹ฌํ•˜๊ธฐ์œ„ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„๋„ ์„ค๋ช… ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์„ ์กฐ๊ธˆ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ธด ํ† ๋ก  ์Šค๋ ˆ๋“œ๋ฅผ ๋„˜์–ด์„œ ๋””์ž์ธ ๊ณต๊ฐ„์„ ํƒ์ƒ‰ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€์ด ์ฃผ์„์—์„œ ๋‹ค๋ฃฐ ์ˆ˜์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ํฐ ์ฃผ์ œ์ด๋ฏ€๋กœ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ,ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์œ„ํ•œ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ ์ž ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ตฌ๋ฌธ ๋…ผ์Ÿ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์ง€๊ธˆ์€ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.)

Async-await ์ƒํƒœ ๋ณด๊ณ ์„œ :

http://smallcultfollowing.com/babysteps/blog/2019/03/01/async-await-status-report/

์ด์ „ ์˜๊ฒฌ๊ณผ ๋น„๊ตํ•˜์—ฌ ์—ฌ๊ธฐ์—๋Š” ๋ถ„๋ฅ˜ ๊ฒฐ๊ณผ์™€ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (์•„์ง ์ „์ฒด ๊ตฌ๋ฌธ ์ž‘์„ฑ์€ ์•„๋‹˜).

์ด ๋ฌธ์ œ๋ฅผ ์ ์–ด๋„ ๋‹น๋ถ„๊ฐ„์€ async-await ์•ˆ์ •ํ™”์— ๋Œ€ํ•œ ์ฐจ๋‹จ ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ฝค ์˜ค๋ž˜ ์ „์— Niko๋Š” await ์—ฐ์‚ฐ์ž์˜ ์ตœ์ข… ๊ตฌ๋ฌธ์— ๋Œ€ํ•ด ์–ธ์–ด ํŒ€๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ† ๋ก  ์š”์•ฝ์„ ์ž‘์„ฑํ•˜๊ฒ ๋‹ค๊ณ  ์•ฝ์†ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋žœ ๊ธฐ๋‹ค๋ฆผ์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ† ๋ก  ์ƒํƒœ์— ๋Œ€ํ•œ ๊ธ€์€ ์•„๋ž˜ ๋งํฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ „์— ํ† ๋ก ์ด ํ˜„์žฌ ์ง„ํ–‰์ค‘์ธ ์œ„์น˜์™€ ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ์ง„ํ–‰๋  ์œ„์น˜์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋„ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

async-await๊ฐ€ ํ˜„์žฌ ์–ด๋””์— ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์š”์•ฝ

๋จผ์ €, 2019 ๋…„ 7 ์›” 4 ์ผ์— ๋ถ„๊ธฐ๋˜๋Š” 1.37 ๋ฆด๋ฆฌ์Šค์—์„œ async-await๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค . await! ๋งคํฌ๋กœ๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ์ „์— ๊ตฌ๋ฌธ ์งˆ๋ฌธ์„ ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ์•ˆ์ •ํ™”๋Š” ๋„๋กœ์˜ ๋์ด ์•„๋‹ˆ๋ผ ์‹œ์ž‘์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ ์ž‘์—… (์˜ˆ : ํŠน์„ฑ์˜ ๋น„๋™๊ธฐ fn)๊ณผ ๋‹จ์ˆœํ™” ์ž‘์—… (์ง€์†์ ์ธ ์ตœ์ ํ™”, ๋ฒ„๊ทธ ์ˆ˜์ • ๋“ฑ)์ด ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ async / await ์•ˆ์ •ํ™”๋Š” ์ค‘์š”ํ•œ ์ด์ •ํ‘œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๊ตฌ๋ฌธ์— ๊ด€ํ•œ ํ•œ ํ•ด๊ฒฐ ๊ณ„ํš์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ง€๊ธˆ๊นŒ์ง€ ๊ตฌ๋ฌธ ๋…ผ์Ÿ์— ๋Œ€ํ•œ
  • ํŠนํžˆ for ๋ฃจํ”„ (์˜ˆ : JavaScript์˜ for await ๋ฃจํ”„)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŠธ๋ฆผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ๋ช…๋ฐฑํ•œ ํ–ฅํ›„ ํ™•์žฅ๊ณผ ํ˜ธํ™˜๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค ( ์—ฌ๊ธฐ์— ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ ๊ณผ ํ–ฅํ›„ ์ถ”๊ฐ€ ์˜ˆ์ •).
  • 5 ์›” 2 ์ผ ๋‹ค๊ฐ€์˜ค๋Š” lang-team ํšŒ์˜์—์„œ ์šฐ๋ฆฌ๋Š” for ๋ฃจํ”„์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๊ณ  1.37์—์„œ async / await๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„ ๋‚ด์— ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ตœ์ข… ๊ฒฐ์ •์— ๋„๋‹ฌํ•˜๊ธฐ์œ„ํ•œ ๊ณ„ํš์„ ์ˆ˜๋ฆฝ ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ํšŒ์˜ ํ›„์ด ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ์— ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒŒ์‹œ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธ€์“ฐ๊ธฐ

์ด ๋ฌธ์„œ๋Š” ์—ฌ๊ธฐ์—์„œ ๋ณผ ์ˆ˜์žˆ๋Š” ๋ณด๊ด€ ์šฉ ์ข…์ด ๋ฌธ์„œ ์ž…๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ, ์ƒ๋‹นํžˆ ๊ธธ๊ณ  ์•ž๋’ค๋กœ ๋งŽ์€ ๋…ผ๊ฑฐ๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋ณด๋‚ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ (์ด๋ฏธ 500 ๊ฐœ ์ด์ƒ์˜ ์˜๊ฒฌ์ด ์žˆ์Œ)๋ฅผ ๋‹ค์‹œ ์—ฌ๋Š” ๋Œ€์‹  ํ•ด๋‹น ๋ชฉ์ ์„ ์œ„ํ•ด ๋‚ด๋ถ€ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค .

์•ž์„œ ๋งํ–ˆ๋“ฏ์ด ์šฐ๋ฆฌ๋Š” ๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์— ์ตœ์ข… ๊ฒฐ์ •์— ๋„๋‹ฌ ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ํ† ๋ก ์ด ๋Œ€์ฒด๋กœ ์•ˆ์ •๋œ ์ƒํƒœ์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช‡ ์ฃผ๊ฐ€์ด ๊ตฌ๋ฌธ ํ† ๋ก ์˜ "๋งˆ์ง€๋ง‰ ์ฃผ์„ ๊ธฐ๊ฐ„"์ด ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ํšŒ์˜๊ฐ€ ๋๋‚œ ํ›„์ด ๊ฒฐ์ •์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์งˆ ์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ผ์ •์„ ๊ณต์œ  ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Async / await ๊ตฌ๋ฌธ์€ ์•„๋งˆ๋„ Rust๊ฐ€ 1.0 ์ดํ›„๋กœ ์–ป์€ ๊ฐ€์žฅ ๊ธฐ๋Œ€๋˜๋Š” ๊ธฐ๋Šฅ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ await ๊ตฌ๋ฌธ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ํ”ผ๋“œ๋ฐฑ์„๋ฐ›์€ ๊ฒฐ์ • ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ์ด ํ† ๋ก ์— ์ฐธ์—ฌํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ•ํ•˜๊ฒŒ ๋‹ค๋ฅธ ๊ฐ์ •์„ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”ผ๋“œ๋ฐฑ์ด ๋“ฃ๊ณ  ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์‹ ์ค‘ํ•˜๊ณ  ์‹ ์ค‘ํ•œ ์‹ฌ์˜๋ฅผ ๊ฑฐ์ณ ์ตœ์ข… ๊ฒฐ์ •์— ๋„๋‹ฌ ํ•  ๊ฒƒ์ž„์„ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ํ™•์‹ ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰