// 泛型默认参数
//
// 语法形式
// trait FlyInterface<RHS=Self> { // 这里定义了一个默认泛型类型
// fn flap_wings(&self, rhs; RHS) -> &str; // 这里使用了默认泛型类型
// }
//
// 既然说是泛型, 那么它的本质就是可以接受任意类型, 只不过默认是Self自身.
// 额外补充: 虽然flap_wings方法顶了一个rhs参数名, 但是在做实现的时候,
// 并不是必须得叫rhs参数名, rust只要求数量一致就行了.
fn example1() {
use std::ops::Add;
#[derive(Debug)]
struct Millimeters(u32);
struct Meters(u32);
// Add是标准库中的trait, 由于 Add 的 <RHS=Self> 是泛型参数, 因此
// 在这里做具体得实现时, 可以填写具体的类型来覆盖掉默认类型参数.
impl Add<Meters> for Millimeters {
type Output = Millimeters;
// 只需要确认这里的类型参数与覆盖参数一致即可
fn add(self, other: Meters) -> Millimeters {
Millimeters(self.0 + (other.0 * 1000))
}
}
let mm = Millimeters(15);
let m = Meters(20);
println!("{:?}", mm + m);
}
fn example2() {
trait ABC<RHS=Self> {
type Item;
fn next(&self, rhs: RHS) -> String;
}
#[allow(dead_code)]
struct Point {
x: i32,
y: i32
}
// 由于 ABC 的 <RHS=Self>是泛型参数, 因此
// 在这里做具体得实现时, 可以填写具体的类型来覆盖掉默认类型参数.
impl ABC<u32> for Point {
type Item = i32;
// 只需要确认这里的类型参数与覆盖参数一致即可
fn next(&self, sd: u32) -> String {
{sd}; // 这行代码没有任何意义.
String::from("ok")
}
}
let u = Point {x: 1, y: 2};
println!("{:?}", u.next(10));
}
fn main() {
example1();
example2();
}
rust--trait的默认泛型参数
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 参考TypeBuilder.DefineGenericParameters Method,有很完整的代码和描述。 ...
- Thinking in Java 中关于泛型的讲解篇幅实在过长,前后尝试阅读这一章,但总是觉得找不到要点,很迷。于...
- 对于python函数参数,对于初学者可能就是进入了迷宫,尽管我也是初学者,简单总结一下。说参数之前,先讲一下两个p...