نمایش حجم اطلاعات در زبان rust در حالت debug

25 شهریور 1405 rust راست #debug

یکی از چیزایی که تو زبان برنامه‌نویسی Rust حسابی اعصابت رو خرد می‌کنه اینه که یهو تو دیباگ با یه دیوار از عدد باینری روبه‌رو می‌شی و با خودت می‌گی «لعنتی من این همه بایت رو می‌خوام چیکار کنم؟؟»

این مشکل تو زبان Rust خیلی گل درشت‌تره! چون این زبان ذاتاً با داده‌های سطح پایین و باینری سر و کار داره. وقتی یه Vec<u8>  بزرگ، فایل، یا ساختار پیچیده داشته باشی، Debug پیش‌فرض همه‌ چیز رو کامل چاپ می‌کنه و خروجی تبدیل می‌شه به یه لیست بی‌پایان از عدد که مفت گرونه!

ولی مثلاً تو زبانی مثل js این حس کمتر پیش میاد، چون console.log روی آرایه‌ها و اشیای بزرگ معمولاً خلاصه‌تر نشون میده، مرورگر ابزار تعاملی داره و اصلاً دیباگ بیشتر روی ساختارهای سطح‌بالا تمرکز داره تا بایت‌های خام.  برخی زبان‌ها مثل php اصلاً به صورت جدی وارد حوزه binary نمیشن! همین تفاوت‌هاست که باعث می‌شه تو زبان Rust بیشتر به فکر سفارشی‌کردن خروجی Debug بیفتی.

مثلا خروجی چیزی شبیه این می‌بینی:


46,
53,
49,
32,
51,
57,
49,
46,
51,
55,
32,
90,
34,
32,
47,
62,
13,
10,
60,
47,
103,
62,
13,
10,
60,
47,
115,
118,
103,
62,
13,
10,
],
mime: "image/svg+xml",
original_name: "Delphi.svg",
crc32: 2165997440,
}

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


&entry = ResourceEntry {
hash_id: "a76d0441-ca00-2b7c-99a7-cecec238278b",
data: "[60, 63, 120, 109, 108, 32, 118, 101, 114, 115, 105, 111, 110, 61, 34, 49]... (11162 bytes total)",
mime: "image/svg+xml",
original_name: "Delphi.svg",
crc32: 2165997440,
}

خب اینجوری میشه یه نفس آروم کشید و دبیاگ کرد!

 

آماده سازی ساختار debug در زبان راست rust

خب چطور این کارو بکنیم فرض کنیم یه تایپ داریم مثل این:


#[derive(Clone,Debug)]
pub struct ResourceEntry {
    pub hash_id: String,
    pub data: Vec<u8>,
    pub mime: String,
    pub original_name: String,
    pub crc32: u32,
}

مرحله ۱: حذف derive فقط Debug

خب الان حتما rust گیر می‌ده این کد نا معتبره: `dbg!(&entry);` خب جای نگرانی این مشکل مرحله بعدی حل می‌شه:

#[derive(Clone)]
pub struct ResourceEntry {
  pub hash_id: String,
  pub data: Vec<u8>,
  pub mime: String,
  pub original_name: String,
  pub crc32: u32,
}

مرحله ۲: نوشتن debug دلخواه

use std::{fmt};

// debug display
impl fmt::Debug for ResourceEntry {
 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 let data_preview = if self.data.len() > 16 {
 format!("{:?}... ({} bytes total)", &self.data[..16], self.data.len())
 } else {
 format!("{:?}", self.data)
 };

f.debug_struct("ResourceEntry")
 .field("hash_id", &self.hash_id)
 .field("data", &data_preview)
 .field("mime", &self.mime)
 .field("original_name", &self.original_name)
 .field("crc32", &self.crc32)
 .finish()
 }
}

خب توضیحات این می‌شه ما دیباگ رو دلخواه خودمون می‌نویسم این کد ما فقط ۱۶ بایت اول رو می‌گیریم + طول بایت‌ها رو نمایش میدیم، اگر حوصله ندارید خودتون کدش رو بنویسید به هوش مصنوعی بگید این استارکچر رو برام تبدیل کن پرامت پیش فرض بدون درد خونریزی هستش براتون آماده کردم:


I have Rust code where debugging produces a very large or unreadable output because some fields contain large data such as `Vec`, files, JSON, strings, or other collections.

Here is my code:

```
[PASTE YOUR CODE HERE]
```

Please improve its `Debug` output so that:

* Large data is truncated instead of fully printed.
* A short preview is shown (for example, the first 16–32 bytes/items).
* The total size/length is still displayed.
* Other fields remain fully readable.
* The solution follows idiomatic Rust and keeps the original behavior unchanged.

Return the improved Rust code and briefly explain what you changed.

 

💬

شاید امروز جواب خیلی از سؤال‌ها را بتوان از AI گرفت، اما تولید مطالب تخصصی، تجربه‌محور و عمیق هنوز به انگیزه نیاز دارد. این نظرات و بازخوردهای شماست که به ما نشان می‌دهد ادامه دادن این مسیر ارزشمند است.

دیدگاه شما چیست؟

نظرات (0)


ارسال نظر

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

عضویت در شبکه‌های اجتماعی

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