当前位置: 首页 > 知识库问答 >
问题:

在Rust中,什么是'fn()->()'?

颛孙正卿
2023-03-14

我掌握了Fn(大写字母F)特征:FnFnMutFnonce。我明白它们是特征,并且像特征一样工作。

但是fn(lowercase-f)呢?它在编辑器中得到了不同的颜色,这告诉我它不是一个特性。它也可以在其他地方不能使用的地方使用(反之亦然),尽管它在其他情况下似乎表现相似。我在文档中找不到任何直接解释它的东西。

共有3个答案

松雅健
2023-03-14

fn是函数指针的类型。另请参见以下文档:https://doc.rust-lang.org/std/primitive.fn.html

端木朝
2023-03-14

它是一种函数指针类型。

它只引用函数,而不是闭包,因为它只包含函数的地址,而不是闭包需要的捕获环境。

AFntrait(大写F)可以指闭包或函数。

龙正初
2023-03-14

Rust有三种类似功能的类型:

>

  • 函数项是您使用fn foo(){...}创建函数时获得的。它也是类元组结构或枚举变体的构造函数的类型。函数项的大小为零(它们不包含数据),并且每个非泛型函数都有一个唯一的、无法命名的函数项类型。在错误消息中,编译器将这些“伏地魔类型”显示为类似于fn()-

    闭包是与函数项类似的值,但闭包可能包含数据:它们从环境中捕获的任何变量的副本或引用。如您所知,您可以使用闭包语法(|args | expression)创建闭包。与函数项一样,闭包也有唯一的、不可度量的类型(由编译器呈现,比如[closure@src/梅因。rs:4:11:4:23])。

    函数指针就是你要问的:看起来像fn()的类型-

    函数项和闭包在可能的情况下会自动强制为相关的函数指针类型,这就是为什么let f:fn(i32)=|u124;() 有效:因为闭包不捕获任何内容,所以可以将其强制为函数指针。

    这三种类似函数的类型都实现了相关的FnFnMutFnOnce特征(除了闭包可能不会实现FnFnMut,这取决于它们捕获的内容)。函数项和函数指针还实现了复制克隆发送同步(闭包仅在其所有内容都实现时才实现这些特性)。

    就性能而言,函数指针是泛型和特征对象之间的折衷。它们必须被解除引用才能被调用,因此调用函数指针可能比直接调用函数项或闭包慢,但仍然比调用dyn Fntrait对象快,后者除了间接调用外还涉及vtable查找。然而,在真实的代码中,有许多变量会混淆天真的分析;如果性能差异对你很重要,你应该衡量它,而不是猜测哪个更快。

    • fn项目和fn指针的实际区别是什么

  •  类似资料:
    • 作为学习Rust的一个简单练习,我决定实现一个简单的二进制搜索: 在构建时,我得到了这个我不理解的错误。什么是类型?变量mid始终是usize,但即使使用cast,我也会遇到这个编译错误。

    • 问题内容: 我已经看到了声明,接口和类 这是什么意思? 问题答案: 没有证据,我相信您在谈论Java的泛型支持… 泛型允许您抽象类型 在Java 5之前,很难提供能够支持多种不同类型的Objects的类而不必为每种特定情况编写代码,因此人们通常会这样做。 这导致在运行时做出许多困难的选择,您必须进行运行时检查以查看是否有可能将给定的Object强制转换为可用类型…例如 现在,这已经很明显了,但是如

    • Rust的枚举是代数数据类型。据我所知,这似乎包含了struct是什么。struct有什么不同之处需要保留它?

    • 如果我在Rust中运行这些基准测试: 结果是: 每次通话121-6=115纳秒。 但Java的基准相同: 给我: Rust中的原木速度约为Java中的3.7倍(115/31)。 当我测试斜边实现()时,Rust中的实现速度是Java中的15.8倍。 我是否编写了糟糕的基准测试,或者这是一个性能问题? 回复评论中提出的问题: > 我使用总是在发布模式下运行的运行Rust的基准测试。 Java基准测试

    • 本文向大家介绍在redux中,什么是action?相关面试题,主要包含被问及在redux中,什么是action?时的应答技巧和注意事项,需要的朋友参考一下 state的改变,会导致view的变化,而我们只能接触view,action相当于view发出修改state的通知

    • 问题内容: 从http://twitto.org/ Twitto使用PHP 5.3中提供的几个新功能: 将 DIR 不变 运营商 匿名功能 2 在PHP 5.3中与 ?: 有什么关系? 另外,匿名功能是什么意思?那不是已经存在了一段时间了吗? 问题答案: 是条件运算符的一种形式,以前只能用于: 在5.3中,可以省略中间部分,例如,它等效于: 从手册: 从PHP 5.3开始,可以省略条件运算符的中间