Rust 1.40 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋ฆด๋ฆฌ์Šค

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

Rust์˜ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ํฌ์ธํ„ฐ ์กฐ์ž‘์œผ๋กœ๋ถ€ํ„ฐ ํ•ด๋ฐฉ๋˜๊ณ , After-Free ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค, ๋„ ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ, ๋ฒ„ํผ ์˜ค๋ฒ„๋Ÿฐ ๋“ฑ๊ณผ ๊ฐ™์€ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋ฉ”๋ชจ๋ฆฌ ์กฐ์ž‘์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๋ฉฐ ํ”„๋กœ์ ํŠธ๋ณ„ ์ข…์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๊ฐ€ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฑƒ์ง, ํ•œ ๋ฒˆ์˜ ํด๋ฆญ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์ €์žฅ์†Œ๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. crates.io.

์ฃผ์š” ํ˜์‹ :

  • ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐ(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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€