Rust 1.96.0 जारी
(blog.rust-lang.org)- Rust 1.96.0 को
rustup update stableसे इंस्टॉल किया जा सकता है, और आने वाले releases के verification में beta/nightly चैनल पर भाग लिया जा सकता है - नए
core::range::Range*typesIteratorकी जगह IntoIterator implement करते हैं, इसलिएCopyimplementation संभव है, और आगे चलकर यही range syntax के default type बनेंगे - assert_matches! और
debug_assert_matches!pattern mismatch होने पर value काDebugrepresentation भी दिखाते हैं, जिससे test failure का diagnosis आसान होता है - WebAssembly targets अब default रूप से
--allow-undefinedpass नहीं करते, इसलिए undefined symbols अब import बनने के बजाय linker error बनते हैं - Cargo में third-party registry users के लिए CVE-2026-5223 और
CVE-2026-5222fixes शामिल हैं, जबकि crates.io users प्रभावित नहीं होते
Rust 1.96.0 के मुख्य बदलाव
-
अपडेट और टेस्ट चैनल
- जिन users ने मौजूदा Rust को
rustupसे इंस्टॉल किया है, वेrustup update stableसे Rust 1.96.0 प्राप्त कर सकते हैं - अगर
rustupनहीं है, तो Rust वेबसाइट केrustupinstall page से इसे इंस्टॉल किया जा सकता है, और1.96.0की detailed release notes भी उपलब्ध हैं - आने वाले releases के verification में भाग लेने के लिए
rustup default betaयाrustup default nightlyके जरिए beta/nightly channels का उपयोग किया जा सकता है, और bugs को Rust issue tracker में report किया जा सकता है
- जिन users ने मौजूदा Rust को
-
नए
Range*types- मौजूदा
Rangeऔर संबंधितcore::opstypes से कई usersCopyकी अपेक्षा करते हैं, लेकिन ये सीधेIteratorimplement करते हैं, इसलिए इन्होंनेCopyसाथ में implement नहीं किया था - एक ही type पर
IteratorऔरCopyदोनों implement करना Clippy के अनुसार एक footgun है, इसलिए इससे बचा जा रहा था - RFC3550 ने
Iteratorकी जगहIntoIteratorimplement करने वाले वैकल्पिक range types का प्रस्ताव दिया, और इस संरचना में ये typesCopyभी implement कर सकते हैं - standard library में
core::range::Range,core::range::RangeFrom,core::range::RangeInclusiveऔर उनसे जुड़े iterators stabilize किए गए हैं - निकट भविष्य के Rust versions में
core::opsसे re-export होने वालेcore::range::RangeFullऔरcore::range::RangeTo, और मौजूदा range types के नए स्थानcore::range::legacy::*भी जोड़े जाएंगे 0..1जैसे range syntax अभी legacy types बनाते हैं, लेकिन भविष्य के editions में यहcore::rangetypes में बदल जाएगा- इस नए stabilization के बाद
startऔरendको अलग किए बिना slice accessors कोCopytype में store किया जा सकता है - उदाहरण:
use core::range::Range; #[derive(Clone, Copy)] pub struct Span(Range<usize>); impl Span { pub fn of(self, s: &str) -> &str { &s[self.0] } } - नया
RangeInclusivefields को public रखता है, और legacy version की तरह exhausted iterator state को expose होने से बचाने की जरूरत नहीं है - नए types में iteration शुरू करने से पहले conversion करना पड़ता है, इसलिए public fields कोई समस्या नहीं हैं
- library authors को public API में legacy और नए दोनों range types स्वीकार करने के लिए
impl RangeBoundsउपयोग करने पर विचार करना चाहिए - अगर concrete type की जरूरत हो, तो भविष्य में default बनने वाले नए range types को प्राथमिकता देना सुझाया गया है
- मौजूदा
-
pattern matching assertion macros
- नए macros
assert_matches!औरdebug_assert_matches!जांचते हैं कि value दिए गए pattern से मेल खाती है या नहीं, और मेल न खाने पर उस value केDebugrepresentation के साथ panic करते हैं - ये दोनों macros मूलतः
assert!(matches!(..))औरdebug_assert!(matches!(..))जैसे ही हैं, लेकिन failure पर दिखाई जाने वाली value की वजह से diagnosability बेहतर हो जाती है - यही नाम देने वाले लोकप्रिय third-party crates के साथ टकराव हो सकता था, इसलिए इन्हें standard prelude में नहीं जोड़ा गया
- उपयोग से पहले इन्हें
coreयाstdसे सीधे import करना होगा - उदाहरण:
use core::assert_matches; /// [Random Number](https://xkcd.com/221/) fn get_random_number() -> u32 { // chosen by a fair dice roll. // guaranteed to be random. 4 } fn main() { assert_matches!(get_random_number(), 1..=6); }
- नए macros
-
WebAssembly target में बदलाव
- WebAssembly targets अब linker को
--allow-undefinedpass नहीं करते - link के समय undefined symbols अब
"env"module के WebAssembly import में convert नहीं होते, बल्कि linker error बनते हैं - अगर link से जुड़े symbols सभी define नहीं हैं, तो module link नहीं होगा, जिससे bugs जल्दी पकड़े जा सकते हैं और symbol names जैसी चीजों से होने वाली आकस्मिक समस्याएं रोकी जा सकती हैं
- undefined link-related symbols आमतौर पर build-time bug या configuration error को दर्शाते हैं
- अगर पुराना behavior जानबूझकर उपयोग किया जा रहा था, तो
RUSTFLAGS=-Clink-arg=--allow-undefinedसे उसे वापस लाया जा सकता है, या source code में symbol define करने वाले block पर#[link(wasm_import_module = "env")]इस्तेमाल किया जा सकता है - यह बदलाव पिछली blog announcement के बाद Rust 1.96 में लागू किया गया
- WebAssembly targets अब linker को
stabilize किए गए API और security fixes
-
stabilize किए गए API
-
Cargo के लिए 2 security advisories
- Rust 1.96 में third-party registry users के लिए Cargo की 2 vulnerabilities के fixes शामिल हैं
- CVE-2026-5223 symbolic link वाले crate tarball extraction से जुड़ी मध्यम गंभीरता की vulnerability है
- CVE-2026-5222 normalized URL के जरिए authentication से जुड़ी कम गंभीरता की vulnerability है
- crates.io users इन दोनों vulnerabilities से प्रभावित नहीं होते
-
अतिरिक्त बदलाव
1 टिप्पणियां
Lobste.rs की राय
assert_matchesको बार-बार चाहने लगता हूँ, लेकिन हर बार यह सोचना पड़ता है कि नया crate जोड़ूँ या इसे खुद फिर से implement करूँइसलिए इसका standard library में आना स्वागतयोग्य है
ranges को
Copytype बनाने की दिशा मुझे पसंद आईकभी-कभी range को clone करना पड़ता है, यह देखकर मैं चौंका हूँ, और यह उस intuition से भी बेहतर मेल खाता है कि
12..34छोटा और copyable data होना चाहिएहालाँकि, अगर एक ही नाम वाले कई types हो गए, तो थोड़ी चिंता है कि अगली बार VS Code
usedeclaration अपने-आप जोड़ते समय कहीं गलत type न import कर देज़्यादातर users के लिए नए types का फ़ायदा छोटा है, इसलिए वे बस मौजूदा types का इस्तेमाल जारी रख सकते हैं, और अगली edition boundary पर नए types अपने-आप इस्तेमाल होने लगेंगे
लगता है कि types को import मुख्य रूप से वे library authors करेंगे जो दोनों versions को explicitly support करना चाहते हैं
prelude को बदला जा सकता है बिना मौजूदा projects को तोड़े