la rouille de la syntaxe:raison pour &mut foo au lieu de &foo dans la rouille quand foo déclaré mut
Question
Pour une routine c comme
MPI_Comm_rank(MPI_Comm comm, int *rank);
la rouille étrangères interface de la fonction peut être déclaré comme ceci:
extern crate libc;
use libc::{c_int};
#[link(name = "mpi")]
extern {
fn MPI_Comm_rank(mpi_comm: c_int,
rank: *mut c_int);
}
J'appelle la liaison de ce genre, qui fonctionne, mais m'a laissé perplexe sur la syntaxe:
pub static MPI_COMM_WORLD : libc::c_int = 0x44000000;
fn main() {
let mut rank: c_int = 999999;
/* but why '&mut rank' and not simply '&rank' ? */
unsafe {MPI_Comm_rank(MPI_COMM_WORLD, &mut rank)}
}
J'ai d'abord essayé
unsafe {MPI_Comm_rank(MPI_COMM_WORLD, &rank)}
mais ce qui donne une erreur de compilation:
mismatched types: expected `*mut i32` but found `&i32` (values differ in mutability)
J'ai déclaré "rang" que mout, donc, ce qui donne?
La solution
Vous êtes de juxtaposer deux caractéristiques distinctes.
let mut x;
fait une liaison mutable x
, vous permettant de modifier ce que x est lié à (x = 42
) et pour les non-types de référence pour modifier son contenu (à l'x.y = 42
).Il ne contrôle pas la mutabilité de la cible de références.
Ceci est différent du type de références que vous avez affaire.
&mut T
est une mutable référence et peut être contraint à*mut T
.&T
est immuable de référence peut être contraint à*const T
.
Que la fonction que vous appelez veut *mut T
, vous devez passer un *mut T
ou un &mut T
; *const T
ou &T
ne le fera pas.
Pour être sûr, vous ne pouvez prendre une mutable référence à mutable données, de sorte let x = 42; &mut x
ne fonctionne pas comme il se doit let mut x
au lieu de let x
, mais c'est encore tout à fait distinctes, et est une partie de la Rouille du règlement concernant la mutabilité.
Autres conseils
Votre fonction s'attend à *mut c_int
pointeur (une mutable pointeur brut), et vous avez besoin d'utiliser &mut
opérateur de les obtenir.Cependant, vous ne pouvez prendre &mut
pointeur vers mut
variables, par conséquent, vous devez déclarer rank
variable mut rank
.
Si votre fonction attendue *const c_int
pointeur, vous serez en mesure d'utiliser &
, mais ce n'est pas le cas.