Rust 1.98 پیکربندیهای غیرصفر را به بررسی زمان کامپایل میسپارد
Rust 1.98 قابلیت پارسکردن ثابتمحور اعداد NonZero را پایدار میکند و راه امنتری برای اعتبارسنجی پیکربندیهای غیرصفر پیش از اجرا در اختیار توسعهدهندگان سیستم و پروتکل میگذارد.

Rust 1.98.0 که در ۲۰ اوت منتشر شد، یک قابلیت کوچک اما کاربردی را به کتابخانه استاندارد اضافه میکند: NonZero::<T>::from_str_radix برای انواع صحیح پشتیبانیشده اکنون پایدار و const است.
این متد یک رشته را در مبنای انتخابشده پارس میکند و Result<NonZero<T>, ParseIntError> برمیگرداند. برخلاف پارس معمولی اعداد صحیح، نتیجه موفق آن تضمین نوعی دارد که مقدار صفر نیست. به همین دلیل برای پیکربندیهایی مانند تعداد شاردها، اندازه صفحه، سقف تلاش مجدد، ظرفیت جدول و شناسههای پروتکل که ذاتاً نباید صفر باشند، مناسب است.
اهمیت اصلی تغییر، ویژگی const است. اکنون یک مقدار ثابت میتواند هنگام کامپایل پارس و بررسی شود:
use std::num::NonZeroU32;
const SHARD_COUNT: NonZeroU32 = match NonZeroU32::from_str_radix("16", 10) {
Ok(value) => value,
Err(_) => panic!("invalid non-zero shard count"),
};
به این ترتیب، یک دسته از خطاهای پیکربندی از زمان آغاز برنامه به زمان ساخت منتقل میشوند. اگر مقدار ثابت به "0" تبدیل شود، رقم نامعتبر داشته باشد یا در نوع صحیح هدف قابل نمایش نباشد، کامپایل میتواند همان محل تعریف ثابت شکست بخورد؛ نه اینکه برنامه بعداً مشکل را کشف کند.
برای ورودیهای زمان اجرا نیز همین API قابل استفاده است:
fn parse_limit(input: &str) -> Result<NonZeroU32, std::num::ParseIntError> {
NonZeroU32::from_str_radix(input, 10)
}
در کد Rust مربوط به ICP و دیگر پروتکلها، این مقدار در مرز ورودی مفید است: متن خارجی را یکبار پارس کنید، مقادیر نامعتبر یا صفر را رد کنید و بهجای نگهداشتن یک عدد صحیح معمولی همراه با فرضی تکرارشونده، NonZeroU32 را به لایههای داخلی برنامه منتقل کنید. البته این قابلیت جای بررسی محدودیتهای کسبوکار را نمیگیرد؛ یک حد غیرصفر همچنان میتواند بیش از اندازه بزرگ باشد.
جزئیات API از نظر ایمنی مهماند. from_str_radix فقط مبناهای ۲ تا ۳۶ را میپذیرد؛ مبنای خارج از این بازه باعث panic میشود. همچنین نویسههای غیررقمی ابتدایی یا انتهایی، از جمله فاصله، رد میشوند و زیرخطها نیز رد میشوند؛ حتی با اینکه زیرخط در literalهای عددی Rust مجاز است. اینها رفتارهای مستند API هستند، بنابراین فراخواننده باید پیش از انتخاب مبنا ورودی را نرمال یا اعتبارسنجی کند و نباید این متد را پارسرِ آسانگیر فرض کند.
درس گستردهتر Rust 1.98 این نیست که هر مقدار پیکربندی باید ثابت شود. نکته این است که یک ناوردای موجود—«این عدد نباید صفر باشد»—اکنون میتواند هنگام پارس زمان کامپایل نمایش داده شود، بدون نیاز به crate شخص ثالث. این بهبود از نظر ergonomics کوچک است، اما در کد پروتکل، همین ناورداهای کوچک اغلب از مقداردهی مبهم و خطاهای دیرهنگام جلوگیری میکنند.
خبرخوان را در ایمیل بگیرید
هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.


