์ด ์ค๋ ๋์ ๋๊ธ์ ๋ฌ๊ธฐ ์ ์ 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!)
๋ค๋ฅธ ์ธ์ด๊ฐ await ๊ตฌ๋ฌธ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์ฑํ๋ ๊ฒ์ด ์ ์ฉ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
val result = task.await()
var result = await task;
let! result = task()
val result = Await.result(task, timeout)
result = await task
let result = await task;
auto result = co_await task;
$result = await task;
var result = await task;
์ด ๋ชจ๋ ๊ฒ์ ๊ฐ์ง๊ณ 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)
๋์ด๋ฅผ ๋ง์กฑ์ํค์ง ๋ชปํ์ง๋ง ๊ฒฐ๊ตญ ํจ์๋ ํญ์ ๋ถ๊ธฐ์ ์์ ์ฌ๊ฐ ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ข์ํ์ง ์๋ ์ด์ :
?
๋ ์ธ์๋ก ๋ณด์ด์ง๋ง ํํ์์๋ ์ ์ฉ๋์ง ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ์ ์ฉ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํ ํฐ์ด ๋ค์ ์ ํํ ๊ฐ๋
์ธ ํจ์ ํธ์ถ ์์ฒด์ด๋ฏ๋ก ๊ต์ก์ ํตํด ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๋ํ ๊ตฌ๋ฌธ์ด ๋ชจํธํ์ง ์๋ค๋ ๊ฒ์ ๊ธ์ ์ ์ผ๋ก ์๋ฏธํฉ๋๋ค.?
๋ ๋ง์ (๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ) ํผํฉ์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ํนํ ํ๋์ ๋ฏธ๋๊ฐ ๋ค๋ฅธ ๋ฏธ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ : construct_future()(?)?(?)?
. ๊ทธ๋ฌ๋ fn
๊ฐ์ฒด์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๋ ๋์ผํ ์ธ์๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ํํ์์ด ํ์ฉ๋ฉ๋๋ค. foobar()?()?()?
. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๋๋ ์ด๊ฒ์ด ์ฌ์ฉ๋๊ฑฐ๋ ๋ถ๋ง์ ํ์ ๊ฒ์ ๋ณธ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฌํ ๊ฒฝ์ฐ์ ๋ณ๋์ ์ง์ ๋ก ๋๋๋ ๊ฒ์ด ๊ฑฐ์ ํ์ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๋ฌธ์ ๋ construct_future()(await)?(await)?
์๋ ์กด์ฌํ์ง ์์ต๋๋ค-future(?)
๋ ๊ฐ๊ฒฐํ๊ณ ์ฌ์ ํ ๋ค์ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์ด์ ๋ ์ฝ ๋ฃจํด์ ๊ตฌํ ์ธ๋ถ ์ฌํญ (์ผ์์ ์ผ๋ก ์ด๋ ฅ์์ ๋ฐํ ๋ฐ ๋ฐ์ก)์ ๊ธฐ๋ฐ์๋๊ณ ์์ผ๋ฏ๋ก ์ถ์ํ์ ์ ํฉํ์ง ์์ ์ ์์ต๋๋ค. future(await)
๋ await
๋ฅผ ํค์๋๋ก ๋ด์ฌํ ํ ํ์๋ ์ค๋ช
ํ ์์๋ ๋์์ด ๋ ์ ์์ง๋ง ์ธ์ ์์น๋ ์ ๊ฒ ์ผํค๊ธฐ๊ฐ ์ฝ๊ฐ ์ด๋ ต์ต๋๋ค. ๊ด์ฐฎ์ ์ ์์ผ๋ฉฐ ์ฝ ๋ฃจํด์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ ํ ๋ ํ์คํ ๋ ์ฝ๊ธฐ ์ฝ์ต๋๋ค.
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::
ํน์ฑ์ผ๋ก ๋ฌธ์ํ ๋ ์ ์์ต๋๊น? |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")์ #
(๋ฉํฐ ์ค๋ ๋ฉ / ๋์์ฑ์ ๋ํ๋)๋ฅผ ์ข์ํ๋ค๋ ๊ฒ์
๋๋ค.
๋๋ @
์ ๋ฏธ์ฌ๋ ์ข์ํฉ๋๋ค! ์คํ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฐ์ ์ด์๋ ๊ฒ ๊ฐ์ง๋ง ์ค์ ๋ก ๋์ ์ ํ์ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
?
๋ฐ @
์ (๋) ๋งค์ฐ ์ ์ฌํ๋ฏ๋ก @
์ (๋ฅผ) ๋ฐฐ์ฐ๊ณ ?
@
์ (๋ฅผ) ๋ฐฐ์ฐ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ๋์ฝํด์๋ ์๋ฉ๋๋ค.๋๋ 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;
macro_rules! await {
($e:expr) => {{$e await}}
}
client.get("https://my_api").send() await.unwrap().json() await.unwrap()
์์ง ๋ณด์ง ๋ชปํ ๋ค๋ฅธ ํ๋ณด๋ฅผ ์ ์ํ๊ธฐ ์ํด (์๋ง๋ ํ์ฑ ํ ์ ์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค.) ์ฌ๋ฏธ์๋ ์ด์ค ์ '..'์ ๋ฏธ์ฌ ์ฐ์ฐ์๋ ์ด๋ป์ต๋๊น? ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ค๋ ๊ฒ์ ์๊ธฐ์์ผ์ค๋๋ค (๊ฒฐ๊ณผ!) ...
client.get("https://my_api").send()..?.json()..?
๋๋
@
์ ๋ฏธ์ฌ๋ ์ข์ํฉ๋๋ค! ์คํ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฐ์ ์ด์๋ ๊ฒ ๊ฐ์ง๋ง ์ค์ ๋ก ๋์ ์ ํ์ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
- _ @ for await_๋ ๋ฉ์ง๊ณ ๊ธฐ์ตํ๊ธฐ ์ฌ์ด ๋๋ชจ๋์ ๋๋ค.
?
๋ฐ@
์ (๋) ๋งค์ฐ ์ ์ฌํ๋ฏ๋ก@
์ (๋ฅผ) ๋ฐฐ์ฐ๊ณ?
@
์ (๋ฅผ) ๋ฐฐ์ฐ๋ ๊ฒ์ด ๊ทธ๋ ๊ฒ ๋์ฝํด์๋ ์๋ฉ๋๋ค.- ํํ์์ ์ดํดํ๊ธฐ ์ํด ๋ซ๋ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ์ฐพ๊ธฐ ์ํด ์์ผ๋ก ์ค์บ ํ ํ์์์ด ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ผ๋ จ์ ํํ์์ ์ค์บํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค.
๋๋ ๊ธฐ๋ค๋ฆด ๋ @๋ฅผ ์ฌ์ฉํ๋ ํฌ์ด ์๋๋๋ค. ์ค๋ฅธ์ชฝ ์์ง ์๊ฐ๋ฝ์ผ๋ก alt-gr์ ๋๋ฅธ ๋ค์ ์ซ์ ํ์์ ํค 2๋ฅผ ๋๋ฌ์ผํ๊ธฐ ๋๋ฌธ์ fin / swe ๋ ์ด์์ ํค๋ณด๋์ ์ ๋ ฅํ๋ ๊ฒ์ด ์ด์ํฉ๋๋ค. ๋ํ @๋ (at) ์ ์ ๋ฆฝ ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ์ ๊ทธ ์๋ฏธ๋ฅผ ํผ๋ํด์ผํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ ๋ ๋จ์ํ await
๋ฅผ ์
๋ ฅํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋น ๋ฆ
๋๋ค. ํค๋ณด๋ ๊ณก์๊ฐ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ ๋น ๋ฆ
๋๋ค.
์ฌ๊ธฐ ๋ด ์์ ์ ๋งค์ฐ ์ฃผ๊ด์ ์ธ ํ๊ฐ๊ฐ ์์ต๋๋ค. ๋ํ future@await
์ถ๊ฐํ์ต๋๋ค.
| ๊ตฌ๋ฌธ | ๋
ธํธ |
| --- | --- |
| await { f }
| ๊ฐํ:
for
, loop
, async
๋ฑawait { await { foo() }?.bar() }?
)await f
| ๊ฐํ:await
๊ตฌ๋ฌธ๊ณผ ์ ์ฌํฉ๋๋ค.?
( await fut?
๋ await? fut
)์ ์ ์๋ํฉ๋๋ค.await (await foo()?).bar()?
๋ await? (await? foo()).bar()
)fut.await
fut.await()
fut.await!()
| ๊ฐํ:await!()
๊ฐ ๊ฐ์ฅ ๋ง๋ฒ์ฒ๋ผ ๋๊ปด ์ง์ง ์๋๋ค๋ fut(await)
| ๊ฐํ:await
๋ณ์๊ฐ ์ด๋๊ฐ์ ์ ์๋์ด ์๊ณ Future๊ฐ ํจ์์ฒ๋ผ ํธ์ถ ๋ ์ ์๋ค๊ณ ์๊ฐํ๋๋ก ์์
๋๋ค.f await
| ๊ฐํ:client.get("https://my_api").send() await.unwrap().json() await.unwrap()
๋ฅผ client.get("https://my_api").send()
, await.unwrap().json()
๋ฐ await.unwrap()
๊ทธ๋ฃนํํฉ๋๋ค (๋จผ์
๋ณ๋ก ๊ทธ๋ฃนํ ํ ๋ค์ .
) ๋ง์ง ์์ต๋๋คf@
| ๊ฐํ:@
์๋นํ๋ฉฐ ๋ค๋ฅธ ๊ฒ์ ๋ ์ ํฉ ํ ์ ์์ต๋๋ค.@
์ฌ์ฉf@await
| ๊ฐํ:await
์ ํค์๋๊ฐ ๋ ํ์๊ฐ ์์ต๋๋ค.@operator
ํ์์ผ๋ก ์ ์ ๋ฏธ์ฌ ์ฐ์ฐ์๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ?
๋ @try
๋ก ์ํ ๋ ์ ์์ต๋๋ค.client.get("https://my_api").send()@await.unwrap().json()@await.unwrap()
๋ฅผ ์ฌ๋ฐ๋ฅธ ๊ทธ๋ฃน์ผ๋ก ๊ทธ๋ฃนํํฉ๋๋ค (๋จผ์ .
๋ณ๋ก ๊ทธ๋ฃนํ ํ ๋ค์ @
)@
์ฌ์ฉ.
๋ฐ ๊ธฐํ await
์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ฌ์ด๊ฐ| ๊ตฌ๋ฌธ | 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๋ ์ด๋ฆ๊ณผ ๊ฐ์ ์ฌ์ด์ ์ ํ (๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ฐ์ธํ์์ด)์ ์ธ๋ผ์ธํ๋ค๋ ์ ์ ์ผ๋์ ๋์ญ์์ค (์ด๋ ๋ณ๊ฒฝ ๋ ์ ์์ผ๋ฉฐ ์ธ์ด์ ๋ฏธ๋์ ์ง์ ์ฐ๊ฒฐ๋์ง๋ ์์).
๋ค์๊ณผ ๊ฐ์ด ์์ํด๋ณด์ญ์์ค.
๊ทธ๋ ๋ค๊ณ ๋ด ์๊ฒฌ์ด ์ ๋์ฌ์ ๋ํด 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 ( *
) ๋ฐ ๋ถ์ ( !
)๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
์ด ๊ตฌ๋ฌธ์ ๋ช ๊ฐ์ง์ฃผ์ ์ฌํญ :
$
๊ธฐํธ๊ฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ๊น์?.
๊ตฌ๋ถ ๋ ์์๋ง ์ ์ฉ๋ฉ๋๋ค ( await_chain
fn์์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค). ํผ๋ ์ค๋ฝ์ต๋๊น?์ผํธ๋ฆด
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
๊ฐ์ด ๊ณต์กดํ๊ธฐ ์ํด ํ๋์ ๊ฐ์ ์ก์ธ์ค (๋๋ ๋ค๋ฅธ ์ ๋ฏธ์ฌ)๋ฅผ ์ ํธํฉ๋๋ค.
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)
์์ ํ๋ ์ ๊ฐ ์์ํ ์์๋ ์ต์
์ ์ต์
์ ๋ํ ๊ฒ์
๋๋ค.
await
์์ฝ์ ํด์ ํด์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ด๋ ํฅํ ์ธ์ด ๋์์ธ์ด ๋ ์ด๋ ค์ ์ง์ ์๋ฏธํฉ๋๋ค.try!(result)
์ ๋์ผํ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค (Rust 2018์์ r#try!(result)
๋ฅผ ์์ฑํด์ผ ํจ).await!(future)
๊ฐ ์๋ชป๋ ๊ตฌ๋ฌธ์ด๋ผ๋ ๊ฒ์ ์๋ค๋ฉด ๊ฒฐ๊ตญ ํ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ฉฐ ์ด๋ ์๋์ ์ผ๋ก ๊ธฐ์ ์ ๋ถ์ฑ๋ฅผ ์ฐฝ์ถํ๋ ๊ฒ์
๋๋ค.try!(..)
๋ Rust์ ์ ์๋์ด ์์ง๋ง await!(future)
๋ ์ปดํ์ผ๋ฌ ๋ง๋ฒ์ด ๋ ์์๊ณ ๋์ ์ ๊ทธ๋ ๊ฒ ๋ ๊ฒ์
๋๋ค.try!(..)
์ค๋จ์ ์ฝ์ง ์์๊ณ ์ฌํ์ ์ผ๋ก ํฐ ํ๊ฒฉ์ ์
์์ต๋๋ค. ๊ทธ ์๋ จ์ ๋ค์ ๊ฒช๋ ๊ฒ์ ๋งค๋ ฅ์ ์ด์ง ์์ต๋๋ค.await!(future)
์ ์๋ ๋ฝ์ต๋๋ค . ๋ฌ๋ฆฌ await future
๋น์ ์ ์ธ ํ์๊ฐ !( ... )
.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
๋ฏธ๋์์ธ๊ฐ ์์ง๋ง ์์ธ์ ๋๋ค.
์ ์ํด ๋ ธ๋ ฅ.๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์์ธ๋? ?
@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?
์คํ๊ณผ ํจ๊ป)๊ฐ ๊ฐ์ฅ ๋ฐ๋์งํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ ์ฌ๋๋ค์ด ์์ ๊ฐ์ด ๋ ์ฝ๊ฒ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ ๋ฏธ์ฌ ์๋ฃจ์
์ ์ฐฌ์ฑํ์ต๋๋ค. ์ ๋์ฌ ์ ํ์๋ ๋๋ต์ ์ธ ํฉ์๊ฐ ์์ง๋ง ์ด๋ค ํ์ ์๋ฃจ์
์ด ๊ฐ์ฅ ์ข์์ง์ ๋ํ ํฉ์๋์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ์ ๋ ๋ชจ๋ ์ต์
์ ํผ๋์ ์ ๋ฐํฉ๋๋ค (ํค์๋ ๊ฐ์กฐ ํ์๋ก ์ํ).
await
๋ผ๋ ์ธ์๋ก fn ํธ์ถawait
ํค์๋์
๋๊น?๋ค๋ฅธ๋ณด๋ค ๊ณผ๊ฐํ ์ ์ :
match
, if
๋ฑ๊ณผ ๊ฐ์ ๋ ๋ง์ ํค์๋์ ์ ์ฉ๋ ์ ์์ง๋ง ๋ถํ์ํฉ๋๋ค.) ์ด ํ ๋ก ์ ๋ํ ๋ถ๋ก) [[์ฐธ์กฐ] (https://github.com/rust-lang/rust/issues/57640#issuecomment-455827164)]await
(์ฐ์ ์์) [[์ฐธ์กฐ] (https://github.com/rust-lang/rust/issues/57640)]ํค์๋ ๋งคํฌ๋ก 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
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` |
---|---|
|
|
์ด๊ฒ์ ๋ํ ?
์ธ ๋ํ๋๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ ๋ช
ํํ๊ฒํฉ๋๋ค. 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()
๋ ๋ค ์ธ์ด๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
Python๊ณผ JavaScript ๋ชจ๋ ์ ๋์ฌ await
์์ต๋๋ค. ์ฒ์์ await
๋ํ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ์ด๊ฒ์ด ๋น๋๊ธฐ ์ฝ๋๋ผ๋ ๊ฒ์ ๊นจ๋ซ๊ธฐ ์ํด ์ค์ ๊น์์ด ์ฝ์ด์ผํ๋ค๋ฉด ๋งค์ฐ ๋ถ์ํฉ๋๋ค. Rust์ WASM ๊ธฐ๋ฅ์ผ๋ก ๋ง์ JS ๊ฐ๋ฐ์๋ฅผ ๋์ด๋ค์ผ ์ ์์ต๋๋ค. Rust๊ฐ ์ด๋ฏธ ๋ง์ ์๋ก์ด ๊ฐ๋
์ ๊ฐ์ง๊ณ ์๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ ์น์ ํจ ๊ณผ ํธ์ํจ ์ด ์ ๋ง ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ๋ฏธ์ฌ 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์๋ ๊ณ์ฐ ๊ฐ๋ฅํ ์์ฑ์ด ์์ผ๋ฉฐ ํ๋ ์ก์ธ์ค๋ ๋งค์ฐ ๊ฐ๋จํ ์์
์
๋๋ค. ๋ฐ๋ผ์์ด ์์
์ ๋ณต์ก์ฑ์ ๋ํด ์๋ชป๋ ์ธ์์์ฃผ๋ ๊ฒ ๊ฐ์ต๋๋ค.์ด๋ฌํ ์ด์ ๋ก ์ ๋ "์ ์ฉํ ์ฐ์ ์์"๋ค์์ "ํ์ ๊ตฌ๋ถ ๊ธฐํธ"๋ฅผ ์ ํธํฉ๋๋ค.
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 ,
.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 ,
๋์ํ์ง ์์ต๋๋ค. ์น์ ํจ์ด ์ฌ๊ธฐ์์ ๊ณผ๋ ํ๊ฐ๋ฉ๋๋ค. ๋ค๋ฅธ ์ธ์ด์์ ๋ง์ด๊ทธ๋ ์ด์
ํ ๋ ๋จผ์ ์ฌ๋๋ค์ async-await
์คํ์ผ์ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ํ ์์๋ ๋ฅ๋ ฅ์ ์ถ๊ตฌํ์ง๋ง ์ ํํ ๋์ผํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง๋ ์์ต๋๋ค. ๋ค๋ฅด๊ฒ ๊ตฌํ๋์ง๋ง ๋ ๋์ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ค๋ฉด ๋ ๋ค๋ฅธ ์ด์ ์ด ๋ ๊ฒ์
๋๋ค.
๊ธด ์ฒด์ธ์ ๋๋ฒ๊น
ํ ์ ์๋ค๋ ๊ฒ์ ์ฝ๋ ์คํ์ผ์ด ์๋ ๋๋ฒ๊ฑฐ์ ํ๊ณ์
๋๋ค. ๊ฐ๋
์ฑ์ ๋ํด์๋ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ฉฐ ๋ช
๋ นํ ์คํ์ผ์ ์ ์ฉํ๋ ๊ฒ์ ์ฌ๊ธฐ์ ๋ถํ์ํ๊ฒ ์ ํ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. 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!()
๊ฐ ๊ฐ์ฅ ์ฝ๊ธฐ ์ฝ๊ณ ์น์ํ๋ฉฐ ๋๋ฒ๊ทธํ๊ธฐ ์ฌ์ด ์ต์
์
๋๋ค.
์๋ ํ์ธ์.
๊ทํ์ ๊ฒ์๋ฌผ์ ๋ณด์๊ณ ์ค์ ๋ก "์ต์ ํจ"์ ๋ํด ๋ฐ์ฑ ํ์ผ๋ฏ๋ก ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. ๋ ๊ฐ์ง ์ ํ์ ์น์ ํจ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
await ๊ตฌ๋ฌธ์ await๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ์ ์ฌํ ์ธ์ด์ฒ๋ผ ๋ณด์ด๊ฒํฉ๋๋ค. Javascript๋ ์ฌ๊ธฐ์์ ๊ฝค ํฌ๊ณ ์ปค๋ฎค๋ํฐ๋ก์์ WASM ๊ธฐ๋ฅ๊ณผ ๋งค์ฐ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ ๋ฒ์งธ ์ ํ์ ์น์ ํจ์ ๋๊ธฐ ์ฝ๋๋ก๋ง ์์ ํ๋ ๊ฐ๋ฐ์์๊ฒ ์ฝ๋๋ฅผ ์น์ํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋๋ค. 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 ๋งคํฌ๋ก๋ฅผ ํ์ฉํฉ๋๋ค.
๋ ์ฑ / ํ์ฑ์ ๊ฒฝ์ฐ ์ด๊ฒ์ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. 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
ํํ์์ ๋ํด์๋ ๋์ผํ ๋
ผ์๊ฐ์์ ๊ฒ์
๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค. ๋๋ ์ผ๋ฐํ ํ ์์๋ ๊ตฌ๋ฌธ์๋ณด๊ณ ์ถ์ง๋ง,๋ณด๊ธฐ์๋ ์ถฉ๋ถํฉ๋๋ค.
์ฌ๊ธฐ์ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ :
stream.await_all
์ combinator์ ์๋ฒฝํ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค.option.or_continue
๋ฐ _else
๊ฒฐํฉ์๋ฅผ ๋์ฒดํ๋ ๊ฒ์ null ๋ณํฉ ์ฐ์ฐ์์ ์๋ฒฝํ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค.monad.bind
์ if-let
์ฒด์ธ์ ์๋ฒฝํ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค.ndarray slicing
๋ const
์ ๋ค๋ฆญ์ ์๋ฒฝํ ์ฌ์ฉ ์ฌ๋ก์
๋๋ค.?
์ฐ์ฐ์๋ฅผ ๊ตฌํ ์๋ ํ์ธ์.
๋ง์ฐฌ๊ฐ์ง๋ก ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค
๋๋์ฒด ์ ๊ทธ๋ค์ด ๋ฌถ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๊น? ์์ println
์์ ์ฒ๋ผ ์ค์ ์ฝ๋์์ ๋ฐ์ํ์ง ์์ต๋๋ค.
@Pzixel ๊ฒฐ๊ตญ Generator::resume
๊ฐ ๊ฐ์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก yield expr
์ ๋น ()
์ ํ์ ๊ฐ๊ฒ๋ฉ๋๋ค.
@vlaff ์ ํ Ascription๊ณผ ์ผ์นํด์ผํ๋ await
๋ํ ์ธ์๊ฐ ๋ช
ํํ๊ฒ ๋ณด์ด์ง ์์ต๋๋ค. ๊ทธ๋ค์ ๋งค์ฐ ๋ค๋ฅธ ๊ฒ๋ค์
๋๋ค.
๋ํ Type Ascription์ ๋ฐ๋ณต์ ์ผ๋ก ์๋๋๋ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ฉฐ _this_๊ฐ ์ฑ๊ณตํ ๊ฒ์ด๋ผ๋ ๋ณด์ฅ์ ์์ต๋๋ค. ์ด์ ๋ฐ๋ํ๊ณ ์ถ์ง๋ ์์ง๋ง TA๋ ๋ฏธ๋์ RFC์ด๋ฉฐ ์ด๊ฒ์ ์ด๋ฏธ ์ ์ ๋ ๊ตฌ๋ฌธ์ผ๋ก ํ์ฉ๋๋ ๊ธฐ๋ฅ์ ๋ํ ๋ ผ์์ ๋๋ค.
๋ง์ ์ฃผ์์ ์ฝ๊ณ ์ await! (...)๊ฐ ๋งค์ฐ ์ด์์ ์ธ ๊ฒฝ๋ก๋ก ๋ํ๋๋์ง์ ๋ํ ์ถ๊ฐ ์์ฝ์ ์ถ๊ฐํฉ๋๋ค.
๊ธฐ๋ค๋ฆฌ๋ค! ์ฌ๊ธฐ์ ๋งคํฌ๋ก๋ ์ด๋ฏธ ์กด์ฌํ๋ฉฐ ์ง๋ฌธ์ ์ฐ๊ฒฐ์ ๊ดํ ๊ฒ์ ๋๋ค.
์๊ฐํ๋ฉดํ ์๋ก ์ ๋ฏธ์ฌ๊ฐ ๋ ์ข์ ๋ณด์ธ๋ค. ์๋ฅผ ๋ค๋ฉด :
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๊ฐ ์ผ๋ฅ ์๋ฏผ์ผ๋ก์ ๊ทธ ๊ด์ฉ๊ตฌ๋ฅผ ๊ฐ๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๊ฒ์ด ์ ๋ง ์ผ๋ฐ์ ์ธ ๊ด์ฉ๊ตฌ์ ๋๊น? ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ํด ์ ๋ง๋ก ๊ด์ฌ์ด ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ดํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
foo.await()
)๋ก ์ด๋ํฉ๋๋ค. ์ด์ํ ์ ๋ฏธ์ฌ ํค์๋๋ฅผ ์๊ฐํ์ง ์์ผ๋ฉฐ ์ฐ๋ฆฌ ๋ชจ๋ ๊ทธ ์๋ฏธ๋ฅผ ์๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๊ณผ ์ฐ๊ฒฐํ ์๋ ์์ต๋๋ค.๋ํ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ ์ ๊ณตํ๊ธฐ ์ํด ์ ๋ฏธ์ฌ ํค์๋ ์์น์์ 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
๋ ๋งค์ฐ ํน๋ณํ๋ฉฐ ์ผ๋ฐ์ ์ธ ๋ฉ์๋ ํธ์ถ์ด ์๋๋ผ๋ ์ ์ ๋ชจ๋์๊ฒ ์๊ธฐ์ํค๊ณ ์ถ์ต๋๋ค.
!Unpin
์ด์ด์ผํ๋ ์ด์ ์ด๋ฉฐ, ๊ธฐ์กด ๊ฒฐํฉ ์ ๋ฐ ๋ฉ์ปค๋์ฆ ์ค ์ผ๋ถ์ ๋ง์ ๋ถํธ์ ์ด๋ํฉ๋๋ค. ๋ฏธ๋์ ๋น๋ฆฌ์ง ์๋ async
๋ฉ์๋์์ Unpin
์ ๋ฌผ์ ์์ฑํ๋ ๊ฒ์ด ์ ์ฌ์ ์ผ๋ก ๊ฐ๋ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ 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)
๊ฐ์๋ ๊ฒ์ฒ๋ผ ์ ๋์ฌ?
๋ผ์ธ์ _end_๋ฅผ ์ค์บํ๊ณ ์์ต๋๋ค.๋ด๊ฐ ๋ญ ๋์น ๊ฑฐ ์๋?
๋ ผ์์ด "์, ๊ทธ๊ฒ๋ค์ ๊ฑฐ์ ๊ฐ๋ค"์๋ค๋ฉด, ๋๋ "๊ธ์, ์ฐ๋ฆฌ๊ฐ ์ ๋ง๋ก ์ ๊ฒฝ ์ฐ์ง ์๋๋ค๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค์ดํ๋ ์ผ์ํ๋ ๊ฒ๋ง ํผ ์ข์์ง๋ ๋ชจ๋ฅธ๋ค"์ ์ ๋์ ์ผ๋ก ๋์ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ์๋ ๊ณณ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@scottmcm ์, "์, ๊ทธ๋ค์ ๊ฑฐ์ ๋์ผํฉ๋๋ค." ์ ์ด๋ ์ฌ์ฉ์์ ๊ด์ ์์.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ฐ๋
์ฑ, ์น์ ํจ, ์ ์ง ๊ด๋ฆฌ ๋ฐ ์ฑ๋ฅ์ ์ ์ ํ ๊ท ํ์ ์ฐพ์์ผํฉ๋๋ค. ๋ฐ๋ผ์ ๋ง์ง๋ง ์ฃผ์์ ์ง์ ์ await!()
๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๋์ค์ ํ์ ๋ฉ์๋ ๋งคํฌ๋ก ( .await!()
)๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ง๋ฃจํ ์ ๋์ฌ ํค์๋ await
๋ฅผ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ ์ฐธ์
๋๋ค
์ง๋ฃจํจ์ด ์ข๊ธฐ ๋๋ฌธ์ ์ง๋ฃจํ๋ค๊ณ ๋งํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ๋ค์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๊ตฌ๋ฌธ ์์ฒด์์ ๋ฒ์ด๋๊ธฐ๋ฅผ ์ํฉ๋๋ค.
f.await()
๊ฐ ์ข์ ์๊ฐ์ด ์๋๋ผ๋ฉด ์ ๋์ฌ ๊ตฌ๋ฌธ์ ์ ํธํฉ๋๋ค.
์ฌ์ฉ์๋ก์ ์ ๋ ์ ๊ฐ ์ฌ์ฉํ๋ ์ธ์ด์ ๋ฌธ๋ฒ ๊ท์น์ด ๋ช ๊ฐ ๋ฐ์ ์๊ธฐ๋ฅผ ๋ฐ๋ผ๋ฉฐ,์ด ๊ท์น์ ์ฌ์ฉํ์ฌ ์ด๋ค ์ผ์ํ๋์ง ํ์คํ๊ฒ ์ถ๋ก ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ ์ ๊ธฐ ์์ธ๊ฐ ์๋๋๋ค . Rust์์ async
๋ ์ฒ์์ ์๊ณ , await
๋ ์์ธ๊ฐ ์๋๋๋ค. ๊ทธ๋ฌ๋ f await
, ๊ฒ์๋ฌผ ํค์๋ ํ์์๋ฉ๋๋ค. f.await
๋ ์์ธ ์ธ ํ๋ ์ก์ธ์ค์ฒ๋ผ ๋ณด์
๋๋ค. f.await!()
์๋ ์ ๋ฏธ์ฌ ๋งคํฌ๋ก๊ฐ ์ธ์ด๋ก ํ์๋์ง ์์์ผ๋ฉฐ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์ข์ ์์ธ ๊ฐ ๋ฌด์์ธ์ง ๋ชจ๋ฆ
๋๋ค. ์ด๋ฌํ ๊ตฌ๋ฌธ์ด ์ผํ์ฑ ์์ธ๊ฐ ์๋ ๊ท์น ์ด๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ต๋ณ์ด ์์ต๋๋ค.
์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ?
๋ฅผ ์๋ก ๋ค์ด ๋ณด๋ฉด ๋ค๋ฅธ ์ธ์ด์์๋ ์์ฃผ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ์์ธ๋ก ๋ณด์ผ ์ ์์ต๋๋ค. f()?.map()
๋ compute f ()์ ๊ฑฐ์ ๋น์ทํ๋ฉฐ์ด ๊ฒฐ๊ณผ๊ฐ ์ข์๊ฐ์? ์ฌ๊ธฐ์์ ?
๋ ๊ทธ ์์ฒด๋ฅผ ์ค๋ช
ํฉ๋๋ค. ํ์ง๋ง f await
์ ์ ๋ฏธ์ฌ์
๋๊น?, f.await
๊ฒฝ์ฐ await
ํ๋, f.await!()
์ ๋งคํฌ๋ก๊ฐ ํด๋น ์์น์ ๋ํ๋๋์ง ๋ฌป์ต๋๋ค. ์ ์ด๋ ์ธ๋ป๋ณด๊ธฐ์๋ ์ค๋๋ ฅ ์๊ณ ์ง๊ด์ ์ธ ๊ฐ๊ฐ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ์์ ์ ํ์ฅํ๋ฉด Rust๋ ์์คํ ์ธ์ด๊ฐ๋๊ธฐ๋ฅผ ๊ฐ์ฅ ์ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ ํ๋ ์ด์ด ์ธ C / C ++ / Go / Java๋ ๋ชจ๋ ๋ค์ ํ์์ ๋๋ค. ์ ๋ ๋ํ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ๋ช ๋ นํ ์ธ์ด, C / Python / Java, Haskell ๋ฑ์ผ๋ก ๊ฒฝ๋ ฅ์ ์์ํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์์คํ ๊ฐ๋ฐ์์ ์ฐจ์ธ๋ ๊ฐ๋ฐ์๊ฐ Rust๋ฅผ ์ฑํํ๋๋ก ์ค๋ ํ ๊ฒ ๊ฐ์ต๋๋ค. Rust๋ ๋จผ์ ๋ช ๋ นํ ์คํ์ผ์์ ์ํ๊ณ ๊ทธ๋ค์์๋ ๊ธฐ๋ฅ์ ์ด์ด์ผํฉ๋๋ค. ๋งค์ฐ ๊ธฐ๋ฅ์ ์ด์ง๋ง ์ต์ํ ๋ช ๋ น ์ ๋๋์ด ์์ต๋๋ค.
์ฒด์ธ์ ๋ถํ ํ์ฌ ์ฌ๋ฌ ์ค๋ก ์์ฑํ๋ ๊ฒ์ ์๋ชป์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฅํฉํ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๋ช ์ ์ ์ ๋๋ค.
ํ ๋ก ์ด ํ ๋ฐฉํฅ์์ ๋ค๋ฅธ ๋ฐฉํฅ (์ ๋์ฌ ๋ ์ ๋ฏธ์ฌ)์ผ๋ก ์ง์์ ์ผ๋ก ์ด๋ํ๋ ๋ฐฉ์์ ๋ณผ ๋ 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. "์ง์ฐ๋ ์ ๋์ฌ ์ฐ์ฐ์"๊ตฌ๋ฌธ ํค์๋๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ค์ํฉ๋๋ค.
์ด์จ๋ 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
,
๋ค์์ ๋ด๊ฐ ๊ฐ์ง ๋ชฉํ์
๋๋ค (์ค์ํ ์์์์ด).
await
์ (๋) ํฅํ ์ธ์ด ๋์์ธ์ ๊ฐ๋ฅํ๊ฒํ๋ ํค์๋๋ก ๋จ์ ์์ด์ผํฉ๋๋ค.?
๋ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋๋ก ์ ๊ตฌ์ฑ ํ ์ ์๋๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅํด์ผํฉ๋๋ค. ์๋ฏธ์๋ ์ธ๋ถํ๊ฐ ์๋ ์์๋ ์์ let
๋ฐ์ธ๋ฉ์ ๊ฐ์ํด์๋ ์๋ฉ๋๋ค.grep
๊ฐ ์ฌ์์ผํฉ๋๋ค.๋ด ๋ชฉํ ์ค ์ผ๋ถ๋ฅผ ์ ์ํ (์๋ง๋ ์์์ ๊ฒ์ ๋๋ค ...) ๋ค์์ ์ด์ ๋ํ ๋ช ๊ฐ์ง ์ ์์ ๋ํ ์์ฝ ๋ฐ ํ๊ฐ์ ๋๋ค.
await
๋ฅผ ํค์๋๋ก ์ ์งํ๋ฉด await!(expr)
๋๋ expr.await!()
์ฌ๋ถ์ ๊ด๊ณ์์ด ๋งคํฌ๋ก ๊ธฐ๋ฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๋งคํฌ๋ก ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ค๋ฉด await
๋ฅผ ๋งคํฌ๋ก๋ก ํ๋ ์ฝ๋ฉํ๊ณ ์ด๋ฆ ํ์ธ๊ณผ ํตํฉ๋์ง ์๊ฑฐ๋ (์ฆ, use core::await as foo;
๊ฐ ๋ถ๊ฐ๋ฅ ํด์ง) await
๊ฐ ํค์๋๋ก ์์ ํ ํฌ๊ธฐ๋ฉ๋๋ค.
๋๋ ๋งคํฌ๋ก๊ฐ ์ฌ์ฉ์ ๊ณต๊ฐ์์ ๊ตฌ๋ฌธ์ ๋ฐ๋ช
ํ๊ธฐ์ํ ๊ฒ์ด๋ฏ๋ก ๋งคํฌ๋ก์ ๋ํด ๋ช
๋ฐฑํ ์ผ๋ฅ๊ฐ ์๋ ๋๋์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ธฐ์ ์ ์ธ ์์ ์ ์๋์ง๋ง ์ด๋ฌํ ์ธ์ด์ ์ค์ฌ ๊ตฌ์กฐ์์ ๋งคํฌ๋ก ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๊ดํ์ด์๋ ์ธ์์์ค๋๋ค. ํ๋ฆผ์์ด .await
๋ฐ .await()
๊ตฌ๋ฌธ์ ์ต๊ณ ์ ๊ตฌ๋ฌธ๋ ์๋๋๋ค. ํ์ง๋ง ๋งคํฌ๋ก์ฒ๋ผ 2 ๋ฑ๊ธ์ ์๋๋๋ค.
์ฐ๊ฒฐ์ ์ฉ์ดํ๊ฒ ํ๋ ค๋ ์๊ตฌ ๋ก ์ธํด ์ ๋์ฌ ๊ตฌ๋ฌธ์ด ์ ๋๋ก ์๋ํ์ง ์๋ ๋ฐ๋ฉด ์ ๋ฏธ์ฌ ๊ตฌ๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ ๋ฉ์๋ ์ฒด์ธ๊ณผ ํนํ ?
๋ฉ๋๋ค.
์ ๋ฏธ์ฌ, ์ ๋์ฌ, ๋งคํฌ๋ก ๋ฑ await
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด Grepping์ด ๊ฐ์ฅ ์ฝ์ต๋๋ค.์๊ธธ ๊ธฐ๋ฐ ๊ตฌ๋ฌธ์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ (์ : #
, @
, ~
, grepping์ด ๋ ์ด๋ ค์์ง๋๋ค. ์ฐจ์ด๋ ํฌ์ง ์์ง๋ง .await
await
๋ฐ await
๋ณด๋ค await
๊ฐ ์ฃผ์์ ๋จ์ด๋ก ํฌํจ๋ ์ ์์ง๋ง ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ ๋ ์ ๊ธฐ ๋๋ฌธ์ grepํ๊ธฐ๊ฐ ์ฝ๊ฐ ๋ ์ฝ์ต๋๋ค. .await
์๊ธธ์ ํ ๋์ ์ฐพ๊ธฐ๊ฐ ๋ ์ด๋ ค์ธ ์ ์์ง๋ง await
๋๋ณด๊ธฐ ์ฝ๊ณ ํนํ ๊ตฌ๋ฌธ์ด ๊ฐ์กฐ ํ์๋ฉ๋๋ค. .await
๋๋ ๊ธฐํ ์ ๋ฏธ์ฌ ๊ตฌ๋ฌธ์ ํ ๋์๋ณด๊ธฐ๊ฐ ๋ ์ด๋ ต๊ฑฐ๋ await
์ ๋ฏธ์ฌ๊ฐ ๊ฐ๋
์ฑ์ ์ ๊ณตํ์ง ์๋๋ค๊ณ ์ ์๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์๊ฐ์ @scottmcm ์ ๊ฒฐ๊ณผ์ ๋ฏธ๋๊ฐ ์ผ๋ฐ์ ์ด๋ฉฐ .await?
๊ฐ ๊ทธ ์์ฒด๋ก ๋ ๋ง์ ๊ด์ฌ์ ๋ ์ ์๋ค๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ง์ ํฉ๋๋ค. ๋ํ Scott์ ์ ๋์ฌ await
๊ฐ ์ ์ ๊ฒฝ๋ก ๋ฌธ์ฅ์ผ๋ก ์ด์ด์ง๊ณ ์ ์ค๊ฐ์์๋ ์ ๋์ฌ๊ฐ ์ ๋ฏธ์ฌ๋ณด๋ค ๋ ์ฝ๊ธฐ ์ด๋ ต๋ค๋ ์ ์ ์ฃผ๋ชฉํฉ๋๋ค. ?
์ฐ์ฐ์์ ์ถํ์ผ๋ก, Rust ํ๋ก๊ทธ๋๋จธ๋ ์ด๋ฏธ ์ ์ด ํ๋ฆ์ ์ฐพ๊ธฐ ์ํด ์ค ๋ ์
.await
๋ฐ .await()
์ ์ฐ์ ์์๋ ์์ ํ ์์ธก ๊ฐ๋ฅํ๋ค๋ ์ ์์ ์ฃผ๋ชฉํ ๋งํฉ๋๋ค. ํ๋ ์ก์ธ์ค ๋ฐ ๋ฉ์๋ ํธ์ถ ๋์์ผ๋ก ์๋ํฉ๋๋ค. ์ ๋ฏธ์ฌ ๋งคํฌ๋ก๋ ์๋ง๋ ๋ฉ์๋ ํธ์ถ๊ณผ ๋์ผํ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ๊ฒ์
๋๋ค. ํํธ, await
์ ๋์ฌ๋ ?
(์ : await (expr?)
)์ ๊ด๋ จํ์ฌ ์ผ๊ด์ฑ ์๊ณ ์์ธก ๊ฐ๋ฅํ๋ฉฐ ์ ์ฉํ์ง ์์ ์ฐ์ ์์๋ฅผ ๊ฐ๊ฑฐ๋ ์ฐ์ ์์๊ฐ ์ผ๊ด์ฑ์ด์๊ณ ์ ์ฉํฉ๋๋ค (์ : (await expr)?
). ์๊ธธ์ ์ํ๋ ์ฐ์ ์์๋ฅผ ๋ถ์ฌ ํ ์ ์์ต๋๋ค (์ : ?
์์ ์ง๊ด ๊ฐ์ ธ ์ค๊ธฐ).
2012 ๋
์ @nikomatsakis ๋ Simon Peyton Jones๊ฐ "์ ์ ํ"์ ๋ถ๋ฌ์ํ๋ฉฐ ๊ทธ๊ฒ์ด ์๋ฏธํ๋ ๊ธฐ๋ฅ์ด๋ ๋ถ์ผ๋ฅผ ์ขํ ์์๋ IDE ๋ง๋ฒ์ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ถ๋ฌ์ํ๋ค๊ณ ํ ๋ฒ ์ธ๊ธํ๋ค๊ณ ์ธ๊ธํ์ต๋๋ค (p. 56) . ์ ์ ํ์ ๋ง์ ์ธ๊ธฐ์๋ ์ธ์ด (์ : Java, C #, C ++, ..)์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ "์ ์ ๋๋ฌ"ํ๋ ๊ฒ์ด ๊ทผ์ก ๋ฉ๋ชจ๋ฆฌ์ ์ค๋ฉฐ๋ค๊ฒํ์ต๋๋ค. ์ด ์ต๊ด์ด ์ผ๋ง๋ ๊ฐ๋ ฅํ ์ง ์ค๋ช
ํ๊ธฐ ์ํด ๋ค์์ Re # er๊ฐ ํฌํจ ๋ Visual Studio์ @scottmcm ์ผ๋ก ์ธํ ์คํฌ๋ฆฐ ์ท์
๋๋ค.
C #์๋ await ์ ๋ฏธ์ฌ๊ฐ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ด๊ฒ์ ์ ํจํ ๊ตฌ๋ฌธ์ด ์๋ ์๋ ์์ฑ ๋ชฉ๋ก์ ํ์ ๋ ์ ๋๋ก ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ .await
๊ฐ ํ๋ฉด ๊ตฌ๋ฌธ์ด ์๋ ๋ .aw
๋ฅผ ์๋ํ๋ ๊ฒ์ ์ ๋ฅผ ํฌํจํ์ฌ ๋ง์ ์ฌ๋๋ค์๊ฒ ๋ฐ์ํ์ง ์์ ์ ์์ต๋๋ค. IDE ๊ฒฝํ์ ์ด์ ์ ๊ณ ๋ คํ์ญ์์ค. await expr
๋ฐ expr await
๊ตฌ๋ฌธ์ ์ด๋ฌํ ์ด์ ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
Sigils๋ ์๋ง๋ ์น์ํ์ง ์์ ๊ฒ์
๋๋ค. ์ ๋์ฌ await
๋ C #, JS ๋ฑ์ ์ต์ํด์ง๋ฉด ์ด์ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ Rust๋ await
์ ?
๋ฅผ ๋ณ๊ฐ์ ์ฐ์ฐ์ผ๋ก ๋ถ๋ฆฌํ์ง ์์ต๋๋ค. await expr
์์ expr.await
๋ก ์ด๋ํ๋ ๊ฒ๋ ์คํธ๋ ์นญ์ด ์๋๋๋ค. ๋ณํ๋์๊ธธ์ ์ฌ์ฉํ๋ ๊ฒ๋ง ํผ ๊ธ์ง์ ์ด์ง ์์ต๋๋ค. ๋ํ ์์ ์ธ๊ธ ํ ๋ท ํ์๋ก ์ธํด expr.
๋ฅผ ์
๋ ฅํ๊ณ ์๋ ์์ฑ ํ์
์ ์ฒซ ๋ฒ์งธ ์ต์
์ผ๋ก await
๊ฐ ํ์๋๋ฉด .await
์ ํ์ต ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
์๊ธธ์ ์์ฑํ๊ธฐ ์ฌ์ฐ ๋ฉฐ ์ธ์ฒด ๊ณตํ์ ์ผ๋ก๋ ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ .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()?;
await
-ํ์ธยน ์ฐ์ ์์ : 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 () ?;
- ์ฌ์ฉ ๋๊ธฐ-ํ์ธ
- ์ผ๋ฑ์-์ํ
- ์ฒด์ด๋-ํ์ธ
- Grepping-ํ์ธ
- ๋น์๊ธธ-ํ์ธ
- ์ฐ์ ์์-ยน ํ์ธ
- ๋ํธ ํ์-ยฒcheck
- ๋ฐฐ์ฐ๊ธฐ ์ฌ์-ยณ ํ์ธ
- ์ธ์ฒด ๊ณตํ์ -์ ๊ฒ
ยน ์ฐ์ ์์ : ๊ณต๋ฐฑ์ ์ง์ฐ๋ ์์น์์ ๋ช ํํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์
๋ค์ ์ฝ๋์์์ ์ ํํ ๋์ผํฉ๋๋ค. 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
์ ๋ถ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ์๋ ํธ์ถ๊ณผ ๋งค์ฐ ๋น์ทํด ๋ณด์ ๋๋ค. ์ฝ๋ ๊ฐ์กฐ ํ์๋ ๋ง์ ๋์์ด๋์ง ์์ผ๋ฉฐ ํญ์ ์ฌ์ฉํ ์์๋ ๊ฒ์ ์๋๋๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฒด์ธ์ด ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค ( ?
์ ์ธํ์ง๋ง 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
์์ฌ ํ๋๊ฐ ๋งค์ฐ ์ด์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋์๊ฒ ์ค์ํ ๋ค๋ฅธ ๋ถ์ผ์๋ ์ ํ ๋ค๋ฆ
๋๋ค.๋๋ await!()
๋งคํฌ๋ก๊ฐ "์ผ๋ฅ๋ผ๊ณ ๋๋ผ์ง ์๋๋ค"๋ ๊ฐ์ ์ ๊ณต์ ํ์ง ์์ต๋๋ค. ๋งคํฌ๋ก๋ Rust์์ ์์ ํ ์ผ๋ฅ ์๋ฏผ ์
๋๋ค. ๋ํ "์ฌ์ฉ์ ์ฝ๋์์ ๊ตฌ๋ฌธ ๋ฐ๋ช
"์ ์ํด์๋ง ์กด์ฌํ๋ ๊ฒ์ ์๋๋๋ค. ๋ง์ "๋ด์ฅ"๋งคํฌ๋ก๋ ์ฌ์ฉ์ ์ ์๊ฐ ์๋๋ฉฐ ๋จ์ํ ๊ตฌ๋ฌธ์์ ์ด์ ๋ก ์กด์ฌํ์ง ์์ต๋๋ค. format!()
๋ ์ปดํ์ผ๋ฌ์๊ฒ ์ ์ ์ผ๋ก ํ์์ ๊ฒ์ฌํ๋ ํ์ ๋ฌธ์์ด์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. include_bytes!()
๋ํ ์ฌ์ฉ์ ์ ์๊ฐ ์๋๋ฉฐ ๋จ์ํ ๊ตฌ๋ฌธ์์ ์ด์ ๋๋ฌธ์ ์กด์ฌํ์ง ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง ์ปดํ์ผ๋ฌ ๋ด๋ถ์์ ํน๋ณํ ์์
์ ์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ฌธ ํ์ฅ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋งคํฌ๋ก์
๋๋ค. ํต์ฌ ์ธ์ด ๊ธฐ๋ฅ์ผ๋ก ์ถ๊ฐํ์ง ์๊ณ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ํฉ๋ฆฌ์ ์ผ๋ก ์์ฑํด์ผํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ์ผ์ข ์ ๋ด ์์ ์ ๋๋ค. ๋งคํฌ๋ก๋ ๊ท ์ผํ๊ณ ๋๋ผ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ปดํ์ผ๋ฌ ๋ง๋ฒ์ ๋์ ํ๊ณ ์จ๊ธฐ๋ ์๋ฒฝํ ๋ฐฉ๋ฒ์ ๋๋ค
๊ทธ๋์ ์ ๋ ํน๋ณํ ํค์๋์ ํ์์ฑ์ ์ ํ ์์ง ๋ชปํฉ๋๋ค. ์ฆ, ํค์๋๊ฐ ๋๋ ค๋ฉด ๊ทธ์ ๊ทธ์ ๊ทธ์ ํค์๋ ์ฌ์ผํฉ๋๋ค. ํ๋๋ก ์์ฅํ ๋๊ธฐ๋ฅผ ์ ๋ง๋ก ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๊ฒ์ ์๋ชป๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ ํ๋ ์ก์ธ์ค๊ฐ ์๋๋ฉฐ ์๊ฒฉ์ผ๋ก ํ๋ ์ก์ธ์ค ์ ๋
@ H2CO3 await!
๋งคํฌ๋ก๋ ๋ค์ ๋ ๊ฐ์ง ์์ฑ์ ์ ์ธํ๊ณ ๋ชจ๋ ๋ฐ๋์งํ ๋ฐฉ์์ผ๋ก ์ข์ต๋๋ค.
if/while/...
๋ธ๋ก์์ ์ค๊ดํธ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. ์ค์ํ์ง ์์ ATM์ผ๋ก ๋ณด์ผ ์ ์์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ต๋๋ค.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 ์ ์ ๊ฒฝ๊ณ ๊ฐ ์์ ์ผ๋ ์กฐ์ฌํ์ธ์.
๋๋ถ๋ถ์ ์ปค๋ฎค๋ํฐ๊ฐ ํํํ๊ณ "๋ถ๋ถ ์์ ์ ๋๊ธฐ"๋ฅผ ํ์ฉํ๋์ง ๊ถ๊ธํฉ๋๋ค. ์ ์ฒด์ธ ๋น ํ ๋ฒ ์ฝ๋ ๊ฒ์ด ์ถฉ๋ถํ ๋ช ์ ์ ์ผ๊น์?
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 ๋ค์ดํฐ๋ธ ์ ๊ทผ ๋ฐฉ์์ "๋ชจ๋ ๋ช ์ ์ "์ ๊ฐ๊น์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ณด์ง ์๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ํญ์ ๋ช ์์ ์ด๊ณ ์์์ ์ธ ํํ์ด๋ผ๊ณ ๋ด ๋๋ค. ์๋ฅผ ๋ค๋ฉด :
์ฐ๊ฒฐ์ ๋ชจ๋ ์ด์ ๊ณผ ํจ๊ป ์ / ๋ฌธ๋น ํ ๋ฒ๋ง 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
ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ์ธ์ด์์ ํด๋น ๊ตฌ๋ฌธ์ ์ต์ํ ์ฌ์ฉ์๊ฐ ์ก์ธ์ค ํ ์ ์์ต๋๋ค..await!()
๊ฐ ์์ต๋๋ค..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 $ :
await
๊ฐ์๋ ๊ฒ์๋ณ๋ก ๋์์ด๋์ง ์์ต๋๋ค. ๋ง์ ๊ฒ์ ์์ฑํ ํ์๋ fn
๋๋ extern
. ์ถ๊ฐ ์์ฑ์ ์ ์ฉํ ๋ฐฉ๋ฒ / ํ๋ ๋์ ํค์๋๋ก ์ ์๋๊ธฐ ๋๋ฌธ์ ์๋ฌด๊ฒ๋์๋ ๊ฒ๋ณด๋ค ๋ ๋์ฉ๋๋ค.async
ํค์๋๊ฐ๋๋ ๋น๋์นญ ์ฑ์ ์๋ฏธํฉ๋๋ค.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์ ํนํ? ์์์ ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์ ํ ์ด๋ธ์์ ๋ฒ์ด๋ฌ์ต๋๋ค.
๋์ฒด ์ฝ๋ ๊ฐ์กฐ ์ฒด๊ณ๋ฅผ ์์ง ๋ง์ญ์์ค.์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ์ฌ๊ธฐ์ "๋ณด์ด์ง ์์"์ด ๋
๋ฆฝํ ?
๋ณด๋ค ๋ ํฐ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฆฌํ ์ ๊ตฌ์ฑํ๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ๋ ๋์ ๋๊ฒ ๋ง๋ค ์ ์์ต๋๋ค (์ : ?
์ ๋ค๋ฅธ ์ ์ฌ์ฉ).
@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
๊ฐ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๊ณ ์ฐจ์ ์ฑ
์ผ๋ก ๋ณด์ด๋ ๋น๋ ์๋ฅผ ์กฐ์ฌ ํ ์๋ ์์ต๋๊น? ์ ๋์ฌ ๋ ์ ๋ฏธ์ฌ ๋น๋ ์์ ๋ํ ์ค๋ฌธ ์กฐ์ฌ๊ฐ ๋ช ๊ฐ์ง ์ง๋ฌธ์ ๋ตํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
await
์ ๋ฏธ์ฌ์ ๊ฐ์ฅ ์ข์ ์ฌ์ฉ ์ฌ๋ก๊ฐclient.get("https://my_api").send() await?.json() await?
๋ง์ ๊ฒ์๋ฌผ์ด ์์ ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๋ญ๊ฐ ๋์น ๊ฒ ๊ฐ์ง๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์์ต๋๊น? ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ ์์ฃผ ๋ํ๋๋ ๊ฒฝ์ฐ์ด ์ค์ ํจ์๋ก ์ถ์ถํ๋ ๊ฒ์ด ์ข์ง ์์ต๋๊น?
id = id.or_else_async(async || self.storage_coordinator.get_default_widget_async() await?.identity) await?;
๊ทธ๋ค์ดํ๋ ์ผ์ await
์ ๋ช
์ ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ์๊ฐ์ ์ผ๋ก ์ ํํ๊ฒ ์จ๊ธฐ๋ ๊ฒ์ด๋ฏ๋ก ๋ชจ๋ ์์ต๋ฅ ํฌ์ธํธ๋ฅผ ๋ช
ํํ๊ฒ ๋ณผ ์ ์์ต๋๋ค .
๊ธฐ๋ค๋ฆผ์ ์ค์ ๋งจ ๋์ผ๋ก ๋ฐ๋ฆฌ๊ณ ์ฐ๋ฆฌ์ ์ด์ ์ ์ฃผ๋ก ์ฒ์์ ์ง์ค๋ฉ๋๋ค (๊ฒ์ ์์ง์ ์ฌ์ฉํ ๋์ ๋น์ท ํจ).
์ฌ๋๋ค์ด 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์์๋ ๋ถ๊ฐ๋ฅํ ๊ณตํต ํํ์ ์ธ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ ์ธ์ด ๊ตฌ์กฐ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
await
-์๋ ๋ฐฉ์) :let result = api.method().[await returns_future()];
let cond = long.method().chain().[!is_empty()];
let val = something.[*returns_ref()];
// 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");
let sorted_vec = iter
.map(mapper)
.collect::<Vec<_>>()
.[sort(),];
consume(&HashMap::new(). [
insert("key1", val1),
insert("key2", val2),
]);
let sf = surface(). [
draw_circle(ci_dimens).draw_rectangle(rect_dimens).finish()?,
draw_something_custom().finish()?,
];
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๋ ๋ ๋ฒ์งธ ๋ฒ์ ์ด ๋ ๊นจ๋ํฉ๋๋ค. ํ์ ๊ตฌ๋ถ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ๊ธฐ์ํ ๋ ๊ฐ์ง ์์ ๋ ์์ต๋๋ค.
future
๋ถ๋ถ์ด ๊ธธ๋ฉด await { future }?
๊ฐ ์๋๋ฌ์ ๋ณด์ด์ง ์์ต๋๋ค. let req = await { self.request(URL, Method::GET, vec![("info".into(), id.into())]) }?;
await(future)
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ ์ ์์ต๋๋ค. Ok(await(req.json())?)
IMO๋ ๋ ๋ณํ ์ฌ์ด๋ฅผ ์ ํํจ์ผ๋ก์จ์ด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ์ด์ ๋ณด๋ค ํจ์ฌ ๋ซ์ต๋๋ค.
์ฒซ ๋ฒ์งธ ์๋ ํ์์ด ์๋ชป๋์์ต๋๋ค. ๋๋ rustfmt๊ฐ ๊ทธ๊ฒ์ ์ข์ํ๋ค๊ณ ์๊ฐํ์ง ์๋๋ค.
๊ทธ. rustfmt๋ฅผ ์คํํ๊ณ ์ฌ๊ธฐ์ ๋ค์ ๊ฒ์ ํด ์ฃผ์๊ฒ ์ต๋๊น?
@ivandardi @mehcode ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๊น? .await
๊ตฌ๋ฌธ ํ์์ ์ด๋ป๊ฒ ์ง์ ํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ฐฉ๊ธ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ต๋๋ค. ๊ฐ์ฌ!
์ด ์์ ๊ฐ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค.
client.get("https://my_api").send().await?.json().await?
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๋ ๋น๋๊ธฐ ๋ธ๋ก์ผ๋ก ๊ฐ๋จํ๊ฒ ๋์ฒด ๋ ์ ์์ต๋๋ค). ์ด๊ฒ์ ๋๊ธฐ ์ฝ๋์์ ๋ฐ๋ณต๊ธฐ ๊ฒฐํฉ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ๋ฏ๋ก ๋ฃจํ๋ณด๋ค ๋ ์ ์ ํ ์ํฉ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@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!
์ผ์ด๋ ์ผ์
๋๋ค.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?`์ฐ์ฐ์- 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)
}
์ด ์ ๋์ฌ๋ฅผ ์ ํธํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
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 ๋ฌผ๋ก ๋ง์ต๋๋ค : ๊ฒฐ๊ณผ์ ๊ฒฐ๊ณผ. ๋ด ๋๊ธ์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
์ค๋ ์ฐ๋ฆฌ๋
await!(future?)
์ future: Result<Future<Output=T>,E>
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
์ ๊ฐ์ ๊ธฐ์กด ์ ์ด ํ๋ฆ ์ฐ์ฐ์์ ์ผ์นํ๋ฉฐ ํ์ ๊ตฌ๋ถ ๊ธฐํธ๋ ํ์ํฉ๋๋ค.์:
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) --->>
๋๋์ด ์ค์ํ ์ฐจ์ด์ ์ ํ์ํ๋ ค๋ฉด ๋ฌด์์ด๋ ์ฌ์ฉํด์ผํฉ๋๋ค!
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ฌ์ฉ์์ ์ผ์ ์ ๋ฌด์ ์ฐจ์ด๊ฐ ์ค์ํ์ง ์ฌ๋ถ์ ๋๋ค!
์ ํ์ ์ธ ๋ น ์ฌ์ฉ์ ์ ์ผ์ ์ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ์ ๋ง
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 ์ฐ์ฐ์์ ์ต์ข ๊ตฌ๋ฌธ์ ๋ํด ์ธ์ด ํ๊ณผ ์ปค๋ฎค๋ํฐ์์ ํ ๋ก ์์ฝ์ ์์ฑํ๊ฒ ๋ค๊ณ ์ฝ์ํ์ต๋๋ค. ์ค๋ ๊ธฐ๋ค๋ฆผ์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค. ํ ๋ก ์ํ์ ๋ํ ๊ธ์ ์๋ ๋งํฌ๋์ด ์์ต๋๋ค. ํ์ง๋ง ๊ทธ ์ ์ ํ ๋ก ์ด ํ์ฌ ์งํ์ค์ธ ์์น์ ์ฌ๊ธฐ์๋ถํฐ ์งํ๋ ์์น์ ๋ํ ์ ๋ฐ์ดํธ๋ ์ ๊ณตํ๊ฒ ์ต๋๋ค.
๋จผ์ , 2019 ๋
7 ์ 4 ์ผ์ ๋ถ๊ธฐ๋๋ 1.37 ๋ฆด๋ฆฌ์ค์์ async-await๋ฅผ ์์ ํํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค . await!
๋งคํฌ๋ก๋ฅผ ์์ ํํ๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ ์ ์ ๊ตฌ๋ฌธ ์ง๋ฌธ์ ํด๊ฒฐํด์ผํฉ๋๋ค. ์ด ์์ ํ๋ ๋๋ก์ ๋์ด ์๋๋ผ ์์์ ์๋ฏธํฉ๋๋ค. ์ํํด์ผ ํ ๊ธฐ๋ฅ ์์
(์ : ํน์ฑ์ ๋น๋๊ธฐ fn)๊ณผ ๋จ์ํ ์์
(์ง์์ ์ธ ์ต์ ํ, ๋ฒ๊ทธ ์์ ๋ฑ)์ด ๋จ์ ์์ต๋๋ค. ๊ทธ๋๋ async / await ์์ ํ๋ ์ค์ํ ์ด์ ํ๊ฐ ๋ ๊ฒ์
๋๋ค!
๊ตฌ๋ฌธ์ ๊ดํ ํ ํด๊ฒฐ ๊ณํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
for
๋ฃจํ (์ : JavaScript์ for await
๋ฃจํ)๋ฅผ ์ฌ์ฉํ์ฌ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ๋ ๊ตฌ๋ฌธ์ ๋ํ ๋ช
๋ฐฑํ ํฅํ ํ์ฅ๊ณผ ํธํ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ์ด ๋ฌธ์ ์ ๋ํ ์ผ๋ จ์ ๊ฒ์๋ฌผ์ ์์ฑํ๋ ์ด์ ์
๋๋ค ( ์ฌ๊ธฐ์ ์ฒซ ๋ฒ์งธ ๊ฒ์๋ฌผ ๊ณผ ํฅํ ์ถ๊ฐ ์์ ).์ด ๋ฌธ์๋ ์ฌ๊ธฐ์์ ๋ณผ ์์๋ ๋ณด๊ด ์ฉ ์ข ์ด ๋ฌธ์ ์ ๋๋ค. ๋ณด์๋ค์ํผ, ์๋นํ ๊ธธ๊ณ ์๋ค๋ก ๋ง์ ๋ ผ๊ฑฐ๋ฅผ ์ ์ํฉ๋๋ค. ์ด์ ๋ํ ์๊ฒฌ์ ๋ณด๋ด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ์ด ๋ฌธ์ (์ด๋ฏธ 500 ๊ฐ ์ด์์ ์๊ฒฌ์ด ์์)๋ฅผ ๋ค์ ์ฌ๋ ๋์ ํด๋น ๋ชฉ์ ์ ์ํด ๋ด๋ถ ์ค๋ ๋๋ฅผ ๋ง๋ค์์ต๋๋ค .
์์ ๋งํ๋ฏ์ด ์ฐ๋ฆฌ๋ ๊ฐ๊น์ด ์์ผ ๋ด์ ์ต์ข ๊ฒฐ์ ์ ๋๋ฌ ํ ๊ณํ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ ํ ๋ก ์ด ๋์ฒด๋ก ์์ ๋ ์ํ์ ๋๋ฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ ๋ช ์ฃผ๊ฐ์ด ๊ตฌ๋ฌธ ํ ๋ก ์ "๋ง์ง๋ง ์ฃผ์ ๊ธฐ๊ฐ"์ด ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ํ์๊ฐ ๋๋ ํ์ด ๊ฒฐ์ ์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง ์ง์ ๋ํ ์์ธํ ์ผ์ ์ ๊ณต์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Async / await ๊ตฌ๋ฌธ์ ์๋ง๋ Rust๊ฐ 1.0 ์ดํ๋ก ์ป์ ๊ฐ์ฅ ๊ธฐ๋๋๋ ๊ธฐ๋ฅ ์ผ ๊ฒ์ ๋๋ค. ํนํ await ๊ตฌ๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๋ง์ ํผ๋๋ฐฑ์๋ฐ์ ๊ฒฐ์ ์ค ํ๋์์ต๋๋ค. ์ง๋ ๋ช ๋ฌ ๋์์ด ํ ๋ก ์ ์ฐธ์ฌํด ์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ด๊ฒ์ ๋ง์ ์ฌ๋๋ค์ด ๊ฐํ๊ฒ ๋ค๋ฅธ ๊ฐ์ ์ ๊ฐ์ง๊ณ ์๋ ์ ํ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๋ฌ๋ถ์ ํผ๋๋ฐฑ์ด ๋ฃ๊ณ ์์ผ๋ฉฐ ๋ง์ ์ ์คํ๊ณ ์ ์คํ ์ฌ์๋ฅผ ๊ฑฐ์ณ ์ต์ข ๊ฒฐ์ ์ ๋๋ฌ ํ ๊ฒ์์ ๋ชจ๋ ์ฌ๋์๊ฒ ํ์ ์ํค๊ณ ์ถ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค๋ฅธ ์ธ์ด๊ฐ await ๊ตฌ๋ฌธ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์ฑํ๋ ๊ฒ์ด ์ ์ฉ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
Kotlin
์จ
์ํ
์ค์นผ๋ผ
ํ์ด์ฌ
์๋ฐ ์คํฌ๋ฆฝํธ
C ++ (์ฝ ๋ฃจํด TR)
๋ง๊ตฌ ์๋ฅด๊ธฐ
๋คํธ
์ด ๋ชจ๋ ๊ฒ์ ๊ฐ์ง๊ณ Rust ํํ์์ด ์ฌ๋ฌ ๊ฐ์ ์ฐ๊ฒฐ ๋ฉ์๋๋ฅผ ์์ฑ ํ ์ ์์์ ๊ธฐ์ตํฉ์๋ค. ๋๋ถ๋ถ์ ์ธ์ด๋ ๊ทธ๋ ๊ฒํ์ง ์๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.