我有一个简单的算法,可以用欧几里得算法计算两个数的最大公约数.如您所见,该函数获取两个I32的所有权,并返回一个I32.我对borrow 判断器的理解是,因为I32实现了复制,所以这段代码应该没问题.然而,编译器告诉我,我需要声明变量是可变的.

fn euclid_gcd(a: i32, b: i32)  -> i32 {
    while a != b {
        if a > b {
            a = a - b
        }
        else {
            b = b - a
        }
    }

    a
}

-->

fn euclid_gcd(mut a: i32, mut b: i32)  -> i32 {

我已经进行了建议的更改,代码运行良好,但我仍然不明白为什么需要这样做.你能告诉我我错过了什么吗?

推荐答案

你只能改变可变绑定中的变量,fn name(a: i32)a创建了一个不变的绑定,mut a是我们让它变来变go 的方式.Let绑定也是如此:let a = 99;创建了一个不变的绑定,为了使其成为可变的,我们使用let mut a = 99;

Rust相关问答推荐

Rust,polars CSV:有没有一种方法可以从impll BufRead(或任何字节迭代器)中读取CSV?

如何访问Rust存储值的内存地址

如何在Bevy/Rapier3D中获得碰撞机的计算质量?

如何导入crate-type=[";cdylib;]库?

S,一般性状和联想型性状有什么不同?

铁 rust ,我的模块介绍突然遇到了一个问题

异步函数返回的future 生存期

如何go 除多余的(0..)在迭代中,当它不被使用时?

如何使用Actix Web for Rust高效地为大文件服务

失真图像图形捕获Api

通过mem::transmute将数组展平安全吗?

trait 对象指针的生命周期

一旦令牌作为文字使用,声明宏不匹配硬编码值?

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

是否可以通过可变引用推进可变切片?

使用 traits 时,borrow 的值不会存在足够长的时间

从现有系列和 map 值创建新系列

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

当用作函数参数时,不强制执行与绑定的关联类型

如何从 Rust 应用程序连接到 Docker 容器中的 SurrealDB?