녹 syntax:유&mut foo 대신 및 푸에서 녹을 때 foo 선언 mut
문제
C 루틴
MPI_Comm_rank(MPI_Comm comm, int *rank);
녹 외국인 기능을 인터페이스이 될 수 있는 다음과 같이 선언 this:
extern crate libc;
use libc::{c_int};
#[link(name = "mpi")]
extern {
fn MPI_Comm_rank(mpi_comm: c_int,
rank: *mut c_int);
}
내가 바인딩은 다음과 같이 작동하는지만,나에게 왼쪽에 대해 의아해 syntax:
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)}
}
내가 원래도
unsafe {MPI_Comm_rank(MPI_COMM_WORLD, &rank)}
하지만 이렇게 컴파일러에 오류가:
mismatched types: expected `*mut i32` but found `&i32` (values differ in mutability)
나는 선언'순위'로 mut,그래서 무엇이 있나요?
해결책
당신이 conflating 두 개의 완전히 고유한 기능입니다.
let mut x;
게 변경할 수 바인딩 x
, 수정할 수 있도록 무엇 x 에 바인딩(x = 42
다)및 비 reference 유형이 그 내용을 수정할 수(x.y = 42
).지 않을 제어하는 가변성의 대상 의 참조가 있습니다.
이것은 다른 유형의 참조를 다루고 있습니다.
&mut T
은 변경 가능한 참조할 수 있도록 강요하는*mut T
.&T
은 변경할 수 없는 참조할 수 있도록 강요하는*const T
.
로는 함수를 호출을 원 *mut T
, 로 전달해야 합니다 그것은 *mut T
나 &mut T
; *const T
나 &T
하지 않습니다.
확실히,당신이 취할 수 변경 가능한 참조하여 변경 가능한 데이터를,그래서 let x = 42; &mut x
적으로 작동하지 않을 필요 let mut x
대 let x
, 지만,그는 아직 완전히 고유의 일부 녹 규정에 대한 가변성.
다른 팁
귀하의 기능을 기대 *mut c_int
포인(변경 가능한 원 포인터),그리고 당신이 사용할 필요가 &mut
연산자를 얻습니다.그러나,당신은 당신이 걸릴 수 있습니다 &mut
포인터 mut
변수에 따라서 필요하신 선언 rank
변수 mut rank
.
는 경우에 당신의 기능 예상 *const c_int
포인터,당신은 당신을 사용할 수있을 것입 &
, 지만,이 경우되지 않습니다.