Array sono diversi tipi di fette. In particolare, gli array hanno una dimensione fissa, nota al momento della compilazione. Le fette hanno una dimensione fissa, ma note solo in fase di esecuzione.
Vedo qui due scelte dirette (vedere Levans answer for another). Il primo è quello di cambiare la vostra funzione per accettare solo i riferimenti alle matrici (o l'intera matrice, se si può copiare o non dispiace rinunciare proprietà):
fn foo(a: &[[f64; 4]; 3], x: &[f64; 3]) {
for i in 0..3 {
for j in 0..4 {
println!("{}", a[i][j]);
}
}
}
fn main() {
let a = [
[1.1, -0.2, 0.1, 1.6],
[0.1, -1.2, -0.2, 2.3],
[0.2, -0.1, 1.1, 1.5],
];
let x = [0.0; 3];
foo(&a, &x);
}
L'altro cambiamento semplice è quello di rendere la sua dichiarazione in riferimenti:
fn foo(a: &[&[f64]], x: &[f64]) {
for i in 0..3 {
for j in 0..4 {
println!("{}", a[i][j]);
}
}
}
fn main() {
let a = [
&[1.1, -0.2, 0.1, 1.6][..],
&[0.1, -1.2, -0.2, 2.3][..],
&[0.2, -0.1, 1.1, 1.5][..],
];
let x = [0.0; 3];
foo(&a, &x);
}
noti che questo secondo esempio, si può usare la coercizione implicito di un riferimento ad un array ad una fetta, quando abbiamo appena passiamo &a
e &x
. Tuttavia, non può contare su questo per i dati nidificati in. a
è già stato definito come array di matrici e non è possibile modificare il tipo di elemento.
Anche un parola di cautela - si dovrebbe davvero utilizzare il metodo di lunghezza della fetta nelle gamme, altrimenti si può facilmente panic!
se si cammina fuori alla fine.
fn foo(a: &[&[f64]], x: &[f64]) {
for i in 0..a.len() {
let z = &a[i];
for j in 0..z.len() {
println!("{}", z[j]);
}
}
}
Altri cambiamenti stilistici ho fatto per soddisfare lo stile di Rust: le variabili
- sono
snake_case
- spazio dopo
:
- spazio dopo
;
- spazio intorno
=
- spazio dopo
,
Che ne dite di [questo] (http://is.gd/rcKOUw)? – andars