Rust 中比较函数的相等性

2024-02-04

我有一个函数,它接受一个数字作为参数,然后根据该数字返回一个函数。根据许多不同的情况,它可能会返回约 50 个函数中的任何一个,并且它应该返回哪个函数的情况变得非常复杂。因此,我想构建一些测试以确保返回正确的函数。到目前为止我所拥有的看起来大致是这样的。

fn pick_a_function(decider: u32) -> fn(&mut SomeStruct) {
    match decider {
        1 => add,
        2 => sub,
        _ => zero,
    }
}

fn add(x: &mut SomeStruct) {
    x.a += x.b;
}

fn sub(x: &mut SomeStruct) {
    x.a -= x.b;
}

fn zero(_x: &mut SomeStruct) {
    x.a = 0;
}

fn main() {
    let mut x = SomeStruct { a: 2, b: 3 };
    pick_a_function(1)(&mut x);

    println!("2 + 3 = {}", x.a);
}

#[cfg(test)]
mod tests {
    use super::*;

    fn picks_correct_function() {
        assert_eq!(pick_a_function(1), add);
    }
}

问题是这些功能似乎没有实现Eq or PartialEq的特质,所以assert_eq!只是说它无法比较它们。我有哪些选项可以将返回的函数与正确的函数进行比较?


所以 Rust 中的函数实际上确实实现了PartialEq只要没有附加生命周期,并且函数接受的参数少于 10 个。这个限制是因为每种形式的函数签名都必须直接实现特征,因为编译器认为它们都是完全不相关的类型。

我返回的函数采用了对结构的可变引用,这隐式地赋予了函数一个生命周期,因此它们不再具有实现的类型签名PartialEq。 rust 真正在内部所做的就是比较函数相等性,尽管将它们都转换为指针然后进行比较,所以我们实际上可以做同样的事情。

#[cfg(test)]
mod tests {
    use super::*;

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

Rust 中比较函数的相等性 的相关文章

随机推荐

  • 如何使FactoryGirl.create影响另一条记录的属性?

    在网上商店应用程序中 通常在booking一个产品的预订控制器创建动作执行order save这反过来又激活必要的 before save 方法order sum of all bookings 当为查看订单列表的管理员构建 RSpec 测
  • 以字段名称作为参数的表达式谓词

    我使用这段代码 在 stackoverflow 上找到 来生成谓词 static class BuilderPredicate public static Expression
  • 错误 1 ​​libavcodec.so 文件格式无法识别 Android GL 动态壁纸

    我正在尝试为 android 制作一个动态壁纸 播放位于 android asset 设备上的 mp4 视频 以我正在使用的示例为例 它实际上在运行时将文件复制到 SD 卡 无关紧要 我找到了这个example https github c
  • Angular 5 按日期排序

    我有一张课程表 我想按日期排序 由于 Angular 5 没有 orderBy 管道 并且到目前为止我找到的所有解决方案都只能应用于数字和字符串 如果有人可以帮助我 我将不胜感激 这是我的桌子的主体 tbody tr th lesson d
  • 如何使用 sed (或类似的)删除两个 html 标签之间的所有行?

    我有一个如下所示的文件 lt stuff gt lt stuff gt 我试图删除 HEAD 标签之间 包括 HEAD 标签 之间的所有内容 但似乎无法使其工作 我想 sed i e s lt HEAD gt g file HTML 应该可
  • 将逻辑 and 应用于布尔值列表

    考虑以下 Scala 中的布尔值列表 List true false false true 您将如何使用foldRight 或foldLeft 模拟对列表中的所有值执行逻辑AND 的功能 而不是使用foldLeft Right 您还可以使用
  • 为什么切片[:-0]在Python中返回空列表

    今天在编写一些单元测试时偶然发现了一些有点令人困惑的事情 blah a b c blah 3 blah 2 a blah 1 a b blah 0 我一生都无法弄清楚为什么blah 0 应该是这样 该模式似乎绝对表明它应该是 a b c 任
  • Webclient 双向使用二进制文件

