“一道关于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
领取专属 10元无门槛券
私享最新 技术干货