hata

2014-09-13 48 views
5

Aşağıdaki örnekhata

fn main() { 
    f("hello", true); 
} 

fn f(str: &str, sen: bool) { 
    let s: &str = match sen { 
     false => str, 
     true => str.chars().map(|x| x.to_lowercase()).collect().as_slice() 
    }; 
    println!("{}", s); 
} 

bu hatayı

ben biraz kafam karıştı
error: the type of this value must be known in this conntext                                        
true => str.chars().map(|x| x.to_lowercase()).collect().as_slice() 
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

alıyorum düşünün eşleşen desende "Bu değerin türü bu bağlamda bilinmelidir", Derleyici, str türünün işlev tanımından &str olduğunu bilmiyor mu? Burada neyi özlüyorum?

cevap

4

Hata konumu belki kafa karıştırıcı, sorun burada collect yöntemidir. Bu, herhangi bir FromIterator için jeneriktir ve bu durumda derleyici kedi türünü (hangi derleyicinin, & str üreten bir as_slice yöntemi olan FromIterator uygulayan X türüne gereksinim duyduğunuzu görür).

Bu koddaki ikinci sorun, eşleme deyiminden yerel bir değere (toplama sonucuna) bir başvuru göndermeye çalıştığınızdır. Bunu yapamazsınız çünkü bu değer o bloğun ömrüne sahiptir ve sonradan ayrılır, böylece iade geçersiz olur.

fn main() { 
    f("hello", true); 
} 

fn f(str: &str, sen: bool) { 
    let s: String = match sen { 
     false => str.to_string(), 
     true => str.chars().map(|x| x.to_lowercase()).collect() 
    }; 
    println!("{}", s); 
} 

Sana sonunda elde çalışıyoruz biliyorum ama bu olacaksa MaybeOwned bakmak yok:

Bir çalışma çözeltisi (ama String & str dönüştürme gerektirir) Bir dilim (&str) veya String döndüren işlev.

+0

Teşekkürler. 'String' saklamak ve temp_var.as_slice() 'için bağlamak için geçici değişkenler kullanarak sona erdi. Yine de daha iyi bir yol olup olmadığından emin değilim. –