2016-03-20 19 views
3

Rust için yeni ve basit bir görevle uğraşıyorum. Sekmelerle ayrılmış alanlar ile bir matrisi bir dizeye dönüştürmek istiyorum. Ben bu map işlevi veya benzer bir şey kullanarak mümkün olduğunu düşünüyorum, ama şimdi deneyin her ne olursa olsun bana bir hata verir.Nasıl Vec <Vec<f64>> bir dize dönüştürebilir

Bu, sahip olduğum şeydir ve col bölümünün işlevini dönüştürmek istiyorum. Python'da bu, row.join("\t") gibi bir şeydir. Rust'ta benzer bir şey var mı?

fn print_matrix(vec: &Vec<Vec<f64>>) { 
    for row in vec.iter() { 
     for col in row.iter() { 
      print!("\t{:?}",col); 
     } 
     println!("\n"); 
    } 
} 
+0

Bunun bir kısmı işe yaramıyor mu? Playpen'de minimal, eksiksiz bir örnek verebilir misiniz? Bu kodda yanlış bir şey yok gibi görünüyor. –

+0

dize dize dizgisini yazdırmalı, ancak bir başlangıç ​​sekmesi yazdırmalıdır. Bundan daha zarif bir çözüm olmalı, – Mandragor

+0

: https://doc.rust-lang.org/std/fmt/#format_args – starblue

cevap

6

gerçekten standart kütüphanede bir join yoktur, ancak süper kullanışlı değil (genellikle ek tahsisat gereklidir).

fn print_matrix(vec: &Vec<Vec<f64>>) { 
    for row in vec { 
     let cols_str: Vec<_> = row.iter().map(ToString::to_string).collect(); 
     let line = cols_str.join("\t"); 
     println!("{}", line); 
    } 
} 

sorun olduğunu dilimleri ile değil, adım adım elde bu join çalışır: Ama burada bir çözüm görebilirsiniz. Önce tüm öğeleri bir dizgeye dönüştürmeliyiz, sonucu yeni bir vektörde toplayıp join'u kullanabiliriz.

sandık itertools yineleyiciler için join yöntemi tanımlar ve şöyle uygulanabilir:

for row in vec { 
    let line = row.iter().join("\t"); 
    println!("{}", line); 
} 

Ve adlandırılmış işlevsellik herhangi birini kullanarak önlemek için, elbette elle yapabilirsiniz:

for row in vec { 
    if let Some(first) = row.get(0) { 
     print!("{}", first);    
    } 
    for col in row.iter().skip(1) { 
     print!("\t{}", col); 
    } 
    println!(""); 
} 
4

itertools numaralı telefondan join adresinden fold'u her zaman kullanabilirsiniz (bu gerçekten kullanışlı), şu şekilde:

row.iter().fold("", |tab, col| { print!("{}{:?}", tab, col); "\t" }); 
+0

altındaki örneklere bakın. Bu, bir fazladan \ 't değil \ – tafia

+0

@tafia ile bitecek hayır değil ... [oyun alanı] (http://is.gd/JhLjag) –