@CNNRNN

Можно ли хранить указатели в массиве?

Доброго времени суток!
Допустим есть массив байтов, а так же структура с полями . Я хотел бы узнать можно ли сделать так. что бы поля этой структуры указывали на разные части этого массива.
Вот упрощенный пример с числами.

// буфер с простыми числами
  let  buffer = [10,11,12,13,14];
   // здесь я хотел бы хранить четные числа из buffer
    let mut  even_numbers:[&[i32];10] = [&[0];10];
 // а тут нечетные. 
    let mut odd_numbers:[&[i32];10] = [&[0];10];
    even_numbers[0] = &buffer[0..1];
    even_numbers[1] = &buffer[2..3];
    even_numbers[2] = &buffer[4..];

    print!("{:?}",even_numbers[1]);
  • Вопрос задан
  • 150 просмотров
Пригласить эксперта
Ответы на вопрос 1
ozkriff
@ozkriff
Rust э̶н̶т̶у̶з̶и̶а̶с̶т сектант, хобби игродел
Можно просто использовать срезы (slice):

#[derive(Debug)]
struct CarInfo<'a> {
    name: &'a str,
    model: &'a str,
}

fn main() {
    let input = ["vaz:2107", "gaz:3102"];
    let output: Vec<CarInfo> = input
        .iter()
        .map(|s| s.split_at(s.find(':').expect("Can't find ':'")))
        .map(|(name, model)| CarInfo { name, model: &model[1..] })
        .collect();
    dbg!(output);
}


(песочница)

Вывод:

Compiling playground v0.0.1 (/playground)
Finished dev [unoptimized + debuginfo] target(s) in 1.56s
Running `target/debug/playground`
[src/main.rs:14] output = [
    CarInfo {
        name: "vaz",
        model: "2107",
    },
    CarInfo {
        name: "gaz",
        model: "3102",
    },
]


Важный момент, который надо учитывать: в такой реализации структура не может пережить данные, на которые ссылаются ее поля.
Ответ написан
Ваш ответ на вопрос

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

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