Rust 中的函数原型是啥?

Posted

技术标签:

【中文标题】Rust 中的函数原型是啥?【英文标题】:What is a function prototype in Rust?Rust 中的函数原型是什么? 【发布时间】:2019-06-05 14:24:57 【问题描述】:

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

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

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

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

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

进一步搜索,我在the Error Index 中发现了两个函数原型:

E0034

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

E0580

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

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

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

【问题讨论】:

我将其解释为特征声明中的函数签名,没有默认主体 更像 C 中的原型,但没有不方便的地方 ;) 【参考方案1】:

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

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

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

【讨论】:

以上是关于Rust 中的函数原型是啥?的主要内容,如果未能解决你的问题,请参考以下文章

python函数原型定义那行有个箭头是啥语法?比如

javascript中的原型和原型链

javascript中的构造函数和原型及原型链

浅谈Javascript中的原型原型链继承

JS中的原型规则与原型链

原型原型对象构造函数原型链理解