Rust 语言特性:impl 与 方法
在其他语言里我们通常不会特别区分“函数”和“方法”两个术语特别是在 Java 这类纯面向对象编程语言里。因为“函数”和“方法”是一回事。在 C 里情形稍有不同因为它是面向对象和面向过程的多范式语言即有独立存在的函数也有位于类里的“成员函数”是的 C 管类里的函数叫“成员函数”在 Rust 里情况又有所不同它有的独立的函数 (function)同时还有关联到 struct / trait / enum 上的函数Rust 把它们称之为方法 (method)暗示它们是从属于这些数据结构的。所以严谨一些的话在 Rust 里还是不要随意交叉使用这两个术语。下面我们看一下如何给一个结构体添加方法。假设有一个Rectangle结构体structRectangle{width:u32,height:u32,}下面我们要为其添加一下求解面积的方法应该这样写implRectangle{// 注意参数 selffnarea(self)-u32{self.width*self.height}}定义好这个方法后我们就能通过 Rectangle 的实例直接调用它了fnmain(){letrect1Rectangle{width:30,height:50,};println!(rect1.area() {},rect1.area());}首先是关键字impl它后面紧跟一个类型可以是 struct / trait / enum然后用花括号包裹起的部分就称为一个 impl 块impl block这个语法形式挺简洁易懂的仅从效果上看它是要给指定的 struct / trait / enum 添加一些“方法”。不过对于 rust 中的 struct / enum 来说它们并没有真正意义上的“方法”impl 实现的其实是关联到类型上的普通函数集合。怎么理解呢我们看一下使用 impl 定义的这些方法的真实情况。你应该注意到 area 方法的特殊之处它有一个self参数这个self代表的就是调用这个方法的 struct 实例而根据方法的意图和功能可以使用 self / mut self / self 等不同形式来控制所有权的授予。Rust 规定 impl 中的方法第一个参数必须是 self / mut self / self 关联函数除外这种语法形式并不陌生这和 C 的成员函数总是额外获得一个隐式的 this 指针以方法对象的其他成员非常类似。但是有一个细节需要我们注意尽管在方法声明中我们可以根据需要写 self / mut self / self 等不同形式但是你会发现像rect1.area()这样在调用时我们是不会显式传递第一个参数的从使用者的角度来说这很好非常方便但是你要注意到不管 area 方法声明的是 self、mut self 还是 self调用形式是一样的都是rect1.area()所以这里有一个细节就是Rust 会自动为 object 添加 、mut 或 *解引用 以便使 object 与方法签名匹配。现在回看rect1.area()你就能感觉到 Rust 通过 impl 定义的方法与它关联的结构体其实是一种很松散的绑定关系rect1.area()的调用更像是area(rect1)形式的语法糖。所以 struct 是没有真正意义上的“成员函数”的。最后还有一个前面一直没解释的“例外”关联函数它就是在定义在了 impl 块里但第一个参数不是 self 的任何形式的方法这样它就不会作用到一个具体的结构体实例上了这和其他语言中的静态成员函数是一样的。关联函数经常被用作返回一个结构体新实例的构造函数/工厂方法例如我们可以 Rectangle 添加一个square关联方法作为创建正方形的一种快捷方式implRectangle{// 无 self 参数是一个 关联函数fnsquare(size:u32)-Rectangle{Rectangle{width:size,height:size,}}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2637210.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!