首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一道题了解Rust函数项类型

一道关于Rust函数项类型的题,带你了解Rust函数项类型。

01

代码

最近看到一道Rust测试题,问下面代码的运行结果是什么。

看到这道题,我第一反应就是,a::是一个函数指针,对于16行和17行  的代码,最终都是判断函数指针的大小,所以输出结果应该是22。但是当我运行这段代码,发现结果却出人意料。

为什么运行结果是20而非22?

这就引入了我们要讲的函数项类型

02

函数项类型

当涉及到函数项、元组结构体和枚举类型的构造函数时,会产生它们的函数项类型的零尺寸类型。这个类型显示的标识了该函数(或者说标识了该函数项、枚举类型构造函数、类似元组结构体的构造函数)的名字、类型参数以及定义时的生存期参数。

所以到这里,我们可以清楚的知道a::实际上就是一个函数项类型,而它,是一个零尺寸类型。换句话说,它并不是函数指针。所以这里也就能解释为什么第17行d(a::)中输出的结果为0了。但是为什么第16行a(a::)输出却为2呢?

我们这里把第2行和第11行的注释打开,重新运行,我们得到如下结果:

我们可以看到,在调用a(a::)第11行打印出来的T的类型是fn(u8)而非use_fn::a,也就是并不是我们理解的函数项类型。为什么会这样呢?

这是因为fn a(f: fn(T))预期的参数是一个函数指针,当传入函数项类型时,发生了函数项类型到函数指针的转换,所以在第11行打印出来的是fn(u8)。而fn(u8)是一个函数指针,具有尺寸大小,所以这道题的最终结果是20.

这道题最关键的是要知道a::是类型,同时知道函数项类型在什么样的情况下会发生类型自动转换。

参考文档:

https://dtolnay.github.io/rust-quiz/34

https://doc.rust-lang.org/stable/reference/types/function-item.html

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230225A02QUB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券