政务网站建设合同网站未备案可以上线吗
政务网站建设合同,网站未备案可以上线吗,淳安县千岛湖建设集团网站,网站设计制作报价图片欣赏泛型 Generics泛型详解
使用泛型参数#xff0c;有一个先决条件#xff0c;必需在使用前对其进行声明#xff1a;
fn largestT(list: [T]) - T {该泛型函数的作用是从列表中找出最大的值#xff0c;其中列表中的元素类型为 T。首先 largestT 对…泛型 Generics泛型详解
使用泛型参数有一个先决条件必需在使用前对其进行声明
fn largestT(list: [T]) - T {该泛型函数的作用是从列表中找出最大的值其中列表中的元素类型为 T。首先 largestT 对泛型参数 T 进行了声明然后才在函数参数中进行使用该泛型参数 list: [T] 。
下面是一个错误的泛型函数的实现
fn largestT(list: [T]) - T {let mut largest list[0];for item in list.iter() {if item largest {largest item;}}largest
}fn main() {let number_list vec![34, 50, 25, 100, 65];let result largest(number_list);println!(The largest number is {}, result);let char_list vec![y, m, a, q];let result largest(char_list);println!(The largest char is {}, result);
}运行后报错
error[E0369]: binary operation cannot be applied to type T // 操作符不能用于类型T-- src/main.rs:5:17|
5 | if item largest {| ---- ^ ------- T| || T|
help: consider restricting type parameter T // 考虑对T进行类型上的限制 :|
1 | fn largestT: std::cmp::PartialOrd(list: [T]) - T {| 因为 T 可以是任何类型但不是所有的类型都能进行比较因此上面的错误中编译器建议我们给 T 添加一个类型限制使用 std::cmp::PartialOrd 特征Trait对 T 进行限制特征在下一节会详细介绍现在你只要理解该特征的目的就是让类型实现可比较的功能。
结构体中使用泛型
结构体中的字段类型也可以用泛型来定义下面代码定义了一个坐标点 Point它可以存放任何类型的坐标值
struct PointT {x: T,y: T,
}fn main() {let integer Point { x: 5, y: 10 };let float Point { x: 1.0, y: 4.0 };
}这里有两点需要特别的注意
提前声明跟泛型函数定义类似首先我们在使用泛型参数之前必需要进行声明 PointT接着就可以在结构体的字段类型中使用 T 来替代具体的类型 x 和 y 是相同的类型 第二点非常重要如果使用不同的类型那么它会导致下面代码的报错
如果想让 x 和 y 既能类型相同又能类型不同就需要使用不同的泛型参数
struct PointT,U {x: T,y: U,
}
fn main() {let p Point{x: 1, y :1.1};
}切记所有的泛型参数都要提前声明.
枚举中使用泛型
提到枚举类型Option 永远是第一个应该被想起来的在之前的章节中它也多次出现
enum OptionT {Some(T),None,
}OptionT 是一个拥有泛型 T 的枚举类型它第一个成员是 Some(T)存放了一个类型为 T 的值。得益于泛型的引入我们可以在任何一个需要返回值的函数中去使用 OptionT 枚举类型来做为返回值用于返回一个任意类型的值 Some(T)或者没有值 None。
enum ResultT, E {Ok(T),Err(E),
}这个枚举和 Option 一样主要用于函数返回值与 Option 用于值的存在与否不同Result 关注的主要是值的正确性。
如果函数正常运行则最后返回一个 Ok(T)T 是函数具体的返回值类型如果函数异常运行则返回一个 Err(E)E 是错误类型。例如打开一个文件如果成功打开文件则返回 Ok(std::fs::File)因此 T 对应的是 std::fs::File 类型而当打开文件时出现问题时返回 Err(std::io::Error)E 对应的就是 std::io::Error 类型。
方法中使用泛型
方法上也可以使用泛型
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());
}使用泛型参数前依然需要提前声明implT只有提前声明了我们才能在PointltT中使用它这样 Rust 就知道 Point 的尖括号中的类型是泛型而不是具体类型。需要注意的是这里的 PointltT 不再是泛型声明而是一个完整的结构体类型因为我们定义的结构体就是 PointltT 而不再是 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);
}这个例子中T,U 是定义在结构体 Point 上的泛型参数V,W 是单独定义在方法 mixup 上的泛型参数它们并不冲突说白了你可以理解为一个是结构体泛型一个是函数泛型。
为具体的泛型类型实现方法
对于 PointT 类型你不仅能定义基于 T 的方法还能针对特定的具体类型进行方法定义
impl Pointf32 {fn distance_from_origin(self) - f32 {(self.x.powi(2) self.y.powi(2)).sqrt()}
}这段代码意味着 Pointf32 类型会有一个方法 distance_from_origin而其他 T 不是 f32 类型的 PointT 实例则没有定义此方法。这个方法计算点实例与坐标(0.0, 0.0) 之间的距离并使用了只能用于浮点型的数学运算符。
const 泛型
const 泛型也就是针对值的泛型正好可以用于处理数组长度的问题
fn display_arrayT: std::fmt::Debug, const N: usize(arr: [T; N]) {println!({:?}, arr);
}
fn main() {let arr: [i32; 3] [1, 2, 3];display_array(arr);let arr: [i32; 2] [1, 2];display_array(arr);
}如上所示我们定义了一个类型为 [T; N] 的数组其中 T 是一个基于类型的泛型参数这个和之前讲的泛型没有区别而重点在于 N 这个泛型参数它是一个基于值的泛型参数因为它用来替代的是数组的长度。
N 就是 const 泛型定义的语法是 const N: usize表示 const 泛型 N 它基于的值类型是 usize。
在泛型参数之前Rust 完全不适合复杂矩阵的运算自从有了 const 泛型一切即将改变。
const 泛型表达式
假设我们某段代码需要在内存很小的平台上工作因此需要限制函数参数占用的内存大小此时就可以使用 const 泛型表达式来实现
// 目前只能在nightly版本下使用
#![allow(incomplete_features)]
#![feature(generic_const_exprs)]fn somethingT(val: T)
whereAssert{ core::mem::size_of::T() 768 }: IsTrue,// ^-----------------------------^ 这里是一个 const 表达式换成其它的 const 表达式也可以
{//
}fn main() {something([0u8; 0]); // oksomething([0u8; 512]); // oksomething([0u8; 1024]); // 编译错误数组长度是1024字节超过了768字节的参数长度限制
}// ---pub enum Assertconst CHECK: bool {//
}pub trait IsTrue {//
}impl IsTrue for Asserttrue {//
}
const fn
todo
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85457.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!