衔接关键词trait
学习内容
- 阐述衔接类型关键词
trait
基本概念
篇目
关键词trait概念表述
关键词trait概念表述之一:
关键词trait是Rust语言的一项功能,可以告诉Rust编译器一种类型必须提供的功能。
关键词trait概念表述之二:
关键词trait是为任何未知类型定义方法的集合。
关键词trait概念表述之三:
关键词trait告诉Rust编译器一种特定的类型具有且可与其他类型共享的功效性质。
关键词trait提供了一种类型或者几种类型之间的衔接方式。它应该包含下面内容:
- 存在一种类型或者几种类型
- 使用关键词trait定义衔接特质名称
- 使用关键词trait代码块定义默认方法和函数
- 使用关键词"impl"和"for"组合,实现针对这一种类型或者这几种类型的方法和函数
衔接类型关键词trait概念
Trait definitions are a way to group method signatures together to define a set of behaviors necessary to accomplish some purpose.
直接翻译:特质(Trait)定义是一种途径,将方法一部分进行分组在一起,为实现某些目的所需以定义行为。
衔接类型关键词trait
包含这些信息:
- 衔接类型关键词
trait
提供了类型的一种通道。 - 衔接类型关键词
trait
定义了类型行为功能的一部分,且也可实现行为功能。 - 这一组或者部分类型的行为功能是为了完成一项特有明确的任务。
- 单个类型可以使用关键词trait定义多组类型行为功能,来实现不同任务。
实现类型关键词trait
Rust语言规定:
- 关键词
trait
默认是私有的,但可增加修饰关键词pub
; - 使用关键词
trait
可以定义一个称之为特质的一组类型行为功能; - 一旦定义了衔接类型特质,其函数和方法都是公共的,且且不可增加修饰关键词
pub
;
默认实例代码如下所示。尽管下面代码已定义了函数new()
或者实现了默认函数init()
,但是该函数外部还是不可访问的,因为该特质是私有的。注意,定义了函数new()
是语句,是带分号;
,而实现了默认函数init()
是表达式,是无分号;
。
# #![allow(unused_variables)] #fn main() { #struct Person { # name: String, # age: u32, #} # trait TraitPerson { fn new(name: String, age: u32) -> Person; fn init() -> Person { Person { name: String::new(), age: 0, } } } #}
关键词impl
和for
概念
Rust语言规定:
- 关键词
impl
和for
默认是公开的; - 使用关键词
impl
和for
实现的函数或者方法是不可增加修饰关键词pub
;
默认实例代码如下所示。尽管使用关键词impl
和for
实现了特质TraitPerson
,且其默认是公开的,但是为了使用其功能,其相关的类型Person
和特质TraitPerson
必须要公开的。
##![allow(dead_code)] #mod trait_exerci { # pub struct Person { # name: String, # age: u32, # } # # pub trait TraitPerson { # fn new(name: String, age: u32) -> Person; # fn init() -> Person { # Person { # name: String::new(), # age: 0, # } # } # } # impl TraitPerson for Person { fn new(name: String, age: u32) -> Person { Person { name: name, age: age, } } } #} # #//use self::trait_exerci::TraitPerson; #use crate::trait_exerci::TraitPerson; # #fn main() { # trait_exerci::Person::init(); # trait_exerci::Person::new(String::from("Leo"), 24); #}
实现关键词trait代码
通过下面的代码,可以学习到这些知识:
- 使用关键词
trait
,定义了特质TraitCanal
的函数new()
; - 使用关键词
impl
和for
,基于结构类型StructType
,为特质TraitCanal
实现了实例化函数new()
; - 借助于特质
TraitCanal
,实现该结构类型的实例化方式; - 借助于结构类型属性的公开性,实现了实例调用结构类型的属性手法;
- 使用宏方法
assert_eq!
,验证实例调用结果的正确性;
#![allow(dead_code)] mod trait_exerci { pub struct StructType { pub data: u32, } pub trait TraitCanal { fn new(data: u32) -> StructType; } impl TraitCanal for StructType { fn new(data: u32) -> StructType { StructType { data: data } } } } use self::trait_exerci::TraitCanal; // cargo run --example trait fn main() { let instance = trait_exerci::StructType::new(0); assert_eq!(0, instance.data); }