[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6E328T2GGE4MP3YRVWD7QAG":3,"skill-same:01M6E328T2GGE4MP3YRVWD7QAG":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":38,"commitSha":39,"skillDirectory":40,"forksCount":13,"repositoryHtmlUrl":41,"repositoryHomepageUrl":42,"ownerHtmlUrl":43,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":44,"install":45,"resources":58},"01M6E328T2GGE4MP3YRVWD7QAG","rust-patterns",null,"Idiomatic Rust patterns, ownership, error handling, traits, concurrency, and best practices for building safe, performant applications.","7dvq6yrkgs-stack\u002Fplaywright","7dvq6yrkgs-stack","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F251638143?v=4","01M6E061J2AMGWYZ6TK7Y8NM74","01M6E061PQCQJGQMPBERMCFN5G",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Frust-patterns\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31],"rust","rust patterns","patterns","safe","error handling","best practices","concurrency","applications","error","2026-11-10 10:12:30",false,"---\nname: rust-patterns\ndescription: Idiomatic Rust patterns, ownership, error handling, traits, concurrency, and best practices for building safe, performant applications.\norigin: ECC\n---\n\n# Rust Geliştirme Desenleri\n\nGüvenli, performanslı ve bakım yapılabilir uygulamalar oluşturmak için idiomatic Rust desenleri ve en iyi uygulamalar.\n\n## Ne Zaman Kullanılır\n\n- Yeni Rust kodu yazma\n- Rust kodunu inceleme\n- Mevcut Rust kodunu refactor etme\n- Crate yapısı ve modül düzenini tasarlama\n\n## Nasıl Çalışır\n\nBu skill altı ana alanda idiomatic Rust kurallarını zorlar: derleme zamanında veri yarışlarını önlemek için ownership ve borrowing, kütüphaneler için `thiserror` ve uygulamalar için `anyhow` ile `Result`\u002F`?` hata yayılımı, yasadışı durumları temsil edilemez yapmak için enum'lar ve kapsamlı desen eşleştirme, sıfır maliyetli soyutlama için trait'ler ve generic'ler, `Arc\u003CMutex\u003CT>>`, channel'lar ve async\u002Fawait ile güvenli eşzamanlılık ve domain'e göre düzenlenmiş minimal `pub` yüzeyleri.\n\n## Temel İlkeler\n\n### 1. Ownership ve Borrowing\n\nRust'ın ownership sistemi derleme zamanında veri yarışlarını ve bellek hatalarını önler.\n\n```rust\n\u002F\u002F İyi: Ownership'e ihtiyacınız olmadığında referansları geçirin\nfn process(data: &[u8]) -> usize {\n    data.len()\n}\n\n\u002F\u002F İyi: Saklamak veya tüketmek için ownership alın\nfn store(data: Vec\u003Cu8>) -> Record {\n    Record { payload: data }\n}\n\n\u002F\u002F Kötü: Borrow checker'dan kaçınmak için gereksiz clone\nfn process_bad(data: &Vec\u003Cu8>) -> usize {\n    let cloned = data.clone(); \u002F\u002F İsraf — sadece borrow alın\n    cloned.len()\n}\n```\n\n### Esnek Ownership için `Cow` Kullanın\n\n```rust\nuse std::borrow::Cow;\n\nfn normalize(input: &str) -> Cow\u003C'_, str> {\n    if input.contains(' ') {\n        Cow::Owned(input.replace(' ', \"_\"))\n    } else {\n        Cow::Borrowed(input) \u002F\u002F Mutasyon gerekmediğinde sıfır maliyet\n    }\n}\n```\n\n## Hata İşleme\n\n### `Result` ve `?` Kullanın — Production'da Asla `unwrap()` Kullanmayın\n\n```rust\n\u002F\u002F İyi: Hataları context ile yayın\nuse anyhow::{Context, Result};\n\nfn load_config(path: &str) -> Result\u003CConfig> {\n    let content = std::fs::read_to_string(path)\n        .with_context(|| format!(\"failed to read config from {path}\"))?;\n    let config: Config = toml::from_str(&content)\n        .with_context(|| format!(\"failed to parse config from {path}\"))?;\n    Ok(config)\n}\n\n\u002F\u002F Kötü: Hata durumunda panic\nfn load_config_bad(path: &str) -> Config {\n    let content = std::fs::read_to_string(path).unwrap(); \u002F\u002F Panic!\n    toml::from_str(&content).unwrap()\n}\n```\n\n### Kütüphane Hataları için `thiserror`, Uygulama Hataları için `anyhow`\n\n```rust\n\u002F\u002F Kütüphane kodu: yapılandırılmış, tiplendirilmiş hatalar\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum StorageError {\n    #[error(\"record not found: {id}\")]\n    NotFound { id: String },\n    #[error(\"connection failed\")]\n    Connection(#[from] std::io::Error),\n    #[error(\"invalid data: {0}\")]\n    InvalidData(String),\n}\n\n\u002F\u002F Uygulama kodu: esnek hata işleme\nuse anyhow::{bail, Result};\n\nfn run() -> Result\u003C()> {\n    let config = load_config(\"app.toml\")?;\n    if config.workers == 0 {\n        bail!(\"worker count must be > 0\");\n    }\n    Ok(())\n}\n```\n\n### İç İçe Eşleştirme Yerine `Option` Combinator'ları\n\n```rust\n\u002F\u002F İyi: Combinator zinciri\nfn find_user_email(users: &[User], id: u64) -> Option\u003CString> {\n    users.iter()\n        .find(|u| u.id == id)\n        .map(|u| u.email.clone())\n}\n\n\u002F\u002F Kötü: Derinlemesine iç içe eşleştirme\nfn find_user_email_bad(users: &[User], id: u64) -> Option\u003CString> {\n    match users.iter().find(|u| u.id == id) {\n        Some(user) => match &user.email {\n            email => Some(email.clone()),\n        },\n        None => None,\n    }\n}\n```\n\n## Enum'lar ve Desen Eşleştirme\n\n### Durumları Enum'lar Olarak Modelleyin\n\n```rust\n\u002F\u002F İyi: İmkansız durumlar temsil edilemez\nenum ConnectionState {\n    Disconnected,\n    Connecting { attempt: u32 },\n    Connected { session_id: String },\n    Failed { reason: String, retries: u32 },\n}\n\nfn handle(state: &ConnectionState) {\n    match state {\n        ConnectionState::Disconnected => connect(),\n        ConnectionState::Connecting { attempt } if *attempt > 3 => abort(),\n        ConnectionState::Connecting { .. } => wait(),\n        ConnectionState::Connected { session_id } => use_session(session_id),\n        ConnectionState::Failed { retries, .. } if *retries \u003C 5 => retry(),\n        ConnectionState::Failed { reason, .. } => log_failure(reason),\n    }\n}\n```\n\n### Kapsamlı Eşleştirme — İş Mantığı için Catch-All Yok\n\n```rust\n\u002F\u002F İyi: Her varyantı açıkça işle\nmatch command {\n    Command::Start => start_service(),\n    Command::Stop => stop_service(),\n    Command::Restart => restart_service(),\n    \u002F\u002F Yeni bir varyant eklemek burada işlemeyi zorlar\n}\n\n\u002F\u002F Kötü: Wildcard yeni varyantları gizler\nmatch command {\n    Command::Start => start_service(),\n    _ => {} \u002F\u002F Stop, Restart ve gelecek varyantları sessizce yok sayar\n}\n```\n\n## Trait'ler ve Generic'ler\n\n### Generic Girişleri Kabul Et, Somut Türleri Döndür\n\n```rust\n\u002F\u002F İyi: Generic girdi, somut çıktı\nfn read_all(reader: &mut impl Read) -> std::io::Result\u003CVec\u003Cu8>> {\n    let mut buf = Vec::new();\n    reader.read_to_end(&mut buf)?;\n    Ok(buf)\n}\n\n\u002F\u002F İyi: Birden fazla kısıtlama için trait bound'ları\nfn process\u003CT: Display + Send + 'static>(item: T) -> String {\n    format!(\"processed: {item}\")\n}\n```\n\n### Dinamik Dispatch için Trait Object'leri\n\n```rust\n\u002F\u002F Heterojen koleksiyonlara veya plugin sistemlerine ihtiyacınız olduğunda kullanın\ntrait Handler: Send + Sync {\n    fn handle(&self, request: &Request) -> Response;\n}\n\nstruct Router {\n    handlers: Vec\u003CBox\u003Cdyn Handler>>,\n}\n\n\u002F\u002F Performansa ihtiyacınız olduğunda generic'leri kullanın (monomorfizasyon)\nfn fast_process\u003CH: Handler>(handler: &H, request: &Request) -> Response {\n    handler.handle(request)\n}\n```\n\n### Tip Güvenliği için Newtype Deseni\n\n```rust\n\u002F\u002F İyi: Farklı tipler argümanları karıştırmayı önler\nstruct UserId(u64);\nstruct OrderId(u64);\n\nfn get_order(user: UserId, order: OrderId) -> Result\u003COrder> {\n    \u002F\u002F User ve order ID'lerini yanlışlıkla değiştiremezsiniz\n    todo!()\n}\n\n\u002F\u002F Kötü: Argümanları değiştirmek kolay\nfn get_order_bad(user_id: u64, order_id: u64) -> Result\u003COrder> {\n    todo!()\n}\n```\n\n## Struct'lar ve Veri Modelleme\n\n### Karmaşık Yapılandırma için Builder Deseni\n\n```rust\nstruct ServerConfig {\n    host: String,\n    port: u16,\n    max_connections: usize,\n}\n\nimpl ServerConfig {\n    fn builder(host: impl Into\u003CString>, port: u16) -> ServerConfigBuilder {\n        ServerConfigBuilder { host: host.into(), port, max_connections: 100 }\n    }\n}\n\nstruct ServerConfigBuilder { host: String, port: u16, max_connections: usize }\n\nimpl ServerConfigBuilder {\n    fn max_connections(mut self, n: usize) -> Self { self.max_connections = n; self }\n    fn build(self) -> ServerConfig {\n        ServerConfig { host: self.host, port: self.port, max_connections: self.max_connections }\n    }\n}\n\n\u002F\u002F Kullanım: ServerConfig::builder(\"localhost\", 8080).max_connections(200).build()\n```\n\n## Iterator'lar ve Closure'lar\n\n### Manuel Döngüler Yerine Iterator Zincirlerini Tercih Edin\n\n```rust\n\u002F\u002F İyi: Deklaratif, lazy, birleştirilebilir\nlet active_emails: Vec\u003CString> = users.iter()\n    .filter(|u| u.is_active)\n    .map(|u| u.email.clone())\n    .collect();\n\n\u002F\u002F Kötü: İmperatif biriktirme\nlet mut active_emails = Vec::new();\nfor user in &users {\n    if user.is_active {\n        active_emails.push(user.email.clone());\n    }\n}\n```\n\n### Tip Annotation ile `collect()` Kullanın\n\n```rust\n\u002F\u002F Farklı tiplere collect et\nlet names: Vec\u003C_> = items.iter().map(|i| &i.name).collect();\nlet lookup: HashMap\u003C_, _> = items.iter().map(|i| (i.id, i)).collect();\nlet combined: String = parts.iter().copied().collect();\n\n\u002F\u002F Result'ları collect et — ilk hatada kısa devre yapar\nlet parsed: Result\u003CVec\u003Ci32>, _> = strings.iter().map(|s| s.parse()).collect();\n```\n\n## Eşzamanlılık\n\n### Paylaşılan Mutable State için `Arc\u003CMutex\u003CT>>`\n\n```rust\nuse std::sync::{Arc, Mutex};\n\nlet counter = Arc::new(Mutex::new(0));\nlet handles: Vec\u003C_> = (0..10).map(|_| {\n    let counter = Arc::clone(&counter);\n    std::thread::spawn(move || {\n        let mut num = counter.lock().expect(\"mutex poisoned\");\n        *num += 1;\n    })\n}).collect();\n\nfor handle in handles {\n    handle.join().expect(\"worker thread panicked\");\n}\n```\n\n### Mesaj Geçişi için Channel'lar\n\n```rust\nuse std::sync::mpsc;\n\nlet (tx, rx) = mpsc::sync_channel(16); \u002F\u002F Backpressure ile bounded channel\n\nfor i in 0..5 {\n    let tx = tx.clone();\n    std::thread::spawn(move || {\n        tx.send(format!(\"message {i}\")).expect(\"receiver disconnected\");\n    });\n}\ndrop(tx); \u002F\u002F Sender'ı kapat böylece rx iterator sonlanır\n\nfor msg in rx {\n    println!(\"{msg}\");\n}\n```\n\n### Tokio ile Async\n\n```rust\nuse tokio::time::Duration;\n\nasync fn fetch_with_timeout(url: &str) -> Result\u003CString> {\n    let response = tokio::time::timeout(\n        Duration::from_secs(5),\n        reqwest::get(url),\n    )\n    .await\n    .context(\"request timed out\")?\n    .context(\"request failed\")?;\n\n    response.text().await.context(\"failed to read body\")\n}\n\n\u002F\u002F Eşzamanlı görevler spawn et\nasync fn fetch_all(urls: Vec\u003CString>) -> Vec\u003CResult\u003CString>> {\n    let handles: Vec\u003C_> = urls.into_iter()\n        .map(|url| tokio::spawn(async move {\n            fetch_with_timeout(&url).await\n        }))\n        .collect();\n\n    let mut results = Vec::with_capacity(handles.len());\n    for handle in handles {\n        results.push(handle.await.unwrap_or_else(|e| panic!(\"spawned task panicked: {e}\")));\n    }\n    results\n}\n```\n\n## Unsafe Kod\n\n### Unsafe Ne Zaman Kabul Edilebilir\n\n```rust\n\u002F\u002F Kabul edilebilir: Belgelenmiş değişmezlerle FFI sınırı (Rust 2024+)\n\u002F\u002F\u002F # Safety\n\u002F\u002F\u002F `ptr` başlatılmış bir `Widget`'a geçerli, hizalı bir pointer olmalıdır.\nunsafe fn widget_from_raw\u003C'a>(ptr: *const Widget) -> &'a Widget {\n    \u002F\u002F SAFETY: çağıran ptr'nin geçerli ve hizalı olduğunu garanti eder\n    unsafe { &*ptr }\n}\n\n\u002F\u002F Kabul edilebilir: Doğruluk kanıtı ile performans-kritik yol\n\u002F\u002F SAFETY: döngü sınırı nedeniyle index her zaman \u003C len\nunsafe { slice.get_unchecked(index) }\n```\n\n### Unsafe Ne Zaman Kabul EDİLEMEZ\n\n```rust\n\u002F\u002F Kötü: Borrow checker'ı atlamak için unsafe kullanma\n\u002F\u002F Kötü: Kolaylık için unsafe kullanma\n\u002F\u002F Kötü: Safety yorumu olmadan unsafe kullanma\n\u002F\u002F Kötü: İlgisiz tipler arasında transmute etme\n```\n\n## Modül Sistemi ve Crate Yapısı\n\n### Tipe Göre Değil, Domain'e Göre Düzenle\n\n```text\nmy_app\u002F\n├── src\u002F\n│   ├── main.rs\n│   ├── lib.rs\n│   ├── auth\u002F          # Domain modülü\n│   │   ├── mod.rs\n│   │   ├── token.rs\n│   │   └── middleware.rs\n│   ├── orders\u002F        # Domain modülü\n│   │   ├── mod.rs\n│   │   ├── model.rs\n│   │   └── service.rs\n│   └── db\u002F            # Altyapı\n│       ├── mod.rs\n│       └── pool.rs\n├── tests\u002F             # Entegrasyon testleri\n├── benches\u002F           # Benchmark'lar\n└── Cargo.toml\n```\n\n### Görünürlük — Minimal Şekilde Açığa Çıkarın\n\n```rust\n\u002F\u002F İyi: Dahili paylaşım için pub(crate)\npub(crate) fn validate_input(input: &str) -> bool {\n    !input.is_empty()\n}\n\n\u002F\u002F İyi: lib.rs'den public API'yi yeniden export et\npub mod auth;\npub use auth::AuthMiddleware;\n\n\u002F\u002F Kötü: Her şeyi pub yapmak\npub fn internal_helper() {} \u002F\u002F pub(crate) veya private olmalı\n```\n\n## Araç Entegrasyonu\n\n### Temel Komutlar\n\n```bash\n# Build ve kontrol\ncargo build\ncargo check              # Codegen olmadan hızlı tip kontrolü\ncargo clippy             # Lint'ler ve öneriler\ncargo fmt                # Kodu formatla\n\n# Test etme\ncargo test\ncargo test -- --nocapture    # println çıktısını göster\ncargo test --lib             # Sadece unit testler\ncargo test --test integration # Sadece entegrasyon testleri\n\n# Bağımlılıklar\ncargo audit              # Güvenlik denetimi\ncargo tree               # Bağımlılık ağacı\ncargo update             # Bağımlılıkları güncelle\n\n# Performans\ncargo bench              # Benchmark'ları çalıştır\n```\n\n## Hızlı Referans: Rust Deyimleri\n\n| Deyim | Açıklama |\n|-------|----------|\n| Clone etme, borrow al | Ownership gerekmedikçe clone yerine `&T` geçir |\n| Yasadışı durumları temsil edilemez yap | Sadece geçerli durumları modellemek için enum'ları kullan |\n| `unwrap()` yerine `?` | Hataları yay, kütüphane\u002Fproduction kodunda asla panic |\n| Validate etme, parse et | Sınırda yapılandırılmamış veriyi tiplendirilmiş struct'lara dönüştür |\n| Tip güvenliği için newtype | Argüman değişimlerini önlemek için primitive'leri newtype'lara sar |\n| Döngüler yerine iterator'ları tercih et | Deklaratif zincirler daha net ve genellikle daha hızlı |\n| Result'larda `#[must_use]` | Çağıranların dönüş değerlerini işlemesini garanti et |\n| Esnek ownership için `Cow` | Borrow yeterli olduğunda allocation'lardan kaçın |\n| Kapsamlı eşleştirme | İş-kritik enum'lar için wildcard `_` yok |\n| Minimal `pub` yüzeyi | Dahili API'ler için `pub(crate)` kullan |\n\n## Kaçınılacak Anti-Desenler\n\n```rust\n\u002F\u002F Kötü: Production kodunda .unwrap()\nlet value = map.get(\"key\").unwrap();\n\n\u002F\u002F Kötü: Nedenini anlamadan borrow checker'ı tatmin etmek için .clone()\nlet data = expensive_data.clone();\nprocess(&original, &data);\n\n\u002F\u002F Kötü: &str yeterken String kullanma\nfn greet(name: String) { \u002F* &str olmalı *\u002F }\n\n\u002F\u002F Kötü: Kütüphanelerde Box\u003Cdyn Error> (yerine thiserror kullanın)\nfn parse(input: &str) -> Result\u003CData, Box\u003Cdyn std::error::Error>> { todo!() }\n\n\u002F\u002F Kötü: must_use uyarılarını yok sayma\nlet _ = validate(input); \u002F\u002F Bir Result'ı sessizce atma\n\n\u002F\u002F Kötü: Async context'te bloke etme\nasync fn bad_async() {\n    std::thread::sleep(Duration::from_secs(1)); \u002F\u002F Executor'ı bloke eder!\n    \u002F\u002F Kullanın: tokio::time::sleep(Duration::from_secs(1)).await;\n}\n```\n\n**Unutmayın**: Derlenir ise muhtemelen doğrudur — ama sadece `unwrap()` kullanmaktan kaçınır, `unsafe`'i minimize eder ve tip sisteminin sizin için çalışmasına izin verirseniz.\n","# Rust Geliştirme Desenleri\n\nGüvenli, performanslı ve bakım yapılabilir uygulamalar oluşturmak için idiomatic Rust desenleri ve en iyi uygulamalar.\n\n## Ne Zaman Kullanılır\n\n- Yeni Rust kodu yazma\n- Rust kodunu inceleme\n- Mevcut Rust kodunu refactor etme\n- Crate yapısı ve modül düzenini tasarlama\n\n## Nasıl Çalışır\n\nBu skill altı ana alanda idiomatic Rust kurallarını zorlar: derleme zamanında veri yarışlarını önlemek için ownership ve borrowing, kütüphaneler için `thiserror` ve uygulamalar için `anyhow` ile `Result`\u002F`?` hata yayılımı, yasadışı durumları temsil edilemez yapmak için enum'lar ve kapsamlı desen eşleştirme, sıfır maliyetli soyutlama için trait'ler ve generic'ler, `Arc\u003CMutex\u003CT>>`, channel'lar ve async\u002Fawait ile güvenli eşzamanlılık ve domain'e göre düzenlenmiş minimal `pub` yüzeyleri.\n\n## Temel İlkeler\n\n### 1. Ownership ve Borrowing\n\nRust'ın ownership sistemi derleme zamanında veri yarışlarını ve bellek hatalarını önler.\n\n```rust\n\u002F\u002F İyi: Ownership'e ihtiyacınız olmadığında referansları geçirin\nfn process(data: &[u8]) -> usize {\n    data.len()\n}\n\n\u002F\u002F İyi: Saklamak veya tüketmek için ownership alın\nfn store(data: Vec\u003Cu8>) -> Record {\n    Record { payload: data }\n}\n\n\u002F\u002F Kötü: Borrow checker'dan kaçınmak için gereksiz clone\nfn process_bad(data: &Vec\u003Cu8>) -> usize {\n    let cloned = data.clone(); \u002F\u002F İsraf — sadece borrow alın\n    cloned.len()\n}\n```\n\n### Esnek Ownership için `Cow` Kullanın\n\n```rust\nuse std::borrow::Cow;\n\nfn normalize(input: &str) -> Cow\u003C'_, str> {\n    if input.contains(' ') {\n        Cow::Owned(input.replace(' ', \"_\"))\n    } else {\n        Cow::Borrowed(input) \u002F\u002F Mutasyon gerekmediğinde sıfır maliyet\n    }\n}\n```\n\n## Hata İşleme\n\n### `Result` ve `?` Kullanın — Production'da Asla `unwrap()` Kullanmayın\n\n```rust\n\u002F\u002F İyi: Hataları context ile yayın\nuse anyhow::{Context, Result};\n\nfn load_config(path: &str) -> Result\u003CConfig> {\n    let content = std::fs::read_to_string(path)\n        .with_context(|| format!(\"failed to read config from {path}\"))?;\n    let config: Config = toml::from_str(&content)\n        .with_context(|| format!(\"failed to parse config from {path}\"))?;\n    Ok(config)\n}\n\n\u002F\u002F Kötü: Hata durumunda panic\nfn load_config_bad(path: &str) -> Config {\n    let content = std::fs::read_to_string(path).unwrap(); \u002F\u002F Panic!\n    toml::from_str(&content).unwrap()\n}\n```\n\n### Kütüphane Hataları için `thiserror`, Uygulama Hataları için `anyhow`\n\n```rust\n\u002F\u002F Kütüphane kodu: yapılandırılmış, tiplendirilmiş hatalar\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum StorageError {\n    #[error(\"record not found: {id}\")]\n    NotFound { id: String },\n    #[error(\"connection failed\")]\n    Connection(#[from] std::io::Error),\n    #[error(\"invalid data: {0}\")]\n    InvalidData(String),\n}\n\n\u002F\u002F Uygulama kodu: esnek hata işleme\nuse anyhow::{bail, Result};\n\nfn run() -> Result\u003C()> {\n    let config = load_config(\"app.toml\")?;\n    if config.workers == 0 {\n        bail!(\"worker count must be > 0\");\n    }\n    Ok(())\n}\n```\n\n### İç İçe Eşleştirme Yerine `Option` Combinator'ları\n\n```rust\n\u002F\u002F İyi: Combinator zinciri\nfn find_user_email(users: &[User], id: u64) -> Option\u003CString> {\n    users.iter()\n        .find(|u| u.id == id)\n        .map(|u| u.email.clone())\n}\n\n\u002F\u002F Kötü: Derinlemesine iç içe eşleştirme\nfn find_user_email_bad(users: &[User], id: u64) -> Option\u003CString> {\n    match users.iter().find(|u| u.id == id) {\n        Some(user) => match &user.email {\n            email => Some(email.clone()),\n        },\n        None => None,\n    }\n}\n```\n\n## Enum'lar ve Desen Eşleştirme\n\n### Durumları Enum'lar Olarak Modelleyin\n\n```rust\n\u002F\u002F İyi: İmkansız durumlar temsil edilemez\nenum ConnectionState {\n    Disconnected,\n    Connecting { attempt: u32 },\n    Connected { session_id: String },\n    Failed { reason: String, retries: u32 },\n}\n\nfn handle(state: &ConnectionState) {\n    match state {\n        ConnectionState::Disconnected => connect(),\n        ConnectionState::Connecting { attempt } if *attempt > 3 => abort(),\n        ConnectionState::Connecting { .. } => wait(),\n        ConnectionState::Connected { session_id } => use_session(session_id),\n        ConnectionState::Failed { retries, .. } if *retries \u003C 5 => retry(),\n        ConnectionState::Failed { reason, .. } => log_failure(reason),\n    }\n}\n```\n\n### Kapsamlı Eşleştirme — İş Mantığı için Catch-All Yok\n\n```rust\n\u002F\u002F İyi: Her varyantı açıkça işle\nmatch command {\n    Command::Start => start_service(),\n    Command::Stop => stop_service(),\n    Command::Restart => restart_service(),\n    \u002F\u002F Yeni bir varyant eklemek burada işlemeyi zorlar\n}\n\n\u002F\u002F Kötü: Wildcard yeni varyantları gizler\nmatch command {\n    Command::Start => start_service(),\n    _ => {} \u002F\u002F Stop, Restart ve gelecek varyantları sessizce yok sayar\n}\n```\n\n## Trait'ler ve Generic'ler\n\n### Generic Girişleri Kabul Et, Somut Türleri Döndür\n\n```rust\n\u002F\u002F İyi: Generic girdi, somut çıktı\nfn read_all(reader: &mut impl Read) -> std::io::Result\u003CVec\u003Cu8>> {\n    let mut buf = Vec::new();\n    reader.read_to_end(&mut buf)?;\n    Ok(buf)\n}\n\n\u002F\u002F İyi: Birden fazla kısıtlama için trait bound'ları\nfn process\u003CT: Display + Send + 'static>(item: T) -> String {\n    format!(\"processed: {item}\")\n}\n```\n\n### Dinamik Dispatch için Trait Object'leri\n\n```rust\n\u002F\u002F Heterojen koleksiyonlara veya plugin sistemlerine ihtiyacınız olduğunda kullanın\ntrait Handler: Send + Sync {\n    fn handle(&self, request: &Request) -> Response;\n}\n\nstruct Router {\n    handlers: Vec\u003CBox\u003Cdyn Handler>>,\n}\n\n\u002F\u002F Performansa ihtiyacınız olduğunda generic'leri kullanın (monomorfizasyon)\nfn fast_process\u003CH: Handler>(handler: &H, request: &Request) -> Response {\n    handler.handle(request)\n}\n```\n\n### Tip Güvenliği için Newtype Deseni\n\n```rust\n\u002F\u002F İyi: Farklı tipler argümanları karıştırmayı önler\nstruct UserId(u64);\nstruct OrderId(u64);\n\nfn get_order(user: UserId, order: OrderId) -> Result\u003COrder> {\n    \u002F\u002F User ve order ID'lerini yanlışlıkla değiştiremezsiniz\n    todo!()\n}\n\n\u002F\u002F Kötü: Argümanları değiştirmek kolay\nfn get_order_bad(user_id: u64, order_id: u64) -> Result\u003COrder> {\n    todo!()\n}\n```\n\n## Struct'lar ve Veri Modelleme\n\n### Karmaşık Yapılandırma için Builder Deseni\n\n```rust\nstruct ServerConfig {\n    host: String,\n    port: u16,\n    max_connections: usize,\n}\n\nimpl ServerConfig {\n    fn builder(host: impl Into\u003CString>, port: u16) -> ServerConfigBuilder {\n        ServerConfigBuilder { host: host.into(), port, max_connections: 100 }\n    }\n}\n\nstruct ServerConfigBuilder { host: String, port: u16, max_connections: usize }\n\nimpl ServerConfigBuilder {\n    fn max_connections(mut self, n: usize) -> Self { self.max_connections = n; self }\n    fn build(self) -> ServerConfig {\n        ServerConfig { host: self.host, port: self.port, max_connections: self.max_connections }\n    }\n}\n\n\u002F\u002F Kullanım: ServerConfig::builder(\"localhost\", 8080).max_connections(200).build()\n```\n\n## Iterator'lar ve Closure'lar\n\n### Manuel Döngüler Yerine Iterator Zincirlerini Tercih Edin\n\n```rust\n\u002F\u002F İyi: Deklaratif, lazy, birleştirilebilir\nlet active_emails: Vec\u003CString> = users.iter()\n    .filter(|u| u.is_active)\n    .map(|u| u.email.clone())\n    .collect();\n\n\u002F\u002F Kötü: İmperatif biriktirme\nlet mut active_emails = Vec::new();\nfor user in &users {\n    if user.is_active {\n        active_emails.push(user.email.clone());\n    }\n}\n```\n\n### Tip Annotation ile `collect()` Kullanın\n\n```rust\n\u002F\u002F Farklı tiplere collect et\nlet names: Vec\u003C_> = items.iter().map(|i| &i.name).collect();\nlet lookup: HashMap\u003C_, _> = items.iter().map(|i| (i.id, i)).collect();\nlet combined: String = parts.iter().copied().collect();\n\n\u002F\u002F Result'ları collect et — ilk hatada kısa devre yapar\nlet parsed: Result\u003CVec\u003Ci32>, _> = strings.iter().map(|s| s.parse()).collect();\n```\n\n## Eşzamanlılık\n\n### Paylaşılan Mutable State için `Arc\u003CMutex\u003CT>>`\n\n```rust\nuse std::sync::{Arc, Mutex};\n\nlet counter = Arc::new(Mutex::new(0));\nlet handles: Vec\u003C_> = (0..10).map(|_| {\n    let counter = Arc::clone(&counter);\n    std::thread::spawn(move || {\n        let mut num = counter.lock().expect(\"mutex poisoned\");\n        *num += 1;\n    })\n}).collect();\n\nfor handle in handles {\n    handle.join().expect(\"worker thread panicked\");\n}\n```\n\n### Mesaj Geçişi için Channel'lar\n\n```rust\nuse std::sync::mpsc;\n\nlet (tx, rx) = mpsc::sync_channel(16); \u002F\u002F Backpressure ile bounded channel\n\nfor i in 0..5 {\n    let tx = tx.clone();\n    std::thread::spawn(move || {\n        tx.send(format!(\"message {i}\")).expect(\"receiver disconnected\");\n    });\n}\ndrop(tx); \u002F\u002F Sender'ı kapat böylece rx iterator sonlanır\n\nfor msg in rx {\n    println!(\"{msg}\");\n}\n```\n\n### Tokio ile Async\n\n```rust\nuse tokio::time::Duration;\n\nasync fn fetch_with_timeout(url: &str) -> Result\u003CString> {\n    let response = tokio::time::timeout(\n        Duration::from_secs(5),\n        reqwest::get(url),\n    )\n    .await\n    .context(\"request timed out\")?\n    .context(\"request failed\")?;\n\n    response.text().await.context(\"failed to read body\")\n}\n\n\u002F\u002F Eşzamanlı görevler spawn et\nasync fn fetch_all(urls: Vec\u003CString>) -> Vec\u003CResult\u003CString>> {\n    let handles: Vec\u003C_> = urls.into_iter()\n        .map(|url| tokio::spawn(async move {\n            fetch_with_timeout(&url).await\n        }))\n        .collect();\n\n    let mut results = Vec::with_capacity(handles.len());\n    for handle in handles {\n        results.push(handle.await.unwrap_or_else(|e| panic!(\"spawned task panicked: {e}\")));\n    }\n    results\n}\n```\n\n## Unsafe Kod\n\n### Unsafe Ne Zaman Kabul Edilebilir\n\n```rust\n\u002F\u002F Kabul edilebilir: Belgelenmiş değişmezlerle FFI sınırı (Rust 2024+)\n\u002F\u002F\u002F # Safety\n\u002F\u002F\u002F `ptr` başlatılmış bir `Widget`'a geçerli, hizalı bir pointer olmalıdır.\nunsafe fn widget_from_raw\u003C'a>(ptr: *const Widget) -> &'a Widget {\n    \u002F\u002F SAFETY: çağıran ptr'nin geçerli ve hizalı olduğunu garanti eder\n    unsafe { &*ptr }\n}\n\n\u002F\u002F Kabul edilebilir: Doğruluk kanıtı ile performans-kritik yol\n\u002F\u002F SAFETY: döngü sınırı nedeniyle index her zaman \u003C len\nunsafe { slice.get_unchecked(index) }\n```\n\n### Unsafe Ne Zaman Kabul EDİLEMEZ\n\n```rust\n\u002F\u002F Kötü: Borrow checker'ı atlamak için unsafe kullanma\n\u002F\u002F Kötü: Kolaylık için unsafe kullanma\n\u002F\u002F Kötü: Safety yorumu olmadan unsafe kullanma\n\u002F\u002F Kötü: İlgisiz tipler arasında transmute etme\n```\n\n## Modül Sistemi ve Crate Yapısı\n\n### Tipe Göre Değil, Domain'e Göre Düzenle\n\n```text\nmy_app\u002F\n├── src\u002F\n│   ├── main.rs\n│   ├── lib.rs\n│   ├── auth\u002F          # Domain modülü\n│   │   ├── mod.rs\n│   │   ├── token.rs\n│   │   └── middleware.rs\n│   ├── orders\u002F        # Domain modülü\n│   │   ├── mod.rs\n│   │   ├── model.rs\n│   │   └── service.rs\n│   └── db\u002F            # Altyapı\n│       ├── mod.rs\n│       └── pool.rs\n├── tests\u002F             # Entegrasyon testleri\n├── benches\u002F           # Benchmark'lar\n└── Cargo.toml\n```\n\n### Görünürlük — Minimal Şekilde Açığa Çıkarın\n\n```rust\n\u002F\u002F İyi: Dahili paylaşım için pub(crate)\npub(crate) fn validate_input(input: &str) -> bool {\n    !input.is_empty()\n}\n\n\u002F\u002F İyi: lib.rs'den public API'yi yeniden export et\npub mod auth;\npub use auth::AuthMiddleware;\n\n\u002F\u002F Kötü: Her şeyi pub yapmak\npub fn internal_helper() {} \u002F\u002F pub(crate) veya private olmalı\n```\n\n## Araç Entegrasyonu\n\n### Temel Komutlar\n\n```bash\n# Build ve kontrol\ncargo build\ncargo check              # Codegen olmadan hızlı tip kontrolü\ncargo clippy             # Lint'ler ve öneriler\ncargo fmt                # Kodu formatla\n\n# Test etme\ncargo test\ncargo test -- --nocapture    # println çıktısını göster\ncargo test --lib             # Sadece unit testler\ncargo test --test integration # Sadece entegrasyon testleri\n\n# Bağımlılıklar\ncargo audit              # Güvenlik denetimi\ncargo tree               # Bağımlılık ağacı\ncargo update             # Bağımlılıkları güncelle\n\n# Performans\ncargo bench              # Benchmark'ları çalıştır\n```\n\n## Hızlı Referans: Rust Deyimleri\n\n| Deyim | Açıklama |\n|-------|----------|\n| Clone etme, borrow al | Ownership gerekmedikçe clone yerine `&T` geçir |\n| Yasadışı durumları temsil edilemez yap | Sadece geçerli durumları modellemek için enum'ları kullan |\n| `unwrap()` yerine `?` | Hataları yay, kütüphane\u002Fproduction kodunda asla panic |\n| Validate etme, parse et | Sınırda yapılandırılmamış veriyi tiplendirilmiş struct'lara dönüştür |\n| Tip güvenliği için newtype | Argüman değişimlerini önlemek için primitive'leri newtype'lara sar |\n| Döngüler yerine iterator'ları tercih et | Deklaratif zincirler daha net ve genellikle daha hızlı |\n| Result'larda `#[must_use]` | Çağıranların dönüş değerlerini işlemesini garanti et |\n| Esnek ownership için `Cow` | Borrow yeterli olduğunda allocation'lardan kaçın |\n| Kapsamlı eşleştirme | İş-kritik enum'lar için wildcard `_` yok |\n| Minimal `pub` yüzeyi | Dahili API'ler için `pub(crate)` kullan |\n\n## Kaçınılacak Anti-Desenler\n\n```rust\n\u002F\u002F Kötü: Production kodunda .unwrap()\nlet value = map.get(\"key\").unwrap();\n\n\u002F\u002F Kötü: Nedenini anlamadan borrow checker'ı tatmin etmek için .clone()\nlet data = expensive_data.clone();\nprocess(&original, &data);\n\n\u002F\u002F Kötü: &str yeterken String kullanma\nfn greet(name: String) { \u002F* &str olmalı *\u002F }\n\n\u002F\u002F Kötü: Kütüphanelerde Box\u003Cdyn Error> (yerine thiserror kullanın)\nfn parse(input: &str) -> Result\u003CData, Box\u003Cdyn std::error::Error>> { todo!() }\n\n\u002F\u002F Kötü: must_use uyarılarını yok sayma\nlet _ = validate(input); \u002F\u002F Bir Result'ı sessizce atma\n\n\u002F\u002F Kötü: Async context'te bloke etme\nasync fn bad_async() {\n    std::thread::sleep(Duration::from_secs(1)); \u002F\u002F Executor'ı bloke eder!\n    \u002F\u002F Kullanın: tokio::time::sleep(Duration::from_secs(1)).await;\n}\n```\n\n**Unutmayın**: Derlenir ise muhtemelen doğrudur — ama sadece `unwrap()` kullanmaktan kaçınır, `unsafe`'i minimize eder ve tip sisteminin sizin için çalışmasına izin verirseniz.\n",{"name":5,"origin":37,"description":7},"ECC","main","a2e3284ed4488780397ee2f78217366e11470dfb","skills\u002Frust-patterns","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright","https:\u002F\u002Fplaywright.dev","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack","2026-04-25 06:04:45",{"source":8,"skillName":5,"commands":46,"prompt":56,"zipAvailable":57},[47,50,53],{"tool":48,"command":49},"npx","npx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill rust-patterns",{"tool":51,"command":52},"bunx","bunx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill rust-patterns",{"tool":54,"command":55},"pnpm","pnpm dlx skills add 7dvq6yrkgs-stack\u002Fplaywright --skill rust-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Frust-patterns\u002FSKILL.md",true,[59,65],{"path":60,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":63,"sourceHtmlUrl":64},".skillfish.json","REFERENCE","参考文档",241,"https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Frust-patterns\u002F.skillfish.json",{"path":66,"resourceType":61,"resourceTypeDesc":62,"sizeBytes":67,"sourceHtmlUrl":68},"DESCRIPTION.md",109,"https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fskills\u002Fgifs\u002FDESCRIPTION.md",[70,100,110,120,135,150],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":88,"publishedAt":32},"01M6E3XK4PRPMQHM7Y98FQPTY1","zyte-api-automation","Automate Zyte API tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzyte-api-automation\u002FSKILL.md",[76,77,80,83],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":78,"categoryName":79,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[89,90,91,92,93,94,95,96,97,98,99],"zyte api automation","api","automation","MCP","tasks","search","Tools","first","automate","composio","via",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":108,"publishedAt":32},"01M6E3XFX6QSTR1QR59NFXJTMA","zylvie-automation","Automate Zylvie tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzylvie-automation\u002FSKILL.md",[106,107],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},[109,91,97,92,93,94,95,96,98,99],"zylvie automation",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":118,"publishedAt":32},"01M6E3XCX2GDYYCHN58ZJHT37M","zoominfo-automation","Automate Zoominfo tasks via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoominfo-automation\u002FSKILL.md",[116,117],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},[119,91,94,95,96,97,98,99,93,92],"zoominfo automation",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":128,"publishedAt":32},"01M6E3X9WJ2T73216WQHHTB9BD","zoho_mail-automation","Automate Zoho Mail tasks via Rube MCP (Composio): email sending, folders, labels, and mailbox management. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_mail-automation\u002FSKILL.md",[126,127],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},[129,130,131,91,92,93,94,132,95,96,97,133,98,134,99],"mail","zoho mail automation","zoho","email","management","mailbox",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":146,"publishedAt":32},"01M6E3X719W648XZBW1EC6JQ64","zoho_invoice-automation","Automate Zoho Invoice tasks via Rube MCP (Composio): invoices, estimates, expenses, clients, and payment tracking. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_invoice-automation\u002FSKILL.md",[141,142,143],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":144,"categoryName":145,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000040","财务",[147,131,91,93,94,95,96,97,148,149,98,99,92],"zoho invoice automation","tracking","payment",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":158,"publishedAt":32},"01M6E3X28JYTC3QTK32AQF7BYB","zoho_inventory-automation","Automate Zoho Inventory tasks via Rube MCP (Composio): items, orders, warehouses, shipments, and stock management. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002F7dvq6yrkgs-stack\u002Fplaywright\u002Fblob\u002Fmain\u002Fskills\u002Fzoho_inventory-automation\u002FSKILL.md",[156,157],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":81,"categoryName":82,"taxonomyType":20,"taxonomyTypeDesc":21},[91,159,131,160,96,97,95,94,93,92,98,99,161,162,133],"inventory","zoho inventory automation","stock","orders"]