首页 > 解决方案 > Rust 中的函数原型是什么?

问题描述

我想了解#[inline]Rust 中属性的行为,所以我正在阅读The Rust Reference 的 Attributes 部分。这很有帮助,但我发现这部分描述令人困惑(强调我的):

inline属性向编译器建议它应该在调用者中放置属性函数的副本,而不是生成代码来调用定义它的函数。

这个属性可以用在函数和函数原型上,尽管它对函数原型没有任何作用。

#[cold]对属性重复此警告。

我从未听说过关于 Rust 使用的术语“函数原型”。我知道 JavaScript 中存在这样的概念,但是 JavaScript 和 Rust 的对象和类型系统非常不同!这里是什么意思?

进一步搜索,我在错误索引中发现了两个函数原型:

E0034

编译器不知道要调用什么方法,因为不止一种方法具有相同的原型。

E0580

main函数声明不正确。main函数原型不应该带参数。

在这种情况下,“函数原型”似乎意味着类似于“函数签名”——构成函数外部接口的名称、参数和类型。这似乎也是它在 C/C++ 上下文中的含义。但是,这似乎与上面的用法不符;每个函数定义都以函数的签名开始,因此说将属性放在签名上什么都不做是没有意义的,因为这就是您将属性放在函数上时所做的事情。

在 Rust 的上下文中,术语“函数原型”是什么意思?

标签: functionrustprototypeterminology

解决方案


但是,这似乎与上面的用法不符;每个函数定义都以函数的签名开始,因此说将属性放在签名上什么都不做是没有意义的,因为这就是您将属性放在函数上时所做的事情。

是的,每个函数都以签名开头,但并非每个签名都是函数定义的一部分。也就是说,可以有一个签名,但没有主体(例如在一个特征中),这就是您引用的文档中“原型”的含义。像这样的东西:

trait Foo {
    #[inline] // This annotation does nothing
    fn foo();
}

推荐阅读