用照片做视频的网站好,h5个人网站源码,内蒙古建设厅官网站,嘉峪关建设局网站标题 一、泛型数据的引入二、改写为泛型函数三、结构体/枚举中的泛型定义四、方法定义中的泛型 一、泛型数据的引入
下面是两个函数#xff0c;分别用来取得整型和符号型vector中的最大值
use std::fs::File;fn get_max_float_value_from_vector(src: [f64]) - f64… 标题 一、泛型数据的引入二、改写为泛型函数三、结构体/枚举中的泛型定义四、方法定义中的泛型 一、泛型数据的引入
下面是两个函数分别用来取得整型和符号型vector中的最大值
use std::fs::File;fn get_max_float_value_from_vector(src: [f64]) - f64{let mut max src[0];for item in src.iter(){if item max {max item;}}max
}fn get_max_int_value_from_vector(src: [i32]) - i32{let mut max src[0];for item in src.iter(){if item max {max item;}}max
}
fn main() {let x vec![12, 21, 78, 56, 77];let y vec![11.5, 100.3, 1.0, 90.1];println!(max x: {}, get_max_int_value_from_vector(x)); //max x: 78println!(max y: {}, get_max_float_value_from_vector(y)); //max y: 100.3
}只看函数内容两个函数完成相同不同的地方在于函数名、返回值和参数返回值和参数又具有很大的关联性这就造成了函数冗余
二、改写为泛型函数
函数get_max_int_value_from_vector和get_max_float_value_from_vector完全可以改写成一个泛型函数如
fn get_max_value_from_vectorT(src: [T]) - T{}则代码变成
fn get_max_value_from_vectorT(src: [T]) - T{let mut max src[0];for item in src.iter(){if item max {max item;}}max
}
fn main() {let x vec![12, 21, 78, 56, 77];let y vec![11.5, 100.3, 1.0, 90.1];println!(max x: {}, get_max_value_from_vector(x)); //max x: 78println!(max y: {}, get_max_value_from_vector(y)); //max y: 100.3
}编译报错
解决方法在5.7 使用trait bounds修复get_max_value_from_vector的错误中进行。
三、结构体/枚举中的泛型定义
下面将坐标值的x,y都改成泛型
struct PointT{x: T,y: T,
}enum OptionT {Some(T),None,
}//两个泛型
enum ResultT, E {Ok(T),Err(E),
}四、方法定义中的泛型
struct PointT{x: T,y: T,
}implT PointT{fn x(self) - T{self.x}
}
fn main() {let p Point{x:5, y:10};println!(p.x {}, p.x()); //p.x 5
}在impl后面声明 T这样就可以在PointT上实现的方法中使用在impl后声明泛型T Rust 就知道Point的尖括号中的类型是泛型而不是具体类型
下面展示了一个没有在impl 之后没有尖括号声明泛型的例子这里使用了一个具体类型
impl Pointf32 {fn distance_from_origin(self) - f32 {(self.x.powi(2) self.y.powi(2)).sqrt()}
}代码计算点实例与坐标 (0.0, 0.0) 之间的距离这段代码意味着Pointf32 类型会有一个方法distance_from_origin其他不是 f32 类型的PointT 实例则没有定义此方法
结构体定义中的泛型类型参数并不总是与结构体方法签名中使用的泛型是同一类型。 下例的结构体PointT, U 上定义了一个方法mixup。这个方法获取另一个 Point 作为参数而它可能与调用 mixup 的 self 是不同的 Point 类型。这个方法用 self 的 Point 类型的 x 值类型 T和参数的 Point 类型的 y 值类型 W来创建一个新 Point 类型的实例
struct PointT, U {x: T,y: U,
}implT, U PointT, U {fn mixupV, W(self, other: PointV, W) - PointT, W {Point {x: self.x,y: other.y,}}
}fn main() {let p1 Point { x: 5, y: 10.4 };let p2 Point { x: Hello, y: c};let p3 p1.mixup(p2);println!(p3.x {}, p3.y {}, p3.x, p3.y); // p3.x 5, p3.y c
}p1是一个有 i32 类型的 x其值为 5和 f64 的 y其值为 10.4的 Pointp2则是一个有着字符串 slice 类型的 x其值为 “Hello”和 char 类型的 y其值为 c的 Point在p1上以 p2 作为参数调用 mixup 会返回一个 p3它会有一个 i32 类型的 xx 来自 p1并拥有一个 char 类型的 yy 来自 p2