2016-04-14 21 views

cevap

5

hemen bu programı kısaltmak yardımcı olacak iki şey vardır:

  1. Tipi çıkarım: Burada to_string
için yol çok çağrılar: Eğer çok nadiren
  • &str dışarı türlerini yazmak zorunda

    Bunu şöyle yazardım:

    Vec<T>::get'un Option<&T>, yani Option<&&str> döndürdüğünü unutmayın, s türünün &str türünde olmasını istiyoruz (tek &), desen olarak Some(&s) kullanın. Başka bir seçenek, Some(s) => *s, (burada, s belgesine sahip olmak &&str olmalı ve çıkarılması) olacaktır. Tabii ki bu, Option'un spesifik API'sine bakarak daha da azaltılabilir. Biraz daha az evrensel, ama Option ve Result çok sıklıkla Rust'ta kullanılır (o kadar çok başlangıçta!) Ve bu yüzden onların API'lerini öğrenmeye değer. Bu durumda unwrap_or yılında

    Option içindeki değer veya kendisine geçirilen değerlerinden en az birini sağlayacaktır: Referans hokkabazlık

    fn main() { 
        let words = vec!["apple", "orange", "banana"]; 
        let word = *words.get(4).unwrap_or(&"nil"); 
        println!("word: {}", word); 
    } 
    

    Bit hat-up türleri (aka Tetris türü) ve hepsi iyi.

  • +0

    Çok hoş ve açık. İlk denememde '& str'' 'Bazı (& s) 'yi özledim. Teşekkürler! – shinkou

    2

    O &str ve String arasında karar verirken strings ait zorlama kurallarını hatırlamak önemlidir: Ne ile sona erdi.

    fn main() 
    { 
        let words = vec!["apple", "orange", "banana"]; // Vec<&str> 
        let word = match words.get(2) {    // &str 
         Some(&s) => s 
         None => "nil" 
        }; 
        println!("word: {}", word); 
    } 
    

    uzunluk hala senin için bir endişe olsaydı Sen words ve word eşleştirme kodunu pekiştirmek olabilir, ama (belki de tip ek açıklamalar da dahil) bu netliği ödün vermeden en özlü olduğunu düşünüyorum.

    2

    Sana ulaşmak istediğimiz, tam olarak emin değilim, ama bu muhtemelen kodunuzda yaptığını tam olarak ne yapmak için en iyi yoldur:

    fn main() { 
        let words = vec!["apple", "orange", "banana"]; 
        let word = words.get(4).cloned().unwrap_or("nil").to_string(); 
        println!("word: {}", word); 
    } 
    

    zor kısmı cloned() geçerli: get() yöntem vektörün içindeki değere isteğe bağlı bir referans gönderir. Ancak, vektör zaten referansları içerdiğinden, Option<&&str> (iki referans) ile sonuçlanıyoruz. cloned() çağrısı bir referansı kaldırır, dolayısıyla Option<&str>'a sahibiz.

    Ayrıca, bu örnekte son to_string() numaralı aramanın gerekli olmadığını unutmayın - her şeyi yalnızca &str ile yapabiliriz.