生锈语法:当foo声明为mut时,原因为&mut foo而不是&foo in rust

Rob*_*ham 3 syntax ffi rust

对于常规的喜欢

MPI_Comm_rank(MPI_Comm comm, int *rank);
Run Code Online (Sandbox Code Playgroud)

rust外部函数接口可以这样声明:

extern crate libc;
use libc::{c_int};

#[link(name = "mpi")]
extern {
    fn MPI_Comm_rank(mpi_comm: c_int,
                     rank: *mut c_int);
}
Run Code Online (Sandbox Code Playgroud)

我这样调用绑定,这有效,但让我对语法感到困惑:

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)}
}       
Run Code Online (Sandbox Code Playgroud)

我最初尝试过

unsafe {MPI_Comm_rank(MPI_COMM_WORLD, &rank)}
Run Code Online (Sandbox Code Playgroud)

但这会产生编译错误:

mismatched types: expected `*mut i32` but found `&i32` (values differ in mutability)
Run Code Online (Sandbox Code Playgroud)

我宣称'等级'为mut,所以给出了什么?

Chr*_*gan 7

你将两个截然不同的特征混为一谈.

let mut x;进行可变绑定x,允许您修改x绑定到的(x = 42)和非引用类型以修改其内容(x.y = 42).它不控制引用目标的可变性.

这与您正在处理的参考类型不同.

  • &mut T是一个可变参考,可以强制执行*mut T.

  • &T是一个不可变的引用可以被强制*const T.

由于您要调用的功能需要*mut T,您必须将其传递给a *mut T或a &mut T; *const T&T不会这样做.

可以肯定,你只能拿一个可变引用可变数据,所以let x = 42; &mut x它需要不工作let mut x,而不是let x,但是这仍然是完全不同,是铁锈的有关规则的可变性的一部分.