ICP·Devآی‌سی‌پی‌·دِو
بازگشت به مقالات
راست۹ تیر ۱۴۰۵2 دقیقه مطالعه

فراتر از `assert!(matches!(...))`: نگاهی به انقلاب ماکروی پایدار شده `assert_matches!` در راست ۱.۹۶.۰

راست ۱.۹۶.۰ به طور رسمی ماکروهای بسیار منتظر `assert_matches!` و `debug_assert_matches!` را پایدار کرده و به یک دهه سردرگمی در تست‌نویسی پایان می‌دهد. بیاموزید که چگونه این به‌روزرسانی حیاتی، خطاهای نامفهوم CI و وابستگی‌های اضافی توسعه را حذف می‌کند.

نکات کلیدی

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

فراتر از assert!(matches!(...)): نگاهی به انقلاب ماکروی پایدار شده assert_matches! در راست ۱.۹۶.۰

هر توسعه‌دهنده راستی طعم تلخ شکست اجرای CI در اواخر شب را چشیده است. شما لاگ‌ها را باز می‌کنید و تنها با یک خطای عمومی مواجه می‌شوید:

text
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! ترکیب کنید. به سناریوی کلاسیک زیر نگاه کنید:

rust
#[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 برطرف می‌کند:

rust
use std::assert_matches::assert_matches;

let s = Status::Failed(404);
assert_matches!(s, Status::Ok);

هنگامی که این ارزیابی شکست می‌خورد، ماکرو عبارت ارزیابی‌شده را قالب‌بندی کرده و نمایش Debug آن را چاپ می‌کند:

text
panic: assertion `left matches right` failed
  left: Failed(404)
  right: Status::Ok

IMAGE_PROMPT: A detailed, high-quality technical graphic comparing two side-by-side terminal windows on a dark background. The left window shows a red, cryptic 'assertion failed: matches!' error. The right window shows a clean, green and white detailed Rust backtrace highlighting 'left matches right failed' with a clear comparison of the left and right values. Neon accents, professional UI style


تطبیق پیشرفته و گارد الگویی (Pattern Guards)

از آنجا که assert_matches! از موتور بومی تطبیق الگوی راست بهره می‌برد، از تمام طیف ویژگی‌های تطبیق الگو پشتیبانی می‌کند. شما می‌توانید متغیرها را به الگوهای منطبق‌شده متصل (bind) کنید و از گاردهای الگویی برای اعمال بررسی‌های شرطی روی داده‌های داخلی استفاده نمایید:

rust
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 خود را بررسی کرده، کریت‌های قدیمی را حذف کنید و از ارزیابی‌های الگوی بومی لذت ببرید!

برچسب‌ها

#راست ۱.۹۶#ماکروها#دیباگ#تست نرم‌افزار#متن باز

منابع و ارجاعات مستند

پیشنهاد مطالعه بعدی

خوشتان آمد؟ مقاله بعدی را بگیرید

در خبرنامه عضو شوید تا راهنمای بعدی در ایمیلتان باشد — بدون مزاحمت، لغو عضویت در هر زمان.