Передать массив массивов (или кусочек срезов) в Rust - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужно передать ссылку на массив ссылок на массивы (или нарезку срезов) следующей функции в Rust

const LNGTH: usize = 5;

fn swap_array<T>(x: &mut [&[T; LNGTH]]) {
    let temp = x[1];
    x[1] = x[0];
    x[0] = temp;
}

Проблема в том, что, похоже, мне нужно указать длину массивадля «внутренних» массивов (здесь: LNGTH).

Итак, следующий код работает нормально:

fn main() {
    let x_array: [i32; LNGTH] = [5,2,8,9,1];
    let x_other: [i32; LNGTH] = [6,7,6,7,6];        
    let mut y_array: [&[i32; LNGTH]; 2] = [&x_array, &x_other];
    println!("before : {:?}", y_array);
    swap_array(&mut y_array);
    println!("after  : {:?}", y_array);    
} 

Но если я изменю сигнатуру swap_array на fn swap_array<T>(x: &mut [&[T]]), Я получаю следующую ошибку:

error[E0308]: mismatched types
  --> src/main.rs:14:16
   |
14 |     swap_array(&mut y_array[..]);
   |                ^^^^^^^^^^^^^^^^ expected slice, found array of 5 elements
   |
   = note: expected type `&mut [&[_]]`
              found type `&mut [&[i32; 5]]`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
error: Could not compile `tut_arrays`.

С точки зрения C, я хотел бы иметь функцию, которая принимает аргументы типа T**.Соответствующая функция в C будет выглядеть так:

void swap_arrays(my_type ** x) {
    my_type* temp = x[1];
    x[1] = x[0];
    x[0] = temp;
}

1 Ответ

0 голосов
/ 26 ноября 2018

Вот версия ломтиков ломтиков:

const LEN: usize = 5;

fn swap_array<T>(x: &mut [&[T]]) {
    let temp = x[1];
    x[1] = x[0];
    x[0] = temp;
}

fn main() {
    let x_array: [i32; LEN] = [5, 2, 8, 9, 1];
    let x_other: [i32; LEN] = [6, 7, 6, 7, 6];
    let mut y_array: [&[i32]; 2] = [&x_array, &x_other];
    println!("before : {:?}", y_array);
    swap_array(&mut y_array);
    println!("after  : {:?}", y_array);
}

Вы должны изменить формальный аргумент на ломтик ломтиков, и элементы y_array тоже должны быть ломтиками (последнийв основном то, что говорится в сообщении об ошибке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...