园林网站模板下载,公司网站开发详细流程,零基础如何开网店,建设网站的法律可行性分析Rust语言中的trait是非常重要的概念。
在Rust中#xff0c;trait这一个概念承担了多种职责。在中文里#xff0c;trait可以翻译为“特征”“特点”“特性”等。
成员方法
trait中可以定义函数。用例子来说明#xff0c;我们定义如下的trait: 上面这个trait包含了一个方法…Rust语言中的trait是非常重要的概念。
在Rust中trait这一个概念承担了多种职责。在中文里trait可以翻译为“特征”“特点”“特性”等。
成员方法
trait中可以定义函数。用例子来说明我们定义如下的trait: 上面这个trait包含了一个方法这个方法只有一个参数这个self参数是什么意思呢?
所有的trait中都有一个隐藏的类型Self(大写S),代表当前这个实现了此trait的具体类型。trait中定义的函数也可以称作关联函数(associated function)。
函数的第一个参数如果是Self相关的类型且命名为self(小写s),这个参数可以被称为“receiver”(接收者)。具有receiver参数的函数我们称为“方法”(method),可以通过变量实例使用小数点来调用。
没有receiver参数的函数我们称为“静态函数”(static function),可以通过类型加双冒号::的方式来调用。在Rust中函数和方法没有本质区别。
Rust中Self(大写S)和self(小写s)都是关键字大写S的是类型名小写s的是变量名。请大家一定注意区分。self参数同样也可以指定类型当然这个类型是有限制的必须是包装在Self类型之上的类型。
对于第一个self参数常见的类型有self :Self、self:Self、self :mut Self等类型。对于以上这些类型Rust提供了一种简化的写法我们可以将参数简写为self、self、mut self。
self参数只能用在第一个参数的位置。请注意“变量self”和“类型Self”的大小写不同。示例如下 所以回到开始定义的那个Shape trait,上面定义的这个area方法的参数的名字为self,它的类型是αSelf类型。我们可以把上面这个方法的声明看成 我们可以为某些具体类型实现(impl)这个trait。
假如我们有一个结构体类型Circle,它实现了这个trait,代码如下 另外针对一个类型我们可以直接对它impl来增加成员方法无须trait名字。比如
静态方法
没有receiver参数的方法(第一个参数不是self参数的方法)称作“静态方法”。静态方法可以通过Type::FunctionName()的方式调用。需要注意的是即便我们的第一个参数是Self相关类型只要变量名字不是self,就不能使用小数点的语法调用函数。 扩展方法
我们还可以利用trait给其他的类型添加成员方法哪怕这个类型不是我们自己写的。比如我们可以为内置类型i32添加一个方法
完整函数调用语法
Fully Qualified Syntax提供一种无歧义的函数调用语法允许程序员精确地指定想调用的是那个函数。
以前也叫UFCS(universal function call syntax),也就是所谓的“通用函数调用语法”。
这个语法可以允许使用类似的写法精确调用任何方法包括成员方法和静态方法。
其他一切函数调用语法都是它的某种简略形式。它的具体写法为::item。示例如下 我们定义了两个trait,它们的start()函数有同样方法签名。
如果一个类型同时实现了这两个trait,那么如果我们使用variable.start()这样的语法执行方法调用的话就会出现歧义编译器不知道你具体想调用哪个方法编译错误信息为“multiple applicable items in scope”。
这时候我们就有必要使用完整的函数调用语法来进行方法调用只有这样写才能清晰明白且无歧义地表达清楚期望调用的是哪个函数