trait
(特征)RUST
用来以一种抽象的方式来定义共享行为,还可以使用trait
约束用来将泛型参数指定为实现了某些特征行为的类型。通过trait
将特定方法签名组合起来,用来实现某种目的所必须的行为集合。
pub trait Summary {fn summarize(&self) -> String;
}
使用关键字trait
来声明trait
,任何想要实现这个trait
的类型都需要为上述方法提供自定义行为。一个trait
可以包含多个方法:每个方法签名占据单独一行并以分号结尾。
有些时候,为trait
中的某些或者所有方法提供默认行为非常有用,它使我们无须为每一个类型的实现都提供自定义的行为。
需要注意,我们是无法在重载方法的实现过程中调用该方法的默认实现的。
pub trait Summary {fn summarize(&self) -> String {String::from("Read more...")}
}pub struct Tweet {}impl Summary for Tweet {}fn main() {let tw = Tweet {};print!("summary:{}\n", tw.summarize())
}
为结构体实现trait
和实现普通方法十分相似,它们的区别在于必须在impl
关键字后提供我们想要实现的trait
名,并紧接for
关键字以及当前的类型名。
实现trait
有一个限制:只有当trait
或类型定义于我们的库中时,我们才能为该类型实现对应的trait
,不能为外部类实现外部trait
。
使用trait
作为参数
pub fn notify(item: impl Summary) {println!("news:{}\n", item.summarize())
}
函数的参数item
可以是任何实现了Summary trait
的类型,声明使用了impl
关键字及对应的trait
名称。
这里的impl trait
常被用在一些较短的示例中,但它其实只是trait
约束的一种语法糖,它的完整形式如下:
pub fn notify<T: Summary>(item: T) {println!("news:{}\n", item.summarize())
}
我们将泛型参数和trait
约束同时放置在尖括号中,并使用冒号隔开。简单来说,impl trait
更适用于短小的示例,而trait
约束则更适用于复杂的情形。