Rust 1.97.0 منتشر شد
۹ جولای ۲۰۲۶، تیم Rust نسخهی ۱.۹۷.۰ رو منتشر کرد. این نسخه تغییرات زبانی بزرگی نداره، ولی سه چیزی که اضافه شده از اون دسته چیزهاییه که وقتی باهاشون کار میکنی، خوشحال میشی که هستن.
برای آپدیت:
rustup update stable
Symbol mangling v0 حالا پیشفرضه
این یکی یه تغییر زیرپوستیه که بیشتر وقتها متوجهش نمیشی — تا وقتی که یه stack trace میگیری و یهو میبینی اسم functionها خوانا شدن.
وقتی Rust کد رو کامپایل میکنه، اسم هر item رو mangle میکنه تا با اسمهای مشابه در crateهای دیگه تداخل نداشته باشه. روش قدیمی از Itanium ABI که C++ هم ازش استفاده میکنه الهام گرفته بود — ولی مشکل داشت: generic parameterها فقط پشت یه hash پنهان میشدن، و بخشهایی از mangling از استاندارد Itanium منحرف شده بودن که همین باعث میشد demanglerهای خارجی درست کار نکنن.
روش جدید (v0) از Rust 1.59 بهعنوان opt-in موجود بود، از نوامبر ۲۰۲۵ روی nightly پیشفرض شده بود، و حالا توی ۱.۹۷ به stable رسیده. نتیجهی عملی: وقتی یه panic یا stack trace میبینی، اسم functionها همراه generic parameterهاشون نشون داده میشن، نه یه رشتهی hashشدهی نامفهوم.
روش قدیمی الان فقط روی nightly در دسترسه و برنامه اینه که در آینده کاملاً حذف بشه.
Cargo حالا warningها رو مدیریت میکنه
تا قبل از این، رایجترین راه برای deny کردن warningها در CI این بود:
RUSTFLAGS=-Dwarnings cargo build
مشکل این روش اینه که -Dwarnings رو به هر invocation از rustc پاس میده، و این build cache رو invalidate میکنه. یعنی هر بار که توی CI این flag رو داری، از کش استفاده نمیشه و همه چیز از صفر compile میشه.
از ۱.۹۷، Cargo خودش کنترل میکنه که warningها چطور با موفقیت build تعامل داشته باشن. یه env var جدید اضافه شده:
# در CI: deny کردن warningها
CARGO_BUILD_WARNINGS=deny cargo build
# موقع کار: خاموش کردن موقت warningها
CARGO_BUILD_WARNINGS=allow cargo check
# حالت پیشفرض: نمایش بدون fail کردن
CARGO_BUILD_WARNINGS=warn cargo build
مزیت مهم اینه که این متغیر build cache رو invalidate نمیکنه. یعنی میتونی توی CI deny داشته باشی و همچنان از کش استفاده کنی. میشه با --keep-going هم ترکیبش کرد تا بهجای توقف روی اولین خطا، همهی خطاها و warningها یکجا جمع بشن.
خروجی linker دیگه پنهان نمیشه
rustc وقتی کامپایل میکنه، یه linker رو از طرف کاربر صدا میزنه. تا الان اگه link موفق میشد، هر پیامی که linker داشت پنهان میشد. این رفتار گاهی مشکلساز بود چون warningهای واقعی linker — مثل deprecation warning برای یه optimization flag قدیمی — اصلاً دیده نمیشدن.
از ۱.۹۷، پیامهای linker بهصورت پیشفرض نمایش داده میشن:
warning: linker stderr: ignoring deprecated linker optimization setting '1'
|
= note: `#[warn(linker_messages)]` on by default
تیم Rust پیامهایی که false positive شناختهشده هستن رو فیلتر کرده تا نویز اضافه نداشته باشی. اگه یه پیام میبینی که فکر میکنی false positive هست، میتونی توی Cargo.toml آن را خاموش کنی:
[lints.rust]
linker_messages = "allow"
یه نکته مهم: این lint عمداً از گروه warnings جدا نگه داشته شده. یعنی CARGO_BUILD_WARNINGS=deny روی linker_messages تاثیر نمیذاره — چون خروجی linker از پلتفرمی به پلتفرم دیگه فرق میکنه و نمیشه بهطور قطعی همهشون رو deny کرد.
APIهای جدید stable شده
چند API مرتبط با bit manipulation اضافه شده که برای کدهای سطحپایین کاربردیه:
let x: u32 = 0b1010_1100;
// جدا کردن بیت بالایی
x.isolate_highest_one(); // => 0b1000_0000
// جدا کردن بیت پایینی
x.isolate_lowest_one(); // => 0b0000_0100
// مقدار بیت بالایی
x.highest_one(); // => 0b1000_0000
// مقدار بیت پایینی
x.lowest_one(); // => 0b0000_0100
// تعداد bitهای لازم برای نمایش مقدار
x.bit_width(); // => 8
همهی این methodها روی NonZero<T> هم در دسترسن. char::is_control هم حالا توی contextهای const کار میکنه.
یه تغییر کوچیک برای کاربران WebAssembly
اگه با WebAssembly کار میکنی، یه breaking change هست که از نسخهی ۱.۹۶ شروع شده: Rust دیگه بهطور پیشفرض --allow-undefined به linker پاس نمیده. یعنی symbolهای undefined الان linker error هستن، نه WebAssembly importهای ضمنی. اگه intentional بود، باید صریح تعریفش کنی:
#[link(wasm_import_module = "env")]
unsafe extern "C" {
fn my_extern_function();
}
این release از نظر حجم تغییرات زبانی یه نسخهی آروم بود، ولی هر سهی این تغییرها از اون دسته چیزهاییه که بعد از یه مدت کار کردن باهاشون، نفهمیدی چطور قبلاً بدونشون کار میکردی.