    网络客户端 http msdn microsoft com en us library system net webclient 28v vs 95 29 aspx用于将指令文件 最多 1 兆字节 上传到服务器 并以二进制数据形式接收该操作
  • 将自定义对象附加到 Qt 中的 QStandardItem

    我在用着QTreeView向用户显示一些数据 我想要的是将一个实际对象附加到使用表示的每个节点QStandardItem 将对象引用保存到QStandardItem QStandardItem child new QStandardItem
  • Hibernate FetchMode SELECT 与 JOIN

    我有以下课程 Entity public class TestContentElementResponse Id GeneratedValue strategy GenerationType AUTO protected Long id O
  • 通过 SSL 传递时的 Cookie 安全性

    我是否正确地认为 如果您通过 SSL 加密请求传递会话 cookie 则该 cookie 只能由能够直接访问 cookie 发送到的计算机或发送 cookie 的服务器的攻击者读取 前提是他们无法破解加密 SSL 加密所有流量 包括标头 其
  • PHP - 未定义的变量

    我正在做一些练习PHP 和 MySQL 初学者塔克先生 在他的示例中一切正常 但在我的电脑上出现错误 注意 未定义变量 passwordRetrieved 在 C wamp www loginForm php 第 39 行 此示例的完整 P
  • 我们如何在VB.Net控制台应用程序中使用定时器控件?

    我正在尝试在控制台应用程序中使用计时器控件 Friend WithEvents XTIMER As System Windows Forms Timer 我正在设置它的所有属性 我已将间隔设置为 15000 毫秒 但即使我将计时器控件的启用
  • 无法在 windows7 上打开请求的 SVN 文件系统

    在 Windows 7 上使用 subversion 配置 apache httpd 时 出现以下错误 我已经安装了不同类型版本的 SVN 和 apache 我仍然面临这个问题 可以请有人帮助我解决这个问题 svn version 1 9
  • 向 MongoDB 中的 $lookup 结果添加一个字段

    我正在尝试使用 node js MongoDB 驱动程序向查找结果添加一个字段 用户有两种提要 1 他或她自己的提要和 2 共享提要 所以我需要同时获得两者 然后将它们结合起来 这是我原来的查询 效果很好 client db atlas c
  • 使用 Google Apps 脚本从 Google Firebase 写入 Google Sheets

    尝试检索存储在名为 条目 的节点下的 google firebase 中的表单条目 并使用 google 表格中的脚本编辑器附加到 google 表格 我已将 FirebaseApp 库添加到 Google Sheet 脚本编辑器中 然后我
  • 移动第二列中的 li 项目 - 仅限 CSS

    I have UL and LI列表和最大项目数为 10 如果超过 5 个项目 我试图将项目移动到第二列 并且只想使用 CSS 进行处理 我尝试使用 CSS3 Column 但它与所有项目一起进入第二列 如何做我确保将超过 5 个的项目移至
  • 在虚拟服务器上运行外部程序

    我想将可通过命令行 Linux 操作系统 访问的小程序安装到服务器并使用 PHP 运行它们 我想在我的机器上安装 Apache vhost 有没有办法在我的虚拟服务器 我的系统上运行这些外部应用程序 以便我可以尝试 PHP 调用 我们一直都
  • Jenkins CI:如何在 SVN 提交上触发构建

    我需要设置哪些插件和插件功能才能让我的 Jenkins 作业在代码提交到 SVN 项目时触发构建 我已经安装了标准 SVN 插件以及 SVN 标记插件 但我没有看到任何允许触发器配置的新功能 有两种方法可以解决这个问题 我最初推荐第一个选项
  • Rust 中比较函数的相等性

    我有一个函数 它接受一个数字作为参数 然后根据该数字返回一个函数 根据许多不同的情况 它可能会返回约 50 个函数中的任何一个 并且它应该返回哪个函数的情况变得非常复杂 因此 我想构建一些测试以确保返回正确的函数 到目前为止我所拥有的看起来