CodeBlanks Logo Icon CodeBlanks

Özellikler (features)

Cargo features ile koşullu derleme yapmayı öğrenirsin.

Özellikler (features)

Feature'lar, bir crate'in isteğe bağlı parçalarını açıp kapatmayı sağlar. Kullanılmayan kod derlenmez, böylece derleme süresi ve ikili boyutu küçülür:

# Cargo.toml
[features]
default = ["metin"]
metin = []
json = ["dep:serde_json"]

[dependencies]
serde_json = { version = "1", optional = true }

Kullanan taraf seçer: fatura = { version = "1", features = ["json"] } ya da komut satırında cargo build --features json.

Koşullu derleme

Kodda feature'lara #[cfg(..)] özniteliği ya da cfg!(..) makrosuyla bakılır:

#[cfg(feature = "json")]
pub fn json_yaz(..) { .. }       // yalnızca json açıksa derlenir

fn bicim() -> &'static str {
    if cfg!(feature = "json") { "json" } else { "metin" }
}

#[cfg] öğeyi tamamen kaldırır; cfg! ise derleme anında true/false olan bir ifadedir, iki dal da derlenmek zorundadır. Aynı mekanizma işletim sistemi için de kullanılır: #[cfg(target_os = "windows")].

Uygulama Biçim seçimi

cfg!(feature = "json") ile "json" ya da "metin" döndüren fn bicim() -> &'static str yaz ve sonucu biçim: ... olarak yazdır. Alıştırma ortamında hiçbir feature açık değildir.

Başlangıç kodu

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
fn bicim() -> &'static str {
    if cfg!(feature = "json") {
        "json"
    } else {
        "metin"
    }
}

fn main() {
    println!("biçim: {}", bicim());
}

Beklenen çıktı

biçim: metin

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Feature'lar neden yalnızca <strong>eklemeli</strong> (additive) olmalıdır?

  • Gerekmez
  • Bağımlılık ağacında iki crate farklı feature isterse Cargo hepsini birleştirir; bir feature diğerini bozmamalı Doğru cevap
  • Derleyici kuralı
  • Performans için

Açıklama: Bir feature açıldığında API'den bir şey kaldırmak ya da davranışı tersine çevirmek, başka bir kullanıcının derlemesini kırabilir.

2 Koşullu öğe

Soru
#[____(feature = "json")]
pub fn json_yaz() {}
Cevap
#[cfg(feature = "json")]
pub fn json_yaz() {}

Açıklama: #[cfg(..)] koşul sağlanmazsa öğeyi derlemeden çıkarır.

3 Yazım ve anlamı

Kavram Anlamı
default = ["metin"] Varsayılan açık
optional = true İsteğe bağlı bağımlılık
#[cfg(feature = "x")] Koşullu öğe
cfg!(feature = "x") Derleme anı bool

Orta seviye bölümündeki tüm dersler