您的位置 首页 > 德语词汇

trait是什么意思(rust从入门到放弃)

大家好,关于trait是什么意思很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于rust从入门到放弃的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

trait中文翻译是特点,意思就是说定义了一组特性。如果熟悉java、go中的接口,或者c++的抽象类,就会发现这个trait和它们非常类似。也是定义了一组行为。

比如下面的trait定义了一个求面积的函数。

trait是什么意思(rust从入门到放弃)

traitShape{\nfnarea(&self)->f64;\n}

如果换成Go来写

\t\ntypeShapeinterface{\narea()float64\n}

形态上面是类似的,都是定义了一组函数。和接口一样,需要具体的类或者struct去实现接口,就是将接口具化成实体。我们定义一个圆形的struct去实现求面积的trait。

structCircle{\nradius:f64,\n}\nimplShapeforCircle{\nfnarea(&self)->f64{\nstd::f64::consts::PI*self.radius*self.radius\n}\n}

这里使用了impl这个关键字,代表实现,和java里面接口实现关键字implement意思差不多。接下来我们就可以创建这个struct然后调用area方法了。

fnmain(){\nletc=Circle{radius:3f64};\nprintln!("Theareais{}",c.area());\n}

area函数的定义和上面trait中area的定义保持一致。这里还需要注意的点是为啥函数area参数是&self。这个非常重要,其实trait中self的定义有三种

traitShape{\nfnarea1(self);#所有权\nfnarea2(&self);#借用\nfnarea3(&mutself);#可变借用\n}

这个涉及生命周期管理,后面介绍生命周期管理的时候再单独介绍。

接下来我们搞个好玩的东西,扩展一下i32这类型,这个类型本身是没有duoble(乘2)方法的,我们可以为i32添加这个方法。我们首先需要定义这个Doubletrait,然后为i32实现这个trait里面的double方法,如下:

traitDouble{\nfndouble(&self)->Self;\n}\nimplDoublefori32{\nfndouble(&self)->i32{\n*self*2\n}\n}\nfnmain(){\nletx:i32=10.double();\nprintln!("{}",x);\n}

但这里你可能会疑惑,那是不是我们可以任意的定义重新方法呢?答案当然是不能,这样就乱套了,开发者可以随意修改原生方法,破坏了原有的封装。所以这里的实现trait要遵循孤儿规则:要么impl与trait的声明在一个crate下,要么与类型的声明在一个crate下。他们都是为了保证代码的封装性。上面的例子就属于第一种情况,与trait定义在同一个crate下。

trait还支持继承,比如Derivedtrait继承了Basetrait,如下通过冒号指定。

\ntraitBase{}\ntraitDerived:Base{}

当我们实现traitDerived的时候,如下

structT;\nimplDerivedforT{}\nfnmain(){}

只实现Derived一个trait会报错,需要我们同时实现Basetrait,所以还需要额外加上Basetrait。

implBaseforT{}

rust源码里面有很多这种继承的使用。比如下面

pubtraitSized{\n//Empty.\n}\npubtraitClone:Sized\npubtraitCopy:Clone

所以当我们实现copy的时候就需要同时实现Clone和Sized这两个trait。

关于trait是什么意思,rust从入门到放弃的介绍到此结束,希望对大家有所帮助。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023