Выпуск мовы праграмавання Rust 1.42

Апублікаваны рэліз мовы сістэмнага праграмавання Іржа 1.42, заснаванага праектам Mozilla. Мова сфакусаваная на бяспечнай працы з памяццю, забяспечвае аўтаматычнае кіраванне памяццю і дае сродкі для дасягнення высокага паралелізму выканання заданняў, пры гэтым абыходзячыся без выкарыстання зборшчыка смецця і час выканання.

Аўтаматычнае кіраванне памяццю ў Rust пазбаўляе распрацоўніка ад маніпулявання паказальнікамі і абараняе ад праблем, якія ўзнікаюць з-за нізкаўзроўневай працы з памяццю, такіх як зварот да вобласці памяці пасля яе вызвалення, разнайменаванне нулявых паказальнікаў, вынахад за межы буфера і да т.п. Для распаўсюджвання бібліятэк, забеспячэння зборкі і кіравання залежнасцямі праектам развіваецца пакетны менеджэр грузавы, які дазваляе атрымаць патрэбныя для праграмы бібліятэкі ў адзін клік. Для размяшчэння бібліятэк падтрымліваецца рэпазітар crates.io.

Асноўныя навіны:

  • Дададзена падтрымка шаблонаў для супастаўлення элементаў зрэзаў (дынамічных масіваў, slice). Калі раней дапушчаліся дакладныя супастаўленні, то зараз дададзеная магчымасць выкарыстання канструкцый з пазнакай ".." для ахопу пакінутых элементаў масіва. Напрыклад:

    fn foo(words: &[&str]) {
    match words {

    // правярае пачатковыя элементы масіва з ігнараваннем
    наступных за імі элементаў
    ["Hello", "World", "!", ..] => println!("Hello World!"),

    // правярае першыя два элементы "Foo" і "Bar", а астатняе не важна
    ["Foo", "Bar", ..] => println!("Baz"),

    // ігнаруем усё, але апошні элемент павінен быць «!».
    [.., «!»] => println!(«!!!»),

    // у зрэз start уключаем усё, акрамя апошняга элемента, які павінен быць «z»
    [start @.., "z"] => println!("starts with: {:?}", start),

    // у зрэз end змяшчаем усё, акрамя першага элемента, які павінен быць "a".
    [«a», end @ ..] => println!(«ends with: {:?}», end),

    rest => println!(«{:?}», rest),
    }
    }

  • Дададзены новы макрас "matches!", які прымае на ўваходзе выраз і шаблон, а вяртае "true", калі шаблон адпавядае выразу. У шаблоне магчыма выкарыстанне аперацый "|" і "if".

    match self.partial_cmp(other) {
    Some(Less) => true,
    _ => ілжыва,
    }

    matches!(self.partial_cmp(other), Some(Less))

    let foo = 'f';
    assert!(matches!(foo, 'A'..='Z' | 'a'..='z'));

    let bar = Some(4);
    assert!(matches!(bar, Some(x) if x > 2));

  • У panic-паведамленнях, якія выводзяцца пры некарэктным выкарыстанні
    тыпаў Option і Result, зараз адлюстроўваюцца нумары радкоў са спасылкай на код, які ажыццявіў праблемны выклік, а не спасылкі на код рэалізацыі выкліку ў libcore. Напрыклад, змена закранае выклік unwrap і expect над Option::None ці збоі пры выкарыстанні unwrap_err, expect, expect_err і падобных метадаў для тыпу Result.

  • У пакетным мэнэджары Cargo забяспечана аўтаматычная падстаноўка "proc_macro crate" у блок "extern" для пакетаў з працэдурнымі макрасамі. Дадзеная змена дазваляе ўжываць дырэктыву "use" да працэдурных макрасаў без неабходнасці ўказання ў кодзе "extern crate proc_macro;". Напрыклад, калі ў праграме выкарыстоўваецца радок "use proc_macro::TokenStream;", то код зараз застанецца працоўным, калі з яго выдаліць "extern crate proc_macro;".
  • Пашыраны магчымасці стандартнай бібліятэкі. У iter::Empty дададзена падтрымка Send і Sync для любых значэнняў T.
    Выклікі Pin::{map_unchecked, map_unchecked_mut} пазбаўлены ад неабходнасці вяртаць значэнне тыпу для рэалізацыі "Sized".
    У io::Cursor рэалізаваны PartialEq і Eq. Прыкмета "const", які вызначае магчымасць выкарыстання ў любым кантэксце замест канстант, ужыты для метаду Layout::new.

  • У разрад стабільных пераведзена новая порцыя API, у тым ліку стабілізаваны CondVar::wait_while, CondVar::wait_timeout_while,
    DebugMap::key, DebugMap::value,
    ManuallyDrop::take,
    ptr::slice_from_raw_parts_mut і ptr::slice_from_raw_parts.

  • Абвешчаны састарэлым метад Error::description.
  • Забяспечаны ў другі ўзровень падтрымай для платформаў armv7a-none-eabi і riscv64gc-unknown-linux-gnu. Забяспечана падтрымка стандартнай бібліятэкі для платформы riscv64gc-unknown-linux-gnu.
    32-разрадныя платформы Apple паніжаны да трэцяга ўзроўню падтрымкі, які мае на ўвазе базавую падтрымку, але без аўтаматызаванага тэсціравання і публікацыі афіцыйных зборак. Паніжэнне ўзроўню падтрымкі абумоўлена спыненнем суправаджэння кампаніяй Apple 32-разрадных платформаў.

Крыніца: opennet.ru

Дадаць каментар