Rust์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ ํฌ์ธํฐ ์กฐ์์ผ๋ก๋ถํฐ ํด๋ฐฉ๋๊ณ , After-Free ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค, ๋ ํฌ์ธํฐ ์ญ์ฐธ์กฐ, ๋ฒํผ ์ค๋ฒ๋ฐ ๋ฑ๊ณผ ๊ฐ์ ๋ฎ์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ์กฐ์์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฌธ์ ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๊ณ ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ณด์ฅํ๋ฉฐ ํ๋ก์ ํธ๋ณ ์ข
์์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํจํค์ง ๊ด๋ฆฌ์๊ฐ ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค.
์ฃผ์
- ์์ฑ์ ์ฌ์ฉํ์ฌ ๊ตฌ์กฐ(struct) ๋ฐ ์ด๊ฑฐํ(Variant ๋ธ๋ก์ด ์๋ ์ด๊ฑฐํ)์ ํ์ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค.
#[์์ ํ์ง ์์ ]", ์ด๋๊ทธ๊ฒ์ ์ ์์ต๋๋ค ์์ผ๋ก๋ ์ ์ธ๋ ๊ตฌ์กฐ์ ์ด๊ฑฐํ์ ์ ํ๋์ ์ต์ ์ ์ถ๊ฐํ์ธ์. ์๋ฅผ ๋ค์ด, ๊ณต๊ฐ์ ์ผ๋ก ์ ์ธ๋ ํ๋๊ฐ ์๋ ๊ตฌ์กฐ๊ฐ ์๋ ๋ชจ๋ ๊ฐ๋ฐ์๋ "#[non_exhaustive]"๋ฅผ ์ฌ์ฉํ์ฌ ํฅํ ์ ํ๋๊ฐ ์ถ๊ฐ๋ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ์ง๊ธ๊น์ง ์ด ์ํฉ์์ ๊ฐ๋ฐ์๋ ํ๋๋ฅผ ๋น๊ณต๊ฐ๋ก ์ ์ธํ๋ ๊ฒ๊ณผ ๋ณ๊ฒฝํ ์ ์๋ ํ๋ ๋ชฉ๋ก์ ๋ฐ์ธ๋ฉํ๋ ๊ฒ ์ค์์ ์ ํํด์ผ ํ์ต๋๋ค. ์๋ก์ด ์์ฑ์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ ํ์ด ์ ๊ฑฐ๋๊ณ ์ด์ ์ ์ปดํ์ผ๋ ์ธ๋ถ ์ฝ๋๊ฐ ์์๋ ์ํ ์์ด ๋์ค์ ์ ํ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ํฌ๋ ์ดํธ ํจํค์ง์์ "์ผ์น" ์น์ ์ ์ต์ ์ ์ผ์น์ํฌ ๋ ๊ฐ๋ฅํ ๋ฏธ๋ ํ๋๋ฅผ ํฌํจํ๋ ๋ง์คํฌ "_ => {...}"์ ๋ช ์์ ์ธ ์ ์๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ํ๋๋ฅผ ์ถ๊ฐํ ๋ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค. -
์ถ๊ฐ๋จ ์ ํ ์ปจํ ์คํธ์์ ์ ์ฐจ์ ๋งคํฌ๋ก mac!()์ ํธ์ถํ๋ ๊ธฐ๋ฅ. ์๋ฅผ ๋ค์ด ์ด์ "expand_to_type"์ด ์ ์ฐจ์ ๋งคํฌ๋ก์ธ ๊ฒฝ์ฐ "type Foo = Expand_to_type!(bar);"๋ผ๊ณ ์ธ ์ ์์ต๋๋ค. - "์ธ๋ถ { ... }" ๋ธ๋ก์์
์ถ๊ฐ ์๋ฅผ ๋ค์ด "bang!()" ๋งคํฌ๋ก๋ฅผ ํฌํจํ ์ ์ฐจ์ ๋ฐ ์์ฑ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ:๋งคํฌ๋ก ๊ท์น! make_item { ($name:ident) => { fn $name(); } }
์ธ๋ถ {
make_item!(์ํ);
make_item!(๋ฒ ํ);
}์ธ๋ถ "C" {
#[my_identity_macro] fn foo();
} - ๋งคํฌ๋ก์์
๊ตฌํ "macro_rules!" ์์๋ฅผ ์์ฑํ๋ ๋ฅ๋ ฅ. "macro_rules!" ์์ฑ ์ค ํจ์ํ ๋งคํฌ๋ก(โmac!()โ)์ ์์ฑ ํํ์ ๋งคํฌ๋ก(โ#[mac]โ) ๋ชจ๋์์ ๊ฐ๋ฅํฉ๋๋ค. - $m:meta ๋งคํ ์์์์
์ถ๊ฐ ์์์ ํ ํฐ ์ด๊ฑฐ ๊ฐ โโ(โ[TOKEN_STREAM]โ, โ{TOKEN_STREAM}โ ๋ฐ โ(TOKEN_STREAM)โ) ์ง์, ์:๋งคํฌ๋ก ๊ท์น! accept_meta { ($m:meta) => {} }
accept_meta!( my::path );
accept_meta!( my::path = "lit" );
accept_meta!( my::path ( abc ) );
accept_meta!( my::path [ abc ] );
accept_meta!( my::path { abc } ); - Rust 2015 ๋ชจ๋์์๋ NLL(Non-Lexical Lifetimes) ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋ณ์ ์ฐจ์ฉ(borrow checker)์ ํ์ธํ ๋ ์๋ณ๋ ๋ฌธ์ ์ ๋ํด ์ค๋ฅ ์ถ๋ ฅ์ด ํ์ฑํ๋ฉ๋๋ค. ์ด์ ์๋ Rust 2018 ๋ชจ๋์์ ์คํํ ๋ ๊ฒฝ๊ณ ๊ฐ ์ค๋ฅ๋ก ๋์ฒด๋์์ต๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ด Rust 2015 ๋ชจ๋๋ก ํ์ฅ๋ ํ ๊ฐ๋ฐ์๋ ๋ง์นจ๋ดํ์ถ ์ค๋๋ ์ฐจ์ฉ ๊ฒ์ฌ๊ธฐ์์.๋น๋ฆฐ ๋ณ์์ ์๋ช ์ ๊ณ ๋ คํ๋ ์๋ก์ด ๋ฉ์ปค๋์ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํ ๊ฒ์ฆ ์์คํ ์ ํตํด ์ด์ ๊ฒ์ฆ ์ฝ๋์์๋ ๋ฐ๊ฒฌํ ์ ์์๋ ์ผ๋ถ ๋ฌธ์ ๋ฅผ ์๋ณํ ์ ์๊ฒ ๋์๋ค๋ ์ ์ ์๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฌํ ๊ฒ์ฌ์ ๋ํ ์ค๋ฅ ์ถ๋ ฅ์ ์ด์ ์ ์๋ํ๋ ์ฝ๋์์ ํธํ์ฑ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฏ๋ก ์ฒ์์๋ ์ค๋ฅ ๋์ ๊ฒฝ๊ณ ๊ฐ ๋ฐํ๋์์ต๋๋ค.
- ์์ ๋์ ๋ชจ๋ ์ปจํ ์คํธ์์ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ ๊ฒฐ์ ํ๋ "const" ์์ฑ์ is_power_of_two ํจ์(๋ถํธ ์๋ ์ ์์ ๊ฒฝ์ฐ)์ ์ฌ์ฉ๋ฉ๋๋ค.
- todo!() ๋งคํฌ๋ก์ Slice::repeat, mem::take, BTreeMap::get_key_value, HashMap::get_key_value ๋ฉ์๋๋ฅผ ํฌํจํ์ฌ API์ ์๋ก์ด ๋ถ๋ถ์ด stable ๋ฒ์ฃผ๋ก ์ด๋๋์์ต๋๋ค.
์ต์ ::as_deref, ์ต์ ::as_deref_mut, ์ต์ ::platten, UdpSocket::peer_addr, {f32,f64}::to_be_bytes, {f32,f64}::to_le_bytes,{f32,f64}::to_ne_bytes, {f32, f64}::from_be_bytes, {f32,f64}::from_le_bytes ๋ฐ {f32,f64}::from_ne_bytes. - ํจํค์ง ๊ด๋ฆฌ์ ํ๋ฌผ์์
๊ตฌํ ๋์คํฌ์ ์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ ๋ฅผ ์บ์ฑํฉ๋๋ค. "ํ๋ฌผ ๋ฉํ๋ฐ์ดํฐ" ๋ช ๋ น์ "ํ๋ฌผ ๋ฉํ๋ฐ์ดํฐ" ์ต์ ์ ์ถ๊ฐํ์ต๋๋ค.--ํํฐ ํ๋ซํผ "๋ฅผ ์ ํํ๋ฉด ์ข ์์ฑ ํด๊ฒฐ ์ด์ ์ง์ ๋ ๋์ ํ๋ซํผ์ ๋ฐ์ธ๋ฉ๋ ํจํค์ง๋ง ํ์๋ฉ๋๋ค. ์ ํจํ TLS ๋ฒ์ ์ ์ ์ํ๊ธฐ ์ํด http.ssl-version ๊ตฌ์ฑ ์ต์ ์ด ์ถ๊ฐ๋์์ต๋๋ค.
"์น์ ์ ๊ฒ์ํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค.๊ฐ๋ฐ ์ข ์์ฑ ""version" ํค๋ฅผ ์ง์ ํ์ง ์๊ณ . - Rustc ์ปดํ์ผ๋ฌ๋ ๋์ ํ๋ซํผ Thumbv7neon-unknown-linux-musleabihf, aarch64-unknown-none-softfloat, mips64-unknown-linux-muslabi64 ๋ฐ mips64el-unknown-linux-muslabi64์ ๋ํ ์ธ ๋ฒ์งธ ์์ค ์ง์์ ์ ๊ณตํฉ๋๋ค. ์ธ ๋ฒ์งธ ์์ค์๋ ๊ธฐ๋ณธ ์ง์์ด ํฌํจ๋์ง๋ง ์๋ํ๋ ํ ์คํธ ๋ฐ ๊ณต์ ๋น๋ ๊ฒ์๋ ํฌํจ๋์ง ์์ต๋๋ค.
์ถ์ฒ : opennet.ru