当前位置: 首页 > news >正文

网站百度手机端排名怎么查询郑州网站排名推广

网站百度手机端排名怎么查询,郑州网站排名推广,8种常用的网络营销推广方法,建筑人才招聘网官网1.摘要 Rust中的泛型可以让我们为像函数签名或结构体这样的项创建定义, 这样它们就可以用于多种不同的具体数据类型。下面的内容将涉及泛型定义函数、结构体、枚举和方法, 还将讨论泛型如何影响代码性能。 2.在函数定义中使用泛型 当使用泛型定义函数时#xff0c;本来在函…1.摘要 Rust中的泛型可以让我们为像函数签名或结构体这样的项创建定义, 这样它们就可以用于多种不同的具体数据类型。下面的内容将涉及泛型定义函数、结构体、枚举和方法, 还将讨论泛型如何影响代码性能。 2.在函数定义中使用泛型 当使用泛型定义函数时本来在函数签名中指定参数和返回值的类型的地方会改用泛型来表示。采用这种技术使得代码适应性更强从而为函数的调用者提供更多的功能同时也避免了代码的重复。 看下面的代码例子, 定义了两个函数, 功能都差不多,作用是分别寻找slice中最大的i32和slice中最大的char, 只是数据类型不同。 fn largest_i32(list: [i32]) - i32 {let mut largest list[0]; ​for item in list {if item largest {largest item;}} ​largest } ​ fn largest_char(list: [char]) - char {let mut largest list[0]; ​for item in list {if item largest {largest item;}} ​largest } ​ fn main() {let number_list vec![34, 50, 25, 100, 65]; ​let result largest_i32(number_list);println!(The largest number is {}, result); ​let char_list vec![y, m, a, q]; ​let result largest_char(char_list);println!(The largest char is {}, result); } 编译一下代码, 输出如下: 我们现在需要定义一个新函数, 引进泛型参数来消除这种因数据类型不同而导致的函数重复定义。为了参数化这个新函数中的这些类型我们需要为类型参数命名道理和给函数的形参起名一样。任何标识符都可以作为类型参数的名字。这里选用 T因为传统上来说Rust 的类型参数名字都比较短通常仅为一个字母同时Rust 类型名的命名规范是首字母大写驼峰式命名法UpperCamelCase。T 作为 “type” 的缩写是大部分 Rust 程序员的首选。 如果要在函数体中使用参数就必须在函数签名中声明它的名字好让编译器知道这个名字指代的是什么。同理当在函数签名中使用一个类型参数时必须在使用它之前就声明它。为了定义泛型版本的 largest 函数类型参数声明位于函数名称与参数列表中间的尖括号 中像这样 fn largestT(list: [T]) - T { 可以这样理解这个定义函数 largest 有泛型类型 T。它有个参数 list其类型是元素为 T 的 slice。largest 函数会返回一个与 T 相同类型的引用。 按照这个思想, 我们将代码改造如下: fn largestT(list: [T]) - T {let mut largest list[0]; ​for item in list {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); } 一切似乎很顺利, 尝试编译这段代码, 编译器结果如下: 这次编译没有通过的原因Rust编译器用绿色标识出来了, 缺少一个: std:cmp::PartialOrd, 先暂且认为这个是Rust标准库要求的东西, 加上重新编译一下试试: fn largestT: std::cmp::PartialOrd(list: [T]) - T {let mut largest list[0]; ​for item in list {if item largest {largest item;}} ​largest } 重新编译结果如下: 我们在代码中下了一个断点, 能够执行到此处说明代码已经没有问题。实际上上面这个错误表明 largest 的函数体不能适用于 T 的所有可能的类型。因为在函数体需要比较 T 类型的值不过它只能用于我们知道如何排序的类型。为了开启比较功能标准库中定义的 std::cmp::PartialOrd trait 可以实现类型的比较功能, 我们限制 T 只对实现了 PartialOrd 的类型有效后代码就可以编译了因为标准库为 i32 和 char 实现了 PartialOrd。 3.在结构体中使用泛型 同样也可以用 语法来定义结构体它包含一个或多个泛型参数类型字段。下面的代码片段定义了一个可以存放任何类型的 x 和 y 坐标值的结构体 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 的定义中只使用了一个泛型类型这个定义表明结构体 PointT 对于一些类型 T 是泛型的而且字段 x 和 y 都是 相同类型的无论它具体是何类型。 如果尝试创建一个有不同类型值的 PointT 的实例, 看下面的代码: struct PointT {x: T,y: T, } ​ fn main() {let wont_work Point { x: 5, y: 4.0 }; } 在这个例子中当把整型值 5 赋值给 x 时就告诉了编译器这个 PointT 实例中的泛型 T 全是整型。接着指定 y 为浮点值 4.0因为它y被定义为与 x 相同类型所以将会得到一个像这样的类型不匹配错误 如果想要定义一个 x 和 y 可以有不同类型且仍然是泛型的 Point 结构体我们可以使用多个泛型类型参数。修改 Point 的定义为拥有两个泛型类型 T 和 U。其中字段 x 是 T 类型的而字段 y 是 U 类型的 struct PointT, U {x: T,y: U, } ​ fn main() {let both_integer Point { x: 5, y: 10 };let both_float Point { x: 1.0, y: 4.0 };let integer_and_float Point { x: 5, y: 4.0 }; } 现在所有这些 Point 实例都合法了我们可以在定义中使用任意多的泛型类型参数不过太多的话代码将难以阅读和理解。当你发现代码中需要很多泛型时这可能表明你的代码需要重构分解成更小的结构。 4.枚举中使用泛型 和结构体类似枚举也可以在成员中存放泛型数据类型。例如: enum OptionT {Some(T),None, } OptionT 是一个拥有泛型 T 的枚举它有两个成员Some它存放了一个类型 T 的值和不存在任何值的None。通过 OptionT 枚举可以表达有一个可能的值的抽象概念同时因为 OptionT 是泛型的无论这个可能的值是什么类型都可以使用这个抽象。 枚举也可以拥有多个泛型类型, 例如: enum ResultT, E {Ok(T),Err(E), } Result 枚举有两个泛型类型T 和 E。Result 有两个成员Ok它存放一个类型 T 的值而 Err 则存放一个类型 E 的值。这个定义使得 Result 枚举能很方便的表达任何可能成功返回 T 类型的值也可能失败返回 E 类型的值的操作。 总结:当意识到代码中定义了多个结构体或枚举它们不一样的地方只是其中的值的类型的时候不妨通过泛型类型来避免重复。 5.方法定义中的泛型 在为结构体和枚举实现方法时, 一样也可以用泛型。看下面的代码: 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()); } 这里在 PointT 上定义了一个叫做 x 的方法来返回字段 x 中数据的引用。注意必须在 impl 后面声明 T这样就可以在 PointT 上实现的方法中使用 T 了。通过在 impl 之后声明泛型 TRust 就知道 Point 的尖括号中的类型是泛型而不是具体类型。我们可以为泛型参数选择一个与结构体定义中声明的泛型参数所不同的名称不过依照惯例使用了相同的名称。impl 中编写的方法声明了泛型类型可以定位为任何类型的实例不管最终替换泛型类型的是何具体类型。 定义方法时也可以为泛型指定限制constraint。例如可以选择为 Pointf32 实例实现方法而不是为泛型 Point 实例。代码如下: 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) 之间的距离并使用了只能用于浮点型的数学运算符。 结构体定义中的泛型类型参数并不总是与结构体方法签名中使用的泛型是同一类型。看下面的代码: struct PointX1, Y1 {x: X1,y: Y1, } ​ implX1, Y1 PointX1, Y1 {fn mixupX2, Y2(self, other: PointX2, Y2) - PointX1, Y2 {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); } 在上面的代码中, Point 结构体使用了泛型类型 X1 和 Y1为 mixup 方法签名使用了 X2 和 Y2 来使得示例更加清楚。这个方法用 self 的 Point 类型的 x 值类型 X1和参数的 Point 类型的 y 值类型 Y2来创建一个新 Point 类型的实例 在 main 函数中定义了一个有 i32 类型的 x其值为 5和 f64 的 y其值为 10.4的 Point。p2 则是一个有着字符串 slice 类型的 x其值为 Hello和 char 类型的 y其值为c的 Point。在 p1 上以 p2 作为参数调用 mixup 会返回一个 p3它会有一个 i32 类型的 x因为 x 来自 p1并拥有一个 char 类型的 y因为 y 来自 p2。println! 会打印出 p3.x 5, p3.y c。 这个例子的目的是展示一些泛型通过 impl 声明而另一些通过方法定义声明的情况。这里泛型参数 X1 和 Y1 声明于 impl 之后因为它们与结构体定义相对应。而泛型参数 X2 和 Y2 声明于 fn mixup 之后因为它们只是相对于方法本身的。 6.泛型代码性能 不用担心使用泛型会比使用具体类型的代码性能低。 Rust 通过在编译时进行泛型代码的 单态化monomorphization来保证效率。单态化是一个通过填充编译时使用的具体类型将通用代码转换为特定代码的过程。 在这个过程中编译器寻找所有泛型代码被调用的位置并使用泛型代码针对具体类型生成代码。 下面看看这个怎样用于标准库中的 Option 枚举 let integer Some(5); let float Some(5.0); 当 Rust 编译这些代码的时候它会进行单态化。编译器会读取传递给 OptionT 的值并发现有两种 OptionT一个对应 i32 另一个对应 f64。为此它会将泛型定义 OptionT 展开为两个针对 i32 和 f64 的定义接着将泛型定义替换为这两个具体的定义。 编译器生成的单态化版本的代码看起来像这样编译器会使用不同于如下假想的名字 enum Option_i32 {Some(i32),None, } ​ enum Option_f64 {Some(f64),None, } ​ fn main() {let integer Option_i32::Some(5);let float Option_f64::Some(5.0); } 泛型 OptionT 被编译器替换为了具体的定义。因为 Rust 会将每种情况下的泛型代码编译为具体类型使用泛型没有运行时开销。当代码运行时它的执行效率就跟好像手写每个具体定义的重复代码一样。这个单态化过程正是 Rust 泛型在运行时极其高效的原因。
http://www.pierceye.com/news/190103/

