la rouille de la syntaxe:raison pour &mut foo au lieu de &foo dans la rouille quand foo déclaré mut

StackOverflow https://stackoverflow.com//questions/25091631

  •  02-01-2020
  •  | 
  •  

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top