مقدمة: لماذا التوثيق في Rust ليس ترفًا بل ضرورة
\n\nتشتهر Rust بسلامة التعامل مع الذاكرة، والأداء العالي، ونظام الأنواع الصارم. ومع ذلك، حتى الكود الأكثر أناقة يصبح عديم الفائدة إذا لم يفهم أحد كيفية استخدامه. التوثيق عالي الجودة هو الجسر بين كودك والمستخدمين (بما فيهم أنت بعد ستة أشهر).
\n\nلحسن الحظ، توفر Rust أدوات قوية لتوليد التوثيق تلقائيًا مباشرة من الكود المصدري. في هذه المقالة، سنستعرض العملية بأكملها: من التعليقات البسيطة إلى إنشاء توثيق كامل مع أمثلة وروابط وحتى معادلات رياضية.
\n\n1. الأساسيات: تعليقات التوثيق وrustdoc
\n\nيوجد في Rust نوعان من التعليقات: العادية (// و /* */) وتعليقات التوثيق (/// و //!). تتم معالجة النوع الأخير بواسطة أداة rustdoc، التي تقوم بتوليد توثيق HTML.
1.1. تعليقات التوثيق الخارجية والداخلية
\n\n- \n
///— تعليق خارجي. يُكتب قبل العنصر (دالة، هيكل، trait) ويصفه. \n //!— تعليق داخلي. يُستخدم لتوثيق الوحدة النمطية نفسها، أو الكريت، أو الملف. \n
/// تحسب مضروب العدد n.\n///\n/// # أمثلة\n/// ```\n/// let result = factorial(5);\n/// assert_eq!(result, 120);\n/// ```\npub fn factorial(n: u32) -> u32 {\n (1..=n).product()\n}\n\n//! # الكريت الخارق الخاص بي\n//!\n//! يوفر هذا الكريت أدوات للعمل مع الرياضيات.\n//! لمزيد من التفاصيل، راجع [التوثيق](https://example.com).\n\n1.2. تشغيل توليد التوثيق
\n\nلتوليد التوثيق، قم بتنفيذ الأمر التالي:
\n\ncargo doc --open\n\nسيقوم هذا الأمر بمسح جميع تعليقات التوثيق في مشروعك، وإنشاء ملفات HTML في مجلد target/doc/ وفتحها في المتصفح. سترى صفحة تحتوي على قائمة بالوحدات النمطية والدوال والهياكل — تمامًا كما في docs.rs.
2. أقسام التوثيق: كيفية جعله قابلاً للقراءة
\n\nمجرد كتابة تعليق لا يكفي. لكي يكون التوثيق مفيدًا، يجب تنظيمه. يدعم rustdoc Markdown، لذا يمكنك استخدام العناوين والقوائم والروابط وحتى كتل الكود.
2.1. الأقسام القياسية
\n\nمن المعتاد استخدام الأقسام التالية (تبدأ بـ # ):
- \n
# أمثلة— مثال أو أكثر على الاستخدام. \n # حالات الذعر (Panics)— في أي الحالات تسبب الدالة ذعرًا. \n # الأخطاء— إذا كانت الدالة تُرجعResult، فصف الأخطاء المحتملة. \n # الأمان— إلزامي للدوالunsafe. \n # الوسائط— وصف المعاملات (على الرغم من أنها غالبًا ما توصف مباشرة في النص). \n
/// تقرأ محتوى الملف وتعيده كسلسلة نصية.\n///\n/// # الوسائط\n/// * `path` — مسار الملف.\n///\n/// # الأخطاء\n/// تُرجع `io::Error` إذا كان الملف غير موجود أو غير قابل للقراءة.\n///\n/// # حالات الذعر\n/// تسبب ذعرًا إذا كان المسار يحتوي على بايت صفري.\n///\n/// # أمثلة\n/// ```\n/// let content = read_file("hello.txt").unwrap();\n/// println!("{}", content);\n/// ```\npub fn read_file(path: &str) -> Result<String, std::io::Error> {\n std::fs::read_to_string(path)\n}\n\n2.2. الروابط والروابط المتقاطعة
\n\nيمكنك الإشارة إلى عناصر أخرى في الكود. سيقوم rustdoc تلقائيًا بتحويلها إلى روابط تشعبية:
/// تستخدم الدالة [`factorial`] لحساب التوافيق.\n/// انظر أيضًا الوحدة النمطية [`math::combinatorics`].\npub fn combinations(n: u32, k: u32) -> u32 {\n factorial(n) / (factorial(k) * factorial(n - k))\n}\n\nإذا كنت بحاجة إلى الإشارة إلى