Rust 1.34 Programming Language Release

naganap release ng system programming language Kalawang 1.34, na binuo ng proyekto ng Mozilla. Nakatuon ang wika sa kaligtasan ng memorya, nagbibigay ng awtomatikong pamamahala ng memorya, at nagbibigay ng paraan upang makamit ang mataas na paralelismo sa gawain nang hindi gumagamit ng basurero o runtime.

Ang awtomatikong pamamahala ng memorya ng Rust ay nagpapalaya sa developer mula sa pagmamanipula ng pointer at pinoprotektahan laban sa mga problemang nagmumula sa mababang antas ng pagmamanipula ng memorya, tulad ng mga after-free na pag-access sa memorya, null pointer dereferences, buffer overruns, at iba pa. Ang isang manager ng package ay binuo upang ipamahagi ang mga aklatan, tiyakin ang pagpupulong at pamahalaan ang mga dependency ng proyekto. Karga, na nagbibigay-daan sa iyong makuha ang mga aklatan na kailangan para sa programa sa isang pag-click. Sinusuportahan ang isang repository upang mag-host ng mga aklatan crates.io.

Ang pangunahing mga inobasyon:

  • Ang tagapamahala ng pakete ng Cargo ay nagdagdag ng mga tool upang gumana sa mga alternatibong pagpaparehistro ng package na maaaring magkasama sa crates.io public registry. Halimbawa, ang mga developer ng mga proprietary application ay maaari na ngayong gumamit ng kanilang sariling pribadong registry, na magagamit kapag naglilista ng mga dependency sa Cargo.toml, at maglapat ng isang bersyon ng modelo na katulad ng crates.io para sa kanilang mga produkto, pati na rin mag-refer ng mga dependency sa parehong crates. io at sa iyong sariling pagpapatala.

    Upang magdagdag ng mga panlabas na rehistro sa .cargo/config (matatagpuan sa $HOME o sa direktoryo ng package)
    ibinigay seksyong β€œ[mga rehistro]”, at upang gumamit ng panlabas na pagpapatala, ang opsyong β€œpagpapatala” ay lumitaw sa paglalarawan ng bawat dependency sa Cargo.toml. Para kumonekta sa karagdagang registry, ilagay lang ang authentication token sa ~/.cargo/credentials file at patakbuhin ang command
    "cargo login --registry=my-registry" at para mag-publish ng package -
    "cargo publish -registry=my-registry";

  • Nagdagdag ng buong suporta para sa paggamit ng "?" operator. sa mga pagsubok mga doctest, na nagbibigay-daan sa iyong gumamit ng halimbawang code mula sa dokumentasyon bilang mga pagsubok. Dati operator
    "?" maaaring gamitin upang pangasiwaan ang mga error sa panahon ng pagsasagawa ng pagsubok lamang sa pagkakaroon ng function na β€œfn main()” o sa mga function na β€œ#[test]”;

  • Sa mga custom na attribute na tinukoy gamit ang procedural macros ibinigay ang kakayahang gumamit ng mga arbitrary na hanay ng mga token (β€œ#[attr($tokens)]”, β€œ#[attr[$tokens]] at #[attr{$tokens}]”). Dati, ang mga elemento ay maaari lamang tukuyin sa isang tree/recursive form gamit ang mga literal na string, halimbawa "#[foo(bar, baz(quux, foo = "bar"))]", ngunit ngayon ay posible nang gumamit ng mga enumerasyon (' #[range(0. .10)]') at mga construction tulad ng β€œ#[bound(T: MyTrait)]”;
  • Mga pinatatag na uri (trait) TryFrom ΠΈ TryInto, na nagpapahintulot sa mga uri ng conversion na may paghawak ng error. Halimbawa, ang mga pamamaraan tulad ng from_be_bytes na may mga uri ng integer ay gumagamit ng mga array bilang input, ngunit ang data ay kadalasang nanggagaling sa isang uri ng Slice, at ang pag-convert sa pagitan ng mga array at slice ay may problemang gawin nang manu-mano. Sa tulong ng mga bagong katangian, ang tinukoy na operasyon ay maaaring isagawa sa mabilisang paraan sa pamamagitan ng isang tawag sa .try_into(), halimbawa, β€œlet num = u32::from_be_bytes(slice.try_into()?)”. Para sa mga conversion na palaging nagtatagumpay (halimbawa, mula sa uri u8 hanggang u32), isang uri ng error ang naidagdag Hindi nagkakamali, na nagpapahintulot sa transparent na paggamit
    TryFrom para sa lahat ng umiiral na pagpapatupad ng "Mula";

  • Ang pag-andar ay hindi na ginagamit CommandExt::before_exec, na nagpapahintulot sa isang handler na maisakatuparan bago patakbuhin ang exec, na naisakatuparan sa konteksto ng isang proseso ng bata na na-forked pagkatapos ng fork() na tawag. Sa ilalim ng gayong mga kundisyon, maaaring madoble ang ilang mapagkukunan ng proseso ng magulang, tulad ng mga deskriptor ng file at mga nakamapang lugar ng memorya, na maaaring humantong sa hindi natukoy na pag-uugali at maling operasyon ng mga aklatan.
    Inirerekomenda na gumamit ng hindi ligtas na function sa halip na before_exec CommandExt::pre_exec.

  • Mga uri ng integer na atomic integer na pinatatag na nilagdaan at hindi pinirmahan na may sukat mula 8 hanggang 64 bits (halimbawa, AtomicU8), pati na rin ang mga naka-sign na uri NonZeroI[8|16|32|64|128].
  • Isang bagong bahagi ng API ang inilipat sa stable na kategorya, kabilang ang Any::type_id, Error::type_id, slice::sort_by_cached_key, str::escape_*, str::split_ascii_whitespace, Instant::checked_[add|sub ] at SystemTime na mga pamamaraan ay na-stabilize ::checked_[add|sub]. Ang iter::from_fn at iter::successors functions ay na-stabilize;
  • Para sa lahat ng uri ng integer, ang checked_pow, saturating_pow, wrapping_pow at overflowing_pow na pamamaraan ay ipinatupad;
  • Idinagdag ang kakayahang paganahin ang mga pag-optimize sa yugto ng pagli-link sa pamamagitan ng pagtukoy sa opsyon sa pagbuo ng "-C linker-plugin-lto".

Pinagmulan: opennet.ru

Magdagdag ng komento