Rust 1.96 منتشر شد؛ تایپهای Range تازه و assert_matches
خلاصهٔ کاملتر
تیم Rust نسخهی پایدار ۱.۹۶.۰ را منتشر کرد. بزرگترین تغییر، مجموعهی تازهای از تایپهای Range است. خیلیها انتظار دارن Range و تایپهای مرتبط Copy باشن، اما نبودن، چون مستقیماً Iterator را پیاده میکردن و پیادهسازی همزمان Iterator و Copy روی یک تایپ یک دام محسوب میشه. حالا طبق RFC3550، تایپهای جایگزین در core::range (مثل Range، RangeFrom و RangeInclusive) بهجای Iterator، IntoIterator را پیاده میکنن و در نتیجه میتونن Copy باشن. این یعنی میشه یک Range را داخل یک تایپ Copy ذخیره کرد:
use core::range::Range;
#[derive(Clone, Copy)]
pub struct Span(Range<usize>);افزودهی دوم، ماکروهای assert_matches! و debug_assert_matches! هستن که بررسی میکنن یک مقدار با یک الگو تطبیق داره و در غیر این صورت با نمایش Debug آن مقدار panic میکنن؛ یعنی نسبت به assert!(matches!(..)) خطایابی بهترن. اینها به prelude اضافه نشدن (تا با کریتهای ثالث همنام تداخل نکنن) و باید دستی از core یا std ایمپورت بشن:
use core::assert_matches;
assert_matches!(get_random_number(), 1..=6);تغییر مهم دیگه مربوط به WebAssembly است: تارگتهای WASM دیگه --allow-undefined را به لینکر نمیفرستن، پس نمادهای تعریفنشده حالا بهجای تبدیلشدن به import، خطای لینکر میدن تا باگها زودتر گرفته بشن (رفتار قبلی با یک RUSTFLAG قابلبازگرداندنه). این نسخه دو آسیبپذیری Cargo برای کاربران رجیستریهای ثالث را هم وصله میکنه؛ کاربران crates.io متأثر نیستن.
نکات کلیدی:
- تایپهای جدید Range در core::range که IntoIterator را پیاده میکنن و Copy میشن
- ماکروهای assert_matches! و debug_assert_matches! برای تطبیق مقدار با الگو
- تارگتهای WebAssembly دیگه --allow-undefined نمیفرستن (نماد تعریفنشده = خطای لینکر)
- وصلهی دو آسیبپذیری Cargo برای کاربران رجیستریهای ثالث