Borrow کردن رشته
ارجاع رشته را میتوان خواند بدون انتقال مالکیت.
fn word_count(text: &str) -> usize { text.split_whitespace().count()}let message = String::from("safe and clear");let count = word_count(&message);
مرجع سریع Rust برای مالکیت، borrowing، نوعهای نتیجه و ساختارهای داده رایج. مالکیت را برای جلوگیری از عمر نامعتبر استفاده کنید؛ borrow فقط برای مدت لازم بماند و دادهٔ غیرقابلتغییر را با reference مشترک بخوانید. نبود مقدار را با Option و شکست عملیات را با Result مدل کنید. از unwrap در مرز ورودی یا مسیرهای عملیاتی پرهیز کنید. از این صفحه بهعنوان مرجع سریع استفاده کنید و مثالها و نکتهها را با نسخهٔ ابزار، نیاز و شرایط واقعی پروژهٔ خود تطبیق دهید.
ارجاع رشته را میتوان خواند بدون انتقال مالکیت.
fn word_count(text: &str) -> usize { text.split_whitespace().count()}let message = String::from("safe and clear");let count = word_count(&message);زنجیرهٔ iteratorها تبدیل را بدون loop و تخصیصهای میانی غیرضروری بیان میکند.
let squares: Vec<i32> = values .iter() .filter(|value| **value > 0) .map(|value| value * value) .collect();داده و رفتار مربوط را در کنار هم مدل کنید.
struct Rectangle { width: u32, height: u32,}impl Rectangle { fn area(&self) -> u32 { self.width * self.height }}خطا با ? به caller منتقل میشود و منبع خطا حفظ میشود.
use std::fs;fn read_config(path: &str) -> Result<String, std::io::Error> { let contents = fs::read_to_string(path)?; Ok(contents)}مقدار اختیاری را بدون شاخهبندی دستی تبدیل کنید.
let display_name = user .as_ref() .map(|user| user.name.trim()) .filter(|name| !name.is_empty()) .unwrap_or("Guest");enum حالتهای مجاز را محدود و match پوشش شاخهها را کنترل میکند.
enum Status { Ready, Failed(String),}let message = match status { Status::Ready => "ready".to_string(), Status::Failed(reason) => format!("failed: {reason}"),};قید trait رفتار لازم را مشخص میکند بدون وابستگی به نوع مشخص.
trait Summary { fn summary(&self) -> String;}fn print_summary(item: &impl Summary) { println!("{}", item.summary());}Entry API درج یا بهروزرسانی کلید را در یک lookup انجام میدهد.
use std::collections::HashMap;let mut counts = HashMap::new();for word in text.split_whitespace() { *counts.entry(word.to_lowercase()).or_insert(0usize) += 1;}Arc مالکیت چند thread را فراهم میکند و Mutex دسترسی همزمان را هماهنگ میکند.
use std::sync::{Arc, Mutex};let total = Arc::new(Mutex::new(0));let shared = Arc::clone(&total);std::thread::spawn(move || { *shared.lock().expect("mutex poisoned") += 1;});متغیرها پیشفرض تغییرناپذیرند؛ برای تغییر مقدار از mut استفاده کنید.
مالکیت مقدار هنگام انتقال move میشود؛ در صورت نیاز borrow کنید.
ارجاع اشتراکی &T یا ارجاع تغییردهنده &mut T؛ همزمانی آنها محدود است.
مقدار اختیاری را با Option<T> و خطا را با Result<T, E> مدل کنید.
برای propagation خطا از ? استفاده کنید و خطای سطح مناسب بسازید.
از Vec<T>، String و HashMap<K,V> برای مجموعههای متداول استفاده کنید.
رفتار را با trait بیان و پیادهسازیهای موردنیاز را جدا کنید.
مدیریت وابستگی و ساخت را با Cargo.toml و Cargo.lock انجام دهید.
cargo fmt و cargo clippy را در بازبینی کد اجرا کنید.
با cargo test مسیرهای موفق، خطا و مرز مالکیت را پوشش دهید.
برای مالکیت مشترک از Rc یا در کد همزمان از Arc فقط وقتی لازم است استفاده کنید؛ مالکیت یکتا را سادهتر نگه دارید.
دادهٔ نامطمئن را با serde و مدیریت خطای صریح deserialize کنید؛ از unwrap() در مرزهای ورودی پرهیز کنید.