Özellikler (features)
- Rust kursu
- Orta seviye
- Ders 80/115
- 4 dk
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
fn main() {
// buraya yaz
}Örnek çözüm
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
#[____(feature = "json")]
pub fn json_yaz() {}
#[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 |