Rust 1.51 Famoahana ny fiteny fandaharana

Navoaka ny famoahana ny fiteny fandaharana Rust 1.51, naorin'ny tetikasa Mozilla, saingy novolavolaina ankehitriny eo ambany fiahian'ny fikambanana tsy miankina Rust Foundation. Mifantoka amin'ny fiarovana ny fitadidiana ilay fiteny, manome fitantanana fitadidiana mandeha ho azy, ary manome fitaovana ahafahana manatratra ny parallèle amin'ny asa avo lenta nefa tsy mampiasa mpanangom-pako na fotoana fiasana (ahena ny fotoana fandehanana amin'ny fanombohana fototra sy fikojakojana ny tranomboky mahazatra).

Ny fitantanana fitadidiana mandeha ho azy an'i Rust dia manafoana ny lesoka rehefa manodinkodina ny tondro ary miaro amin'ny olana ateraky ny fanodikodinam-pahatsiarovana ambany, toy ny fidirana amin'ny faritra fitadidiana rehefa afaka izany, ny tsy fahampian'ny pointer tsy misy tondro, ny fihoaran'ny buffer, sns. Mba hizarana trano famakiam-boky, hiantohana ny fivoriambe ary hitantana ny fiankinan-doha, ny tetikasa dia mamolavola ny mpitantana fonosana Cargo. Ny tahiry crates.io dia tohanana amin'ny fampiantranoana tranomboky.

Fanavaozana lehibe:

  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, связанная с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ константных Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠ² (Β«const genericsΒ»), ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π° статус минимально ТизнСспособного ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° (MVP), Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ Π·Π΅Π»Ρ‘Π½Ρ‹ΠΉ свСт Π½Π° ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½Ρ‹Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠ±ΠΎΠ±Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ для постоянных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‚.Π΅. ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ±Ρ‰Ρ‘Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ постоянных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π° Π½Π΅ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ΠΈ Π½Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ. Указанная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами, ΠΈ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ создании Ρ‚ΠΈΠΏΠ°ΠΆΠ΅ΠΉ для массивов любого Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π±Π΅Π· нСобходимости создания ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° допустимых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ отсутствиС Π²Ρ‹Ρ…ΠΎΠ΄Π° Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°.

    Начиная с Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ выпуска, для массивов с Ρ‚ΠΈΠΏΠΎΠΌ Β«[T; N]Β» (Ρ‚ΠΈΠΏ T ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ N) прСдоставлСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ значСния с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Ρ†Π΅Π»Ρ‹ΠΌΠΈ, Π±ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ (Ρ‚ΠΈΠΏΡ‹ struct ΠΈ enum ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ). ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π½Ρ‹Π΅ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для использования массива, Π½Π΅ привязанного ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ: struct Array<T, const LENGTH: usize> { // ^^^^^^^^^^^^^^^^^^^ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ константного Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ° list: [T; LENGTH] // ^^^^^^ Π΅Π³ΠΎ использованиС }

    ΠŸΡ€ΠΈ фактичСском использовании c этим ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Β«Array<u8, 32>Β» компилятор сгСнСрируСт ΠΌΠΎΠ½ΠΎΠΌΠΎΡ€Ρ„Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Array: struct Array<u8, 32> { list: [u8; 32] }

  • Π‘Ρ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ основанный Π½Π° константных Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠ°Ρ… API std::array::IntoIter, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ для любого массива ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ: fn main() { let array = [1, 2, 3, 4, 5]; // РаньшС для ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ .iter() for item in array.iter().copied() { println!(Β«{}Β», item); } // Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ for item in std::array::IntoIter::new(array) { println!(Β«{}Β», item); } }
  • Π’ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π΅ cargo Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ поля resolver Π² Cargo.toml, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ опрСдСлитСля доступных возмоТностСй (feature resolver). Новая вСрсия опрСдСлитСля ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ‚ объСдинСния возмоТностСй зависимостСй, пСрСчисляСмых Π² сСкции Β«[features]Β», Ρ‚Π°ΠΌ, Π³Π΄Π΅ это нСумСстно, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ зависимости, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π² сборочных скриптах ΠΈ макросах, Π½ΠΎ ΠΏΡ€ΠΈ использовании нСстандартной возмоТности Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠΌ исполняСмом Ρ„Π°ΠΉΠ»Π΅.

    Π”ΠΎ сих ΠΏΠΎΡ€ возмоТности ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌΠΎΠ³ΠΎ нСсколько Ρ€Π°Π· Π² Π³Ρ€Π°Ρ„Π΅ зависимости, объСдинялись. НапримСр, Ссли ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ foo, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ возмоТности A ΠΈ B, ΠΈ этот ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… bar ΠΈ baz, ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ bar зависит ΠΎΡ‚ foo с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ A, Π° baz ΠΎΡ‚ foo с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ B, Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ cargo ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ эти возмоТности ΠΈ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ foo с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ возмоТностСй A ΠΈ B. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Π°Ρ ΠΈΠ·-Π·Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ зависимости ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ нСсовмСстимой с Ρ†Π΅Π»Π΅Π²ΠΎΠΉ систСмой, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ осущСствляСтся итоговая сборка. НапримСр, ΠΊΠΎΠ³Π΄Π° трСбуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ foo с Β«#![no_std]Β» Π² исполняСмом Ρ„Π°ΠΉΠ»Π΅, собираСмом с Β«#![no_std]Β», ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ foo с Β«stdΒ» Π²ΠΎ врСмя сборки Π² build.rs. ΠŸΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ resolver=Β»2β€³ Π² Cargo.toml ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ попытаСтся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚, раздСляя dev-, host- ΠΈ target-зависимости.

  • Π’ cargo Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° опция split-debuginfo, задаваСмая Π² сСкции Β«[profile]Β» ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π»Π°Π³ Β«-Csplit-debuginfo=unpackedΒ» Π² rustc, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° сохранСния ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ нСобходимости Π²Ρ‹Π·ΠΎΠ²Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ dsymutil ΠΈ сущСствСнно ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ процСсс сборки с ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ Π² macOS.
  • Π‘Ρ‚Π°Π±ΠΈΠ»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ макосы Β«ptr::addr_of!Β» ΠΈ Β«ptr::addr_of_mut!Β», ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ raw-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ для Π½Π΅Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ. use std::ptr; #[repr(packed)] struct Packed { f1: u8, f2: u16, } let packed = Packed { f1: 1, f2: 2 }; // &packed.f2 создаст Π½Π΅Π²Ρ‹Ρ€ΠΎΠ²Π½Π΅Π½Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, приводящий ΠΊ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌΡƒ повСдСнию let raw_f2 = ptr::addr_of!(packed.f2); assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
  • Ny ampahany vaovao amin'ny API dia nafindra ho amin'ny sokajy stable, anisan'izany ireto fomba manaraka ireto:
    • Arc::decrement_strong_count
    • Arc::increment_strong_count
    • Once::call_once_force
    • Peekable::next_if_eq
    • Peekable::next_if
    • Seek::stream_position
    • array::IntoIter
    • panic::panic_any
    • ptr::addr_of!
    • ptr::addr_of_mut!
    • slice::fill_with
    • slice::split_inclusive_mut
    • slice::split_inclusive
    • slice::strip_prefix
    • slice::strip_suffix
    • str::split_inclusive
    • sync::OnceState
    • task::Wake
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ для ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ i386-unknown-linux-gnu, i486-unknown-linux-gnu, aarch64_be-unknown-linux-gnu, aarch64-unknown-linux-gnu_ilp32 ΠΈ aarch64_be-unknown-linux-gnu_ilp32. Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ, Π½ΠΎ Π±Π΅Π· Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ тСстирования, ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сборок ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ возмоТности сборки ΠΊΠΎΠ΄Π°.

Source: opennet.ru

Add a comment