我掌握了Fn(大写字母F)特征:Fn
,FnMut
,Fnonce
。我明白它们是特征,并且像特征一样工作。
但是fn
(lowercase-f)呢?它在编辑器中得到了不同的颜色,这告诉我它不是一个特性。它也可以在其他地方不能使用的地方使用(反之亦然),尽管它在其他情况下似乎表现相似。我在文档中找不到任何直接解释它的东西。
fn是函数指针的类型。另请参见以下文档:https://doc.rust-lang.org/std/primitive.fn.html
它是一种函数指针类型。
它只引用函数,而不是闭包,因为它只包含函数的地址,而不是闭包需要的捕获环境。
AFn
trait(大写F)可以指闭包或函数。
Rust有三种类似功能的类型:
>
函数项是您使用fn foo(){...}
创建函数时获得的。它也是类元组结构或枚举变体的构造函数的类型。函数项的大小为零(它们不包含数据),并且每个非泛型函数都有一个唯一的、无法命名的函数项类型。在错误消息中,编译器将这些“伏地魔类型”显示为类似于fn()-
闭包是与函数项类似的值,但闭包可能包含数据:它们从环境中捕获的任何变量的副本或引用。如您所知,您可以使用闭包语法(
|args | expression
)创建闭包。与函数项一样,闭包也有唯一的、不可度量的类型(由编译器呈现,比如[closure@src/梅因。rs:4:11:4:23]
)。
函数指针就是你要问的:看起来像
fn()的类型-
函数项和闭包在可能的情况下会自动强制为相关的函数指针类型,这就是为什么
let f:fn(i32)=|u124;()
有效:因为闭包不捕获任何内容,所以可以将其强制为函数指针。
这三种类似函数的类型都实现了相关的
Fn
、FnMut
和FnOnce
特征(除了闭包可能不会实现Fn
或FnMut
,这取决于它们捕获的内容)。函数项和函数指针还实现了复制
、克隆
、发送
和同步
(闭包仅在其所有内容都实现时才实现这些特性)。
就性能而言,函数指针是泛型和特征对象之间的折衷。它们必须被解除引用才能被调用,因此调用函数指针可能比直接调用函数项或闭包慢,但仍然比调用
dyn Fn
trait对象快,后者除了间接调用外还涉及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开始,可以省略条件运算符的中间