相关文章:

  • 宝塔面板做织梦网站深圳龙华大浪做网站公司
  • 阿里云建网站费用上海网站建设觉策动力
  • 电子商务网站的建设与维护方法h5第三方收款平台
  • 网站建设所需人力设计广告网站
  • php网站发送邮件动态倒计时网站模板
  • 温州建设网站制作wordpress调用文章简介
  • 大庆市建设局网站刘东科技公司做网站
  • 山东助企网站建设宁波百度关键词推广
  • 宜昌市夷陵区建设局网站培训推广 seo
  • 怎样做安居客网站用幽默的语言来形容网站开发
  • 宜昌网站建设选择宜昌慧享互动手机怎么防止网站跳转
  • 本地的上海网站建设公司汽车租赁网站设计
  • 在哪下载免费的英文版网站模板建站 网站程序有哪些
  • 网页前端做购物网站的实训报告网络营销推广是做什么的
  • 广东专业网站建设效果wordpress搜索框插件
  • 茂名建站模板搭建岳阳优化营商环境
  • shopify网站建设郑州机械网站制作
  • 郑州正规公司网站建设服务国内专业建站平台
  • 做财经直播网站php网站做安卓客户端
  • 视频直播网站开发运营步骤十大免费erp软件
  • 域名备案和网站备案有什么不同wap 网站
  • 没备案的网站百度收录博客营销
  • 网站开发新技术wordpress 搜索词调用
  • 凡科手机建站教程wordpress 搜索引擎
  • asp企业网站源码下载免费ppt模板公众号
  • 西斗门的网站建设短网址生成器有哪些
  • 一站式织梦网站模板工信部备案查询网官网
  • 网站导航做外链桂林seo
  • 青岛网站建设q479185700棒软件开发者是指
  • 福永公司网站建设空间网站链接怎么做