В rustc 1.0.0 я хотел бы написать функцию, которая мутирует двумерный массив, предоставленный вызывающим. Я надеялся, что это будет работать:Mutable многомерный массив как аргумент функции
fn foo(x: &mut [[u8]]) {
x[0][0] = 42;
}
fn main() {
let mut x: [[u8; 3]; 3] = [[0; 3]; 3];
foo(&mut x);
}
Он не может скомпилировать:
$ rustc fail2d.rs
fail2d.rs:7:9: 7:15 error: mismatched types:
expected `&mut [[u8]]`,
found `&mut [[u8; 3]; 3]`
(expected slice,
found array of 3 elements) [E0308]
fail2d.rs:7 foo(&mut x);
^~~~~~
error: aborting due to previous error
Я считаю, что это говорит мне, что мне нужно как-то кормить функцию ломтик ломтиками, но я не знаю, как это построить.
Он «работает», если я жестко закодирую длину вложенного массива в сигнатуре функции. Это неприемлемо, поскольку я хочу, чтобы функция работала на многомерных массивах произвольного размера:
fn foo(x: &mut [[u8; 3]]) { // FIXME: don't want to hard code length of nested array
x[0][0] = 42;
}
fn main() {
let mut x: [[u8; 3]; 3] = [[0; 3]; 3];
foo(&mut x);
}
tldr; любые способы нулевой стоимости передачи ссылки на многомерный массив, так что функции используют выражения типа $ x [1] [2] = 3; $?
вас может заинтересовать https://github.com/rust-lang/rfcs/issues/1038 и соответствующий PR о параметрах общего значения –