Rust์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ ํฌ์ธํฐ ์กฐ์์ผ๋ก๋ถํฐ ํด๋ฐฉ๋๊ณ , After-Free ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค, ๋ ํฌ์ธํฐ ์ญ์ฐธ์กฐ, ๋ฒํผ ์ค๋ฒ๋ฐ ๋ฑ๊ณผ ๊ฐ์ ๋ฎ์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ์กฐ์์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๊ณ ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ณด์ฅํ๋ฉฐ ํ๋ก์ ํธ๋ณ ์ข
์์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํจํค์ง ๊ด๋ฆฌ์๊ฐ ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค.
์ฃผ์
-
์์ ๋ "async" ํจ์, async move { ... } ๋ธ๋ก ๋ฐ ".await" ์ฐ์ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์๋ก์ด ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ ๋ช ๋ น ํ๋ฆ์ ์ฐจ๋จํ์ง ์๋ ํธ๋ค๋ฌ๋ฅผ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ์ด์ ์ ์ ๊ณต๋ ๋น๋๊ธฐ I/O์ฉ API์ ๋นํด async/.await ๊ตฌ๋ฌธ์ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ฝ๊ธฐ ์ฌ์ฐ๋ฉฐ ๋ฃจํ, ์กฐ๊ฑด๋ฌธ ๋ฐ ์์ธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์น์ํ ํ๋ฆ ์ ์ด ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋น๋๊ธฐ ์ํธ ์์ฉ์ ๊ตฌํํ ์ ์์ต๋๋ค.Async-await ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์คํ์ ์ผ์ ์ค์งํ๊ณ ์ ์ด๊ถ์ ๋ฉ์ธ ์ค๋ ๋๋ก ๋ฐํํ ๋ค์ ์ค๋จ๋ ๋ถ๋ถ๋ถํฐ ์คํ์ ์ฌ๊ฐํ ์ ์๋ ํจ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด I/O๋ฅผ ์ฒ๋ฆฌํ ๋ ์ด๋ฌํ ์ผ์ ์ค์ง๊ฐ ํ์ํ๋ฉฐ, ๋ค์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ด ๋์ฐฉํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์์ต๋๋ค. "async fn" ๋ฐ "async move"๋ก ์ ์๋ ํจ์ ๋ฐ ๋ธ๋ก์ ํน์ฑ์ ๋ฐํํฉ๋๋ค.
๋ฏธ๋ , ์ง์ฐ๋ ๋น๋๊ธฐ ๊ณ์ฐ ํํ์ ์ ์ํฉ๋๋ค. ์ง์ฐ๋ ๊ณ์ฐ์ ์ง์ ์์ํ๊ณ ".await" ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. .await๊ฐ ํธ์ถ๋ ๋๊น์ง ์ด๋ค ์์ ๋ ์ํ๋๊ฑฐ๋ ์ฌ์ ๊ณํ๋์ง ์์ผ๋ฏ๋ก ์ถ๊ฐ ์ค๋ฒํค๋ ์์ด ๋ณต์กํ ์ค์ฒฉ ๊ตฌ์ฑ์ ์์ฑํ ์ ์์ต๋๋ค.๋น๋๊ธฐ fn first_function() -> u32 { .. }
...
future = first_function();
...
๊ฒฐ๊ณผ๋ฅผ ๋ณด์: u32 = future.await; -
์์ ๋ "#![feature(bind_by_move_pattern_guards)]", ๋ฐ์ธ๋ฉ ์ ํ์ ๋ณ์ ์ฌ์ฉ ํ์ฉ "์ด๋ "๋ฅผ ํ ํ๋ฆฟ์ ํฌํจํ๊ณ ํํ์์ "if" ์น์ ์์ ์ด๋ฌํ ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.์ผ์น ". ์๋ฅผ ๋ค์ด ์ด์ ๋ค์ ๊ตฌ์ฑ์ด ํ์ฉ๋ฉ๋๋ค.fn ๋ฉ์ธ() {
๋ฐฐ์ดํ์: Box<[u8; 4]> = Box::new([1, 2, 3, 4]);์ผ์น ๋ฐฐ์ด {
nums
if nums.iter().sum::() == 10=> {
๋๋กญ(์ซ์);
}
_ => ์ฐ๊ฒฐํ ์ ์์ต๋๋ค!(),
}
} - ํ์ ํ์ฉ
์์ฑ ํจ์ ๋งค๊ฐ๋ณ์, ํด๋ก์ , ํจ์ ํฌ์ธํฐ๋ฅผ ์ ์ํ ๋. Lint(ํ์ฉ, ๊ฒฝ๊ณ , ๊ฑฐ๋ถ ๋ฐ ๊ธ์ง)๋ฅผ ํตํด ์ง๋จ์ ์ ์ดํ๋ โโ์กฐ๊ฑด๋ถ ์ปดํ์ผ ์์ฑ(cfg, cfg_attr)๊ณผ ๋ณด์กฐ ๋งคํฌ๋ก ํธ์ถ ์์ฑ์ด ์ง์๋ฉ๋๋ค.fn ๋ (
#[cfg(windows)] Slice: &[u16], // Windows์์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
#[cfg(not(windows))] Slice: &[u8], // ๋ค๋ฅธ OS์์ ์ฌ์ฉ
) -> ์ฌ์ฉ {
์ฌ๋ผ์ด์ค.len()
} - NLL(Non-Lexical Lifetimes) ๊ธฐ๋ฒ์ ์ด์ฉํ ๋ณ์ ์ฐจ์ฉ(borrow checker) ๊ฒ์ฌ ์ ํ์ธ๋ ๋ฌธ์ ์ ์ ๋ํ ๊ฒฝ๊ณ ,
๋ฒ์ญ ์น๋ช ์ ์ธ ์ค๋ฅ์ ๋ฒ์ฃผ์ ์ํฉ๋๋ค. ๋น๋ฆฐ ๋ณ์์ ์๋ช ์ ๊ณ ๋ คํ๋ ์๋ก์ด ๋ฉ์ปค๋์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฒ์ฆ ์์คํ ์ ํตํด ์ด์ ๊ฒ์ฆ ์ฝ๋์์๋ ๋ฐ๊ฒฌํ ์ ์์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์๋ณํ ์ ์๊ฒ ๋์๋ค๋ ์ ์ ์๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฌํ ๊ฒ์ฌ์ ๋ํ ์ค๋ฅ ์ถ๋ ฅ์ ์ด์ ์ ์๋ํ๋ ์ฝ๋์์ ํธํ์ฑ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฏ๋ก ์ฒ์์๋ ์ค๋ฅ ๋์ ๊ฒฝ๊ณ ๊ฐ ๋ฐํ๋์์ต๋๋ค. ์ด์ Rust 2018 ๋ชจ๋์์ ์คํํ ๋ ๊ฒฝ๊ณ ๊ฐ ์ค๋ฅ๋ก ๋์ฒด๋์์ต๋๋ค. ๋ค์ ๋ฆด๋ฆฌ์ค์์๋ ์ค๋ฅ ์ถ๋ ฅ์ด Rust 2015 ๋ชจ๋์์๋ ๊ตฌํ๋์ด ๋ง์นจ๋ด ์ค๋๋ ๋น๋ฆผ ๊ฒ์ฌ๊ธฐ๊ฐ ์ ๊ฑฐ๋ ๊ฒ์ ๋๋ค. - ์์ ๋์ ๋ชจ๋ ์ปจํ
์คํธ์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ ๊ฒฐ์ ํ๋ "const" ์์ฑ์ Vec::new, String::new, LinkedList::new, str::len, [T]::len ํจ์์ ์ฌ์ฉ๋ฉ๋๋ค. , str::as_bytes,
ABS, Wrapping_abs ๋ฐ Overflowing_abs; - ์์ ํ๋ ๋ฉ์๋๋ฅผ ํฌํจํ์ฌ API์ ์๋ก์ด ๋ถ๋ถ์ด ์์ ์นดํ
๊ณ ๋ฆฌ๋ก ์ด์ ๋์์ต๋๋ค.
Pin::into_inner, Instant::checked_duration_since ๋ฐ Instant::saturating_duration_since; - ์ด์ ํ๋ฌผ ํจํค์ง ๊ด๋ฆฌ์๋ ๊ตฌ์ฑ ํ์ผ์ ".toml" ํ์ฅ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. Cargo์์ ์ง์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์๋น ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค. ๋
ผ์์ ์ฌ์ง๊ฐ ์๋ "--all" ํ๋๊ทธ๋ฅผ ๋์ฒดํ์ฌ "--workspace" ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ๋ฉํ๋ฐ์ดํฐ์ ์ ํ๋๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
๊ฒ์ "๋ฅผ ์ฌ์ฉํ๋ฉด git ํ๊ทธ์ ๋ฒ์ ๋ฒํธ๋ฅผ ์ง์ ํ์ฌ ์ข ์์ฑ์ ๊ฒ์ํ ์ ์์ต๋๋ค. ๋ค์ํ ์ปดํ์ผ ๋จ๊ณ์ ์คํ ์๊ฐ์ ๋ํ HTML ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ธฐ ์ํด ํ ์คํธ ์ต์ "-Ztimings"๋ฅผ ์ถ๊ฐํ์ต๋๋ค. - Rustc ์ปดํ์ผ๋ฌ์์ ์ง๋จ ๋ฉ์์ง์๋ ํฐ๋ฏธ๋์ ๋ง์ง ์๋ ์ฝ๋ ๊ผฌ๋ฆฌ๋ฅผ ์๋ฅด๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๋์ ํ๋ซํผ์ ๋ํ ์ธ ๋ฒ์งธ ์์ค์ ์ง์ ์ ๊ณต
i686-unknown-uefi ๋ฐ sparc64-unknown-openbsd. ์ธ ๋ฒ์งธ ์์ค์๋ ๊ธฐ๋ณธ ์ง์์ด ํฌํจ๋์ง๋ง ์๋ํ๋ ํ ์คํธ ๋ฐ ๊ณต์ ๋น๋ ๊ฒ์๋ ํฌํจ๋์ง ์์ต๋๋ค.
์ถ์ฒ : opennet.ru