编写通用交换函数

2024-02-03

我正在尝试学习 Rust 并想编写一个简单的通用交换函数

fn swap<T>(i: &mut T, j: &mut T) {
    let tmp: T = *i;
    *i = *j;
    *j = tmp;
}
fn main() {
    let i: &int = &mut 5;
    let j: &int = &mut 6;
    println!("{} {}", i, j);
    swap(i, j);
    println!("{} {}", i, j);
}

但编译器会抛出错误消息:

helloworld.rs:2:18: 2:20 error: cannot move out of dereference of `&mut`-pointer
helloworld.rs:2     let tmp: T = *i;
                                 ^~
helloworld.rs:2:9: 2:12 note: attempting to move value to here
helloworld.rs:2     let tmp: T = *i;
                        ^~~
helloworld.rs:2:9: 2:12 help: to prevent the move, use `ref tmp` or `ref mut tmp` to capture value by reference
helloworld.rs:2     let tmp: T = *i;
                        ^~~
helloworld.rs:3:10: 3:12 error: cannot move out of dereference of `&mut`-pointer
helloworld.rs:3     *i = *j;
                         ^~
helloworld.rs:13:10: 13:11 error: cannot borrow immutable dereference of `&`-pointer `*i` as mutable
helloworld.rs:13     swap(i, j);
                          ^
helloworld.rs:13:13: 13:14 error: cannot borrow immutable dereference of `&`-pointer `*j` as mutable
helloworld.rs:13     swap(i, j);
                             ^
error: aborting due to 4 previous errors

我对 Rust 真的很陌生,我真的无法以任何方式处理这个错误。希望有人能够解释出了什么问题以及原因。


指针解引用的问题在于它违反了 Rust 的移动语义。你的函数正在借用对i and j,即使您可以修改借用的值 - 例如:

fn assign<T>(i: &mut T, j: T) {
   *i = j;
}

完全没问题——你不能将借用的值“移动”到其他地方,即使是临时变量。这是因为借用仅在函数调用期间持续,并且通过移动值,您将所有权转移给函数,这是不允许的。

