مكتبة Rust القياسية: نظرة شاملة
مكتبة Rust القياسية (std) هي مجموعة من الوحدات الأساسية التي تزود المطور بكل ما هو ضروري لإنشاء تطبيقات موثوقة وسريعة وآمنة. على عكس العديد من اللغات الأخرى، تولي Rust اهتمامًا خاصًا لأمان الذاكرة والتوازي دون وجود جامع للقمامة. في هذه المقالة، سنقوم بتحليل المكونات الرئيسية لـ std بالتفصيل مع أمثلة على الكود.
1. الوحدات الأساسية للمكتبة القياسية
تنقسم المكتبة إلى عدة مجموعات منطقية. دعنا نستعرض أهمها.
1.1. الوحدة std::collections
تحتوي على هياكل بيانات لتخزين وإدارة مجموعات العناصر. الأكثر شيوعًا:
Vec<T>— مصفوفة ديناميكية (مشابهة لـArrayListفي Java).HashMap<K, V>— جدول تجزئة لتخزين أزواج المفتاح-القيمة.HashSet<T>— مجموعة من القيم الفريدة.BTreeMapوBTreeSet— مجموعات مرتبة تعتمد على الشجرة ذات اللونين الأحمر والأسود.
use std::collections::HashMap;
fn main() { let mut scores = HashMap::new(); scores.insert(String::from("Alice"), 100); scores.insert(String::from("Bob"), 90);
for (name, score) in &scores { println!("{}: {}", name, score); }}1.2. الوحدة std::io
تتولى مسؤولية الإدخال والإخراج: القراءة من لوحة المفاتيح، التعامل مع الملفات، الإدخال/الإخراج المُخزّن. السمات الرئيسية: Read و Write.
use std::io::{self, BufRead};
fn main() -> io::Result<()> { let stdin = io::stdin(); for line in stdin.lock().lines() { println!("لقد أدخلت: {}", line?); } Ok(())}1.3. الوحدة std::thread
تسمح بإنشاء وإدارة خيوط التنفيذ. تضمن Rust سلامة البيانات بين الخيوط من خلال نظام الملكية والسمات Send و Sync.
use std::thread;
fn main() { let handle = thread::spawn(|| { for i in 1..10 { println!("الخيط: {}", i); } });
for i in 1..5 { println!("الخيط الرئيسي: {}", i); }
handle.join().unwrap();}2. التعامل مع السلاسل النصية والنص
يوجد في Rust نوعان من السلاسل النصية:
String— سلسلة نصية قابلة للتغيير ومالكة (موجودة في الكومة).&str— شريحة سلسلة نصية غير قابلة للتغيير (مرجع إلى تسلسل UTF-8).
fn main() { let mut hello = String::from("مرحبًا، "); hello.push_str("العالم!"); println!("{}", hello); // الإخراج: مرحبًا، العالم!
let slice: &str = &hello[0..6]; println!("الشريحة: {}", slice); // الإخراج: مرحبًا}3. معالجة الأخطاء
بدلاً من الاستثناءات، تستخدم Rust تعدادين:
Option<T>— للحالات التي قد تكون فيها القيمة غير موجودة (SomeأوNone).Result<T, E>— للعمليات التي قد تنتهي بخطأ (OkأوErr).
use std::fs::File;use std::io::Read;
fn read_file(path: &str) -> Result<String, std::io::Error> { let mut file = File::open(path)?; let mut contents = String::new(); file.read_to_string(&mut contents)?; Ok(contents)}
fn main() { match read_file("test.txt") { Ok(content) => println!("المحتوى: {}", content), Err(e) => eprintln!("خطأ: {}", e), }}4. المكررات والإغلاقات
المكررات في Rust كسولة وقوية. تسمح بمعالجة تسلسلات البيانات دون حلقات صريحة.
fn main() { let numbers = vec![1,