Мне нужно передать ссылку на массив ссылок на массивы (или нарезку срезов) следующей функции в 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;
}