@TicSo

Как внести в массив символы, которым соответствует диапазон u8?

Как получить, например из примера в спойлере, подобный результат:
Из всего диавазона u8
[0,  ..., 10,  ..., 126, 127, 128, ..., 255]
такое соответствие
["\0", ..., "\n", ..., "~",  "\u{7f}",  "Err", ..., "Err"]

spoiler

fn main() {
   let mut info: Vec<&str> = vec![];
   let mut i: u8 = 0;
   loop {
      
    if i > 255 {break}; 
    let u = vec![i];
    let t = std::str::from_utf8(&u).unwrap();
    // info.push(&t);
    println!("{:?} -> {:?}", i, &t);
      
   i = i + 1;    
   }
      
   println!("\n{:?}", info);
}

  • Вопрос задан
  • 148 просмотров
Решения вопроса 2
bingo347
@bingo347
Crazy on performance...
fn main() {
    let src: Vec<[u8; 1]> = (0..u8::MAX).map(|i| [i]).collect();
    let mut info =  Vec::<&str>::with_capacity(u8::MAX.into());
    for u in &src {
        let t = std::str::from_utf8(&*u).unwrap_or("Err");
        info.push(t);
    }
    println!("\n{:#?}", info);
}

но надо понимать, что info будет связан лайфтаймом с src, чтоб избавится от этого нужно хранить в нём не &str а String или Box<str>
fn main() {
    let info: Vec<Box<str>> = (0..u8::MAX).map(|i| {
        let u = [i];
        let t = std::str::from_utf8(&u).unwrap_or("Err");
        t.into()
    }).collect();
    println!("\n{:#?}", info);
}
Ответ написан
@deliro
use std::slice;

fn main() {
    let range = (0..u8::MAX).collect::<Vec<_>>();
    let v = range
        .iter()
        .map(|x| std::str::from_utf8(slice::from_ref(x)).unwrap_or("Err"))
        .collect::<Vec<_>>();
    println!("{v:?}")
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы