生锈语法:当 foo 声明为 mut 时,在 rust 中使用 &mut foo 而不是 &foo 的原因

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

  •  02-01-2020
  •  | 
  •  

对于像这样的 c 例程

MPI_Comm_rank(MPI_Comm comm, int *rank);

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

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

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

我这样称呼绑定,它有效,但让我对语法感到困惑:

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)

我将“rank”声明为 mut,那么什么给出呢?

有帮助吗?

解决方案

您正在混淆两个完全不同的功能。

let mut x; 进行可变绑定 x, ,允许您修改 x 绑定的内容 (x = 42)并且对于非引用类型修改其内容(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, ,但这仍然是完全不同的,并且是 Rust 关于可变性规则的一部分。

其他提示

你的函数期望 *mut c_int 指针(可变的原始指针),并且您需要使用 &mut 运算符来获取它。然而,你只能采取 &mut 指向 mut 变量,因此你需要声明 rank 变量为 mut rank.

如果你的函数期望 *const c_int 指针,您将能够使用 &, , 但这种情况并非如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top