فراتر از `assert!(matches!(...))`: نگاهی به انقلاب ماکروی پایدار شده `assert_matches!` در راست ۱.۹۶.۰
راست ۱.۹۶.۰ به طور رسمی ماکروهای بسیار منتظر `assert_matches!` و `debug_assert_matches!` را پایدار کرده و به یک دهه سردرگمی در تستنویسی پایان میدهد. بیاموزید که چگونه این بهروزرسانی حیاتی، خطاهای نامفهوم CI و وابستگیهای اضافی توسعه را حذف میکند.
نکات کلیدی
- • راست ۱.۹۶.۰ به طور رسمی ماکروهای بسیار منتظر `assert_matches!` و `debug_assert_matches!` را پایدار کرده و به یک دهه سردرگمی در تستنویسی پایان میدهد
- • بیاموزید که چگونه این بهروزرسانی حیاتی، خطاهای نامفهوم CI و وابستگیهای اضافی توسعه را حذف میکند

فراتر از assert!(matches!(...)): نگاهی به انقلاب ماکروی پایدار شده assert_matches! در راست ۱.۹۶.۰
هر توسعهدهنده راستی طعم تلخ شکست اجرای CI در اواخر شب را چشیده است. شما لاگها را باز میکنید و تنها با یک خطای عمومی مواجه میشوید:
thread 'tests::test_status' panicked at 'assertion failed: matches!(s, Status::Ok)'
مقدار واقعی s چه بود؟ کامپایلر این را به شما نمیگوید. برای فهمیدن آن، یا باید تست را به صورت محلی با استفاده از ماکروی dbg! بازنویسی میکردید یا Cargo.toml خود را با کتابخانههای تست جانبی شلوغ میکردید.
با انتشار نسخه پایدار راست ۱.۹۶.۰، این سردرگمی ارگونومیک دیرینه رسماً به پایان رسیده است. پایدارسازی ماکروهای assert_matches! و debug_assert_matches!، قابلیت بومی و بسیار گویای تطبیق الگو (pattern-matching assertions) را مستقیماً به کتابخانه استاندارد اضافه میکند.
شکاف عیبیابی: قدیمی در برابر جدید
در گذشته، برای تایید اینکه یک enum با یک واریانت خاص مطابقت دارد، نیاز بود تا assert! را با ماکروی matches! ترکیب کنید. به سناریوی کلاسیک زیر نگاه کنید:
#[derive(Debug)]
enum Status {
Ok,
Pending,
Failed(u32),
}
let s = Status::Failed(404);
assert!(matches!(s, Status::Ok));
از آنجا که assert!(matches!(...)) تنها یک نتیجه بولین (boolean) را ارزیابی میکند، پیام پنیک (panic) کاملاً نامفهوم و فاقد اطلاعات مفید است.
راست ۱.۹۶.۰ این مشکل را با معرفی assert_matches! تحت core::assert_matches و std::assert_matches برطرف میکند:
use std::assert_matches::assert_matches;
let s = Status::Failed(404);
assert_matches!(s, Status::Ok);
هنگامی که این ارزیابی شکست میخورد، ماکرو عبارت ارزیابیشده را قالببندی کرده و نمایش Debug آن را چاپ میکند:
panic: assertion `left matches right` failed
left: Failed(404)
right: Status::Ok

تطبیق پیشرفته و گارد الگویی (Pattern Guards)
از آنجا که assert_matches! از موتور بومی تطبیق الگوی راست بهره میبرد، از تمام طیف ویژگیهای تطبیق الگو پشتیبانی میکند. شما میتوانید متغیرها را به الگوهای منطبقشده متصل (bind) کنید و از گاردهای الگویی برای اعمال بررسیهای شرطی روی دادههای داخلی استفاده نمایید:
use std::assert_matches::assert_matches;
let result: Result<u32, &str> = Ok(5);
// Asserts the result is Ok AND contains a value greater than 10
assert_matches!(result, Ok(x) if x > 10);
اگر این بررسی شکست بخورد، پیام خطا به شکلی یکپارچه ساختار نامنطبق را نمایش میدهد و شما را از نوشتن کدهای تکراری و طولانی بینیاز میکند.
چرا این ویژگی در Prelude نیست؟
شاید تعجب کنید که چرا باید به طور صریح بنویسید use std::assert_matches::assert_matches;.
تیم کامپایلر راست تصمیم گرفت که این ماکروها را در prelude استاندارد قرار ندهد. برای سالها، کریت جانبی assert_matches یک وابستگی بسیار پرکاربرد با دهها میلیون دانلود بوده است. افزودن این ماکرو به prelude میتوانست باعث تداخل نام گسترده در فضاهای نامی شده و پروژههای موجود را در سطح جهان با مشکل مواجه کند.
علاوه بر این، این نسخه همراه با debug_assert_matches! عرضه میشود که عملکردی کاملاً یکسان دارد اما در بیلدهای ریلیز (release) کامپایل نمیشود؛ این قابلیت برای بررسیهای امنیتی حیاتی که نباید بر کارایی محصول نهایی تاثیر بگذارند، فوقالعاده است. زمان آن فرا رسیده که dev-dependencies خود را بررسی کرده، کریتهای قدیمی را حذف کنید و از ارزیابیهای الگوی بومی لذت ببرید!
برچسبها
پیشنهاد مطالعه بعدی

حافظه غیرقابل حرکت: نگاهی عمیق به ارتقاهای انقلابی مقداردهی اولیه درجا و طرحریزی فیلد در راست

سیستمعامل خودارزیاب: درون امنیت جسورانه و اول-راست اوبونتو و انقلاب cargo-auditable

عصر بلوغ ۱.۰: چگونه Zed و Iroh زیرساختهای بومی Rust را بازتعریف میکنند
خوشتان آمد؟ مقاله بعدی را بگیرید
در خبرنامه عضو شوید تا راهنمای بعدی در ایمیلتان باشد — بدون مزاحمت، لغو عضویت در هر زمان.