2017-01-25 31 views
9

Verilen:Rust en biçiminde kullanılmayan adlandırılmış argümanları izin ver() ailesi

format!("{red}{}{reset}", "text", red = "RED", blue = "BLUE", reset = "RESET"); 

derleyiciler bir hata ile çıkar: blue olması gerektiği gibi

error: named argument never used 
    --> example.rs:1:47 
    | 
1 |   format!("{red}{}{reset}", "text", red = "RED", blue = "BLUE", reset = "RESET"); 
    |              ^^^^^^^^^^^^^ 

Normalde, bu bir sorun olmaz kaldırıldı, ama benim usecase bir sarıcı makro (basitleştirilmiş) 'dir: Bazen

macro_rules! log { 
    ($fmt:expr, $($arg:tt)*) => { 
     println!($fmt, $($arg)*, blue = "BLUE", red = "RED", reset = "RESET"); 
    }; 
} 

, bu böyle kullanılır (basitleştirilmiş) olduğu Sadece tarihinde erroring yerine, kullanılmayan argümanları göz ardı etmek

error: named argument never used 
    --> example.rs:3:26 
    | 
3 |   println!($fmt, $($arg)*, blue = "BLUE", red = "RED", reset = "RESET"); 
    |         ^^^^^^^^^^^^^ 

mümkün mü: benzer bir hata ile

log!("{red}{}{reset}", "text"); 

derleyici çıkışları: ancak farklı renklerle diğer zamanlarda, özü olsun onları? Renklerin seti bilinen tüm ise

cevap

3

, sıfır uzunlukta argümanlarla onları "tüketmek" olabilir:

macro_rules! log { 
    ($fmt:expr, $($arg:tt)*) => { 
     println!(concat!($fmt, "{blue:.0}{red:.0}{reset:.0}"), // <-- 
       $($arg)*, 
       blue="BLUE", 
       red="RED", 
       reset="RESET") 
    } 
} 

fn main() { 
    log!("{red}{}{reset}", "<!>"); 
    // prints: RED<!>RESET 
} 

(Docs for concat! macro)

Not dizeleri BLUE, RED ki RESET hala olacak biçimlendirme fonksiyonuna gönderilecek, bu yüzden küçük bir yüke maruz kalacak hiçbir şey basılmayacaktır.


ben size konsolun kalanı kırmızı olacak bir {reset} unutursanız beri bu oldukça hata eğilimli olduğunu düşünüyorum. Ben böyle bir şey yazmayın neden acaba:

macro_rules! log_red { 
    ($fmt:expr, $($arg:tt)*) => { 
     println!(concat!("RED", $fmt, "RESET"), $($arg)*); 
    } 
} 
// also define `log_blue!`. 

log_red!("{}", "text"); 
+0

ben 'Display' uygulayan bir şeyin bir örneğini kullanmak eğer öyleyse, "dizeleri MAVİ, KIRMIZI, RESET hala gönderilecektir unutmayın" hala arayacak' Ekranda :: fmt'? "gerisini {reset} unut" çünkü her satırda rasgele karıştırılmış birden fazla renk var, basit dizgiler sadece gösterim amaçlı. –

+0

Cevabınız için teşekkür ederiz, destekleyici kütüphaneyi güncellememi ve Rust'ın 'Display :: fmt' –

+0

@ набиячлэвэли hakkında yeni şeyler öğrenmem için bana yol göster: Hala Display' fmt' diye çağırılmalı, kütüphane henüz yeterince akıllı değil '.0' özeldir (' 'N' şeyler 'Display :: fmt' IIRC'de ele alınmıştır). – kennytm