为什么 Fn 派生自 FnMut(FnMut 派生自 FnOnce)?

2024-03-01

如果您查看Rust 官方文档 https://doc.rust-lang.org/std/ops/trait.Fn.html,你看到这个特质Fn源自FnMut,或者,实施Fn,你必须实施FnMut(在那之后FnOnce since FnMut也源自于此)。

为什么会这样?我简直无法理解这一点。是因为你可以调用每个Fn as a FnOnce or FnMut?


最好的参考是优秀的在 Rust 中寻找封闭 http://huonw.github.io/blog/2015/05/finding-closure-in-rust/博客文章。我将引用重要部分:

有三个特征,因此可以实现七个非空特征集……但实际上只有三个有趣的配置:

  • Fn, FnMut and FnOnce,
  • FnMut and FnOnce,
  • only FnOnce.

为什么?嗯,这三个闭包特征实际上是三个嵌套集:每个实现的闭包Fn还可以实施FnMut (if &self works, &mut self也有效;证明:&*self),类似地,每个闭包实现FnMut还可以实施FnOnce。此层次结构在类型级别强制执行

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

为什么 Fn 派生自 FnMut(FnMut 派生自 FnOnce)? 的相关文章

  • 如何指定 AsRef 的生命周期?

    我正在尝试编写一个函数来连接两个可迭代对象 其项目可以转换为OsStr引用 并且在尝试指定引用的生命周期时遇到了巨大的困难 use std convert AsRef use std ffi OsStr use std marker Pha
  • 当返回使用 StdinLock 的结果时,为什么保留了对 stdin 的借用?

    给定以下函数 use std io BufRead stdin fn foo gt usize let stdin stdin let stdinlock stdin lock stdinlock lines count 无法编译并出现以下
  • clap::App 多次调用方法移动所有权

    即使阅读了有关引用所有权和借用的章节后 我仍然无法理解以下代码中的某些内容 这有效地阻止了我从clap App extern crate clap use clap App fn main let mut app App new name
  • 如何获取在 Rust 中实现特定特征的类型列表?

    我想知道一个实现的结构std io Write 在某些文件中有描述吗 当你查找API for std https doc rust lang org std 您可以在那里搜索您的特质 例如std io Write https doc rus
  • for 循环和 into_iter() [重复]

    这个问题在这里已经有答案了 据我了解 for循环隐式调用into iter 在向量上循环遍历它 但是 在下面的代码中 为什么vec在 Question1 1 的第一个 for 循环中没有消耗 但在第二个 for 循环中 vec 消耗了 fn
  • serde_json::from_str 错误,其中字符串来自文件

    extern crate serde json use serde json Value use std fs File use std io prelude fn main let filepath map test anhui txt
  • 包含原始指针的结构可以实现 Send 并且 FFI 安全吗?

    我有一个场景 Rust 会调用 Cmalloc缓冲区并将结果指针存储到结构中 稍后 该结构将被移动到线程并传递给 C 函数 该函数会对其进行变异 我的问题的天真的方法看起来像这样 extern crate libc use libc c v
  • 将 char 解析为 u32

    正如问题所述 我如何实现这一目标 如果我有这样的代码 let a 29 for c in a chars println c as u32 我得到的是 2 和 9 的 unicode 代码点 50 57 我想要的是将这些字符解析为实际的数字
  • 了解特征和对象安全

    我正在努力学习对象安全的基础知识 如果我有这个代码 struct S x i32 trait Trait Sized fn f self gt i32 where Self Sized fn object safety dynamic x
  • 为什么 String 不实现 From<&String>?

    背景 我知道 Rust 人们更喜欢 str而不是 String 但在某些情况下我们只得到 String 一个例子是当你打电话时std iter Iterator peekable 返回值是一个Peekable i 将原始迭代器包装到其中并为
  • 从 WebAssembly .wasm 模块获取 JavaScript 导入对象条目

    我想了解 Rust 程序在编译为 wasm 文件时实际导出的内容 以便我可以提供有效的importObject到实例化函数 WebAssembly instantiate bufferSource importObject 据我了解 执行此
  • 特性与界面

    我最近一直在尝试学习 PHP 我发现自己对 Trait 很着迷 我理解水平代码重用的概念 并且不想必然从抽象类继承 我不明白的是 使用特征与接口之间的关键区别是什么 我尝试寻找一篇不错的博客文章或文章来解释何时使用其中一种 但到目前为止我发
  • 如何对另一个数字进行模运算而不溢出?

    我正在尝试为 Rust 实现快速素性测试u32 and u64数据类型 作为其中的一部分 我需要计算 n n d where n and d are u32 or u64 分别 虽然结果可以很容易地适合数据类型 但我不知道如何计算它 据我所
  • 如何使用diesel-rs选择色谱柱的子集?

    我现在花了几个小时的时间来查询表的可用列的子集以及在其中包含计算 我知道这不是在选择查询中执行计算的最佳方式 但现在 我只是在开发一个原型 它应该是可行的 我在用diesel rs作为后端实现中所有数据库操作的 ORM 数据将存储在 Pos
  • 无法返回对临时值的引用

    我正在尝试学习 Rust 同时我想尝试将结构对象转换为字节数组 但这样做遇到了问题 所以我有这个 struct Node lt a gt id u8 name a str data a str impl lt a gt Node lt a
  • 如何异步读取文件?

    我可以创建一个单独的线程来充当 I O 队列 但我不确定这是否是最好的方法 看起来是最好的 我不知道如何加载本地文件mio https github com carllerche mio 使用 tokio fs read use tokio
  • Rust 元组参考和参考元组

    元组引用和作为类型引用的元组之间有什么关系 为什么第一个有效但第二个不行 let a 1 let b 2 This works c i32 d i32 let c d a b type TupleOfRef lt a gt a i32 a
  • '&&x' 模式匹配是否会导致 x 被复制?

    在文档中std iter 迭代器 filter https doc rust lang org stable std iter trait Iterator html method filter它解释了值通过引用传递给闭包 并且由于许多迭代
  • Java 中的“Lambdifying”scala 函数

    使用Java和Apache Spark 已用Scala重写 面对旧的API方法 org apache spark rdd JdbcRDD构造函数 其参数为 AbstractFunction1 abstract class AbstractF
  • 用于解析 Rust 中的匹配臂的递归宏

    我正在尝试编写一个宏来将一组规则扩展为执行标记匹配的代码 但无法在不导致宏扩展错误的情况下生成正确的代码 我知道我可以通过其他方式处理这个问题 但这里的关键问题不是如何解析令牌 而是如何编写一个可以使用匹配臂递归扩展令牌树的宏 这个想法是我

随机推荐