解决这个问题的一种方法(不使用unsafe http://doc.rust-lang.org/guide-unsafe.htmlcode)是通过复制值而不是移动它。你可以限制T实施Clone特征,它允许您复制值,而不影响原始借用的值:

fn swap<T: Clone>(i: &mut T, j: &mut T) {
    let tmp = i.clone();
    *i = j.clone();
    *j = tmp;
}
fn main() {
    let i: &mut int = &mut 5;
    let j: &mut int = &mut 6;
    println!("{} {}", i, j);
    swap(i, j);
    println!("{} {}", i, j);
}

另请注意我必须做i and j &mut int,因为在您的代码中您一成不变地借用了对值的引用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写通用交换函数 的相关文章

随机推荐

  • 具有特殊条件的子集和

    在您回复另一个问题的链接或将其作为重复项关闭之前 请仔细阅读该问题 这与该问题的标准变体不同 我已经搜索了很长时间 所以我很确定没有这里没有这样的问题 我需要找到是否最小可能的S这是一些的总和X i 的子集那是 gt T 某个目标值 小于全
  • elasticsearch索引已删除

    我的 Elasticsearch 服务器面临严重问题 我在 symfony2 项目上使用 ES 1 7 和 fosElasticaBundle 今天ES索引被删除了两次 我也搞不懂为什么 以下是我可以在 cluster log 中读取的日志
  • Tensorflow 入门 - 将图像分割为子图像

    这是我第一次使用卷积神经网络和 Tensorflow 我正在尝试实现一个能够extract来自数字视网膜图像的血管 我正在与公开可用的驱动数据库 http www isi uu nl Research Databases DRIVE 图像为
  • 将 C++ 中的 unicode 字符串转换为大写

    我们如何在 C 或 C 中将多语言字符串或 unicode 字符串转换为大写 小写 如果您的系统已经采用 UTF 8 请使用std use facet http en cppreference com w cpp locale use fa
  • laravel:在 null 上调用成员函数 delete()

    当我尝试通过单击删除按钮向帖子添加删除功能时 出现此错误 我哪里做错了 删除PostController中的post函数 public function getDeletePost post id post Post where id po
  • 在 bash 中将数组作为参数传递

    如何将数组作为参数传递给 bash 函数 你可以通过多个数组作为参数使用这样的东西 takes ary as arg declare a argAry1 1 echo argAry1 declare a argAry2 2 echo arg
  • 在 IOStreams 库中使用ignore(numeric_limits::max()) 是否可以处理任意大量的流?

    在 C 标准 第 27 6 1 3 24 节 中 对于 流媒体ignore IOStreams 库中的函数 这意味着如果您为 n 提供一个参数numeric limits max 它将继续忽略字符 永远直到找到分隔符 甚至远远超出实际 流大
  • Scala 的元组展开的细微差别

    当尝试将元组展开为 val 时 我注意到 scala 中的以下行为 scala gt val A B C 1 2 3
  • 应用程序未在发布模式下进入 Posix 信号处理程序

    我正在尝试在 Linux Arm 设备上正常关闭我的控制台应用程序 发送的信号是SIGTERM 我用新的实现了 Posix 信号处理程序PosixSignalRegistration Create https learn microsoft
  • stringdist 包中的 Jaccard 相似度来匹配字符串中的单词

    我想使用 stringdist 函数中的 Jaccard 相似度来确定词袋的相似度 据我所知 使用 Jaccard 只能匹配字符串中的字母 c lt c cat dog person d lt c cat dog ufo stringdis
  • 如何使用 Maven 使用私钥通过 SCP 进行部署

    在Windows上使用Maven 通过SCP传输 使用私钥 这似乎是一个非常简单且有记录的过程 但这对我不起作用 在settings xml中
  • 在 2 个 Android 应用程序之间共享 SQLite 数据库?

    我需要在两个应用程序之间共享一个数据库 我知道数据库将在 data data MY PACKAGE databases 上创建 由于包名称不同 当我在任一应用程序上创建数据库时 是否可以定义一个包名称的路径 谢谢 更新 下面描述的方法依赖于
  • Javascript 类与对象,优缺点?

    在我最近的 javascript 程序中 主要是为了乐趣和概念验证 我有很多不同类型的对象 并且每种对象都有相当数量的 实例 所以我想我应该为这些使用类 但是由于它们非常简单 我可以直接直接构造它们而不是使用类 我的意思的例子 I m ma
  • 使用 pyodbc 将 pandas 数据帧高效插入到 MS SQL Server

    我正在尝试使用 pyodbc 将 pandas 数据帧更新插入到 MS SQL Server 我之前使用过类似的方法来进行直插入 但是这次我尝试的解决方案非常慢 有没有比我现有的更简化的方法来完成更新插入 sql connect pyodb
  • ElasticSearch:嵌套查询未返回所需结果

    我是 Elastic Search 的新手 在实现一些查询时遇到一些问题 以下是我的索引结构 cl 1 aliases mappings properties timestamp type date version type long cl
  • write.table 到新目录

    有没有办法使用 write 和 write table 使输出文件位于与工作目录不同的目录中 它尝试在文件名之前设置输出文件的路径 但只收到一条错误消息 如果您使用的是 Windows R如果看到的话就会知道要走出当前目录C 首先 可能还有
  • 如何将 MongoDB 查询转换为字典

    我的 MongoDB 中有一个集合 userId 1234 name Mike userId 1235 name John 我想得到表格的结果 dict userId document 换句话说 我想要一个结果 它是一个字典 其中userI
  • Python mechanize - 两个“提交”类型的按钮

    我有一个用 python 编写的 mechanize 脚本 它填写了一个 Web 表单 并且应该单击 创建 按钮 但有一个问题 表单有两个按钮 一种用于 添加附加文件 一种用于 创建 两者都是 提交 类型 附加按钮是列出的第一个按钮 因此
  • Inception v3 采用 Base64 图像在 google ml 引擎上进行预测

    我正在尝试更改我的初始网络 用 keras 编码 以采用 Base64 图像字符串作为预测的输入 之后 我想将其保存为张量流 pb 文件 网络 因为这是 Google ml 引擎所需要的 正常的预测方法是这样的 img image jpg
  • 编写通用交换函数

    我正在尝试学习 Rust 并想编写一个简单的通用交换函数 fn swap