生锈语法:当 foo 声明为 mut 时,在 rust 中使用 &mut foo 而不是 &foo 的原因
题
对于像这样的 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
指针,您将能够使用 &
, , 但这种情况并非如此。
不隶属于 StackOverflow