企业建设网站方案建筑网片厂家货源平台

pingmian/2026/1/20 5:47:07/文章来源:
企业建设网站方案,建筑网片厂家货源平台,教师可以做网站吗,南昌房产网官网1.定义 trait trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共享的行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。 一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话#xff…1.定义 trait trait 定义了某个特定类型拥有可能与其他类型共享的功能。可以通过 trait 以一种抽象的方式定义共享的行为。可以使用 trait bounds 指定泛型是任何拥有特定行为的类型。 一个类型的行为由其可供调用的方法构成。如果可以对不同类型调用相同的方法的话这些类型就可以共享相同的行为了。trait 定义是一种将方法签名组合起来的方法目的是定义一个实现某些目的所必需的行为的集合。 例如这里有多个存放了不同类型和属性文本的结构体结构体 NewsArticle 用于存放发生于世界各地的新闻故事而结构体 weibo 最多只能存放 280 个字符的内容。 我们想要创建一个名为 aggregator 的多媒体聚合库用来显示可能储存在 NewsArticle 或 weibo 实例中的数据摘要。为了实现功能每个结构体都要能够获取摘要这样的话就可以调用实例的 summarize 方法来请求摘要。下面的代码展示了一个公有 Summary trait 的定义 pub trait Summary {fn summarize(self) - String; } 这里使用 trait 关键字来声明一个 trait后面是 trait 的名字在这个例子中是 Summary。我们也声明 trait 为 pub 以便依赖这个 crate 的 crate 也可以使用这个 trait。在大括号中声明描述实现这个 trait 的类型所需要的行为的方法签名在这个例子中是 fn summarize(self) - String。 在方法签名后跟分号而不是在大括号中提供其实现。接着每一个实现这个 trait 的类型都需要提供其自定义行为的方法体编译器也会确保任何实现 Summary trait 的类型都拥有与这个签名的定义完全一致的 summarize 方法。 trait 体中可以有多个方法一行一个方法签名且都以分号结尾。 2.为类型实现 trait 现在我们定义了 Summary trait 的签名接着就可以在多媒体聚合库中实现这个类型了。下面的代码展示了 NewsArticle 结构体上 Summary trait 的一个实现它使用标题、作者和创建的位置作为 summarize 的返回值。对于 Weibo 结构体我们选择将 summarize 定义为用户名后跟全部文本作为返回值并假设内容已经被限制为 280 字符以内。 pub struct NewsArticle {pub headline: String,pub location: String,pub author: String,pub content: String, }impl Summary for NewsArticle {fn summarize(self) - String {format!({}, by {} ({}), self.headline, self.author, self.location)} }pub struct Weibo {pub username: String,pub content: String,pub reply: bool,pub reweibo: bool, }impl Summary for Weibo {fn summarize(self) - String {format!({}: {}, self.username, self.content)} } 在类型上实现 trait 类似于实现与 trait 无关的方法。区别在于 impl 关键字之后我们提供需要实现 trait 的名称接着是 for 和需要实现 trait 的类型的名称。在 impl 块中使用 trait 定义中的方法签名不过不再后跟分号而是需要在大括号中编写函数体来为特定类型实现 trait 方法所拥有的行为。 现在库在 NewsArticle 和 Weibo 上实现了Summary traitcrate 的用户可以像调用常规方法一样调用 NewsArticle 和 Weibo 实例的 trait 方法了。唯一的区别是 trait 必须和类型一起引入作用域以便使用额外的 trait 方法。这是一个二进制 crate 如何利用 aggregator 库 crate 的例子 use aggregator::{Summary, Weibo};fn main() {let wb Weibo {username: String::from(suntiger),content: String::from(感谢大家关注到我,),reply: false,reweibo: false,};println!(1条新微博: {}, wb.summarize()); } 打印结果如下: 其他依赖 aggregator crate 的 crate 也可以将 Summary 引入作用域以便为其自己的类型实现该 trait。实现 trait 时需要注意的一个限制是只有当至少一个 trait 或者要实现 trait 的类型位于 crate 的本地作用域时才能为该类型实现 trait。例如可以为 aggregator crate 的自定义类型 Weibo 实现如标准库中的 Display trait这是因为 Weibo 类型位于 aggregator crate 本地的作用域中。类似地也可以在 aggregator crate 中为 VecT 实现 Summary这是因为 Summary trait 位于 aggregator crate 本地作用域中。 但是不能为外部类型实现外部 trait。例如不能在 aggregator crate 中为 VecT 实现 Display trait。这是因为 Display 和 VecT 都定义于标准库中它们并不位于 aggregator crate 本地作用域中。这个限制是被称为 相干性coherence的程序属性的一部分或者更具体的说是 孤儿规则orphan rule其得名于不存在父类型。这条规则确保了其他人编写的代码不会破坏你代码反之亦然。没有这条规则的话两个 crate 可以分别对相同类型实现相同的 trait而 Rust 将无从得知应该使用哪一个实现。 3.默认实现 有时为 trait 中的某些或全部方法提供默认的行为而不是在每个类型的每个实现中都定义自己的行为是很有用的。这样当为某个特定类型实现 trait 时可以选择保留或重载每个方法的默认行为。 下面的代码为 Summary trait 的 summarize 方法指定一个默认的字符串值而不是像上面代码那样只是定义方法签名 pub trait Summary {fn summarize(self) - String {String::from((读取更多...))} } 如果想要对 NewsArticle 实例使用这个默认实现可以通过 impl Summary for NewsArticle {} 指定一个空的 impl 块。 虽然我们不再直接为 NewsArticle 定义 summarize 方法了但是我们提供了一个默认实现并且指定 NewsArticle 实现 Summary trait。因此我们仍然可以对 NewsArticle 实例调用 summarize 方法如下所示 let article NewsArticle {headline: String::from(这不是梦,中国队进世界杯了!),location: String::from(中国北京),author: String::from(suntiger),content: String::from(中国队的世界排名因此上升了29位.,), };println!(新文章可用!{}, article.summarize()); 这段代码执行结果如下: 为 summarize 创建默认实现并不要求对 Weibo 上的 Summary 实现做任何改变。其原因是重载一个默认实现的语法与实现没有默认实现的 trait 方法的语法一样。 默认实现允许调用相同 trait 中的其他方法哪怕这些方法没有默认实现。如此trait 可以提供很多有用的功能而只需要实现指定一小部分内容。例如我们可以定义 Summary trait使其具有一个需要实现的 summarize_author 方法然后定义一个 summarize 方法此方法的默认实现调用 summarize_author 方法 pub trait Summary {fn summarize_author(self) - String;fn summarize(self) - String {format!((从{}读取更多内容...), self.summarize_author())} } 为了使用这个版本的 Summary只需在实现 trait 时定义 summarize_author 即可 impl Summary for Weibo {fn summarize_author(self) - String {format!({}, self.username)} } 一旦定义了 summarize_author我们就可以对 Weibo 结构体的实例调用 summarize 了而 summarize 的默认实现会调用我们提供的 summarize_author 定义。因为实现了 summarize_authorSummary trait 就提供了 summarize 方法的功能且无需编写更多的代码。 let wb Weibo {username: String::from(suntiger),content: String::from(中国队的世界排名因此上升了29位.,),reply: false,retweet: false, };println!(1条新微博: {}, wb.summarize()); 执行这段代码后结果如下: 注意无法从相同方法的重载实现中调用默认方法。 4.trait 作为参数 知道了如何定义 trait 和在类型上实现这些 trait 之后我们可以探索一下如何使用 trait 来接受多种不同类型的参数。上例 中为 NewsArticle 和 Weibo 类型实现了 Summary trait用其来定义了一个函数 notify 来调用其参数 item 上的 summarize 方法该参数是实现了 Summary trait 的某种类型。为此可以使用 impl Trait 语法像这样 pub fn notify(item: impl Summary) {println!(热点新闻! {}, item.summarize()); } 对于 item 参数我们指定了 impl 关键字和 trait 名称而不是具体的类型。该参数支持任何实现了指定 trait 的类型。在 notify 函数体中可以调用任何来自 Summary trait 的方法比如 summarize。我们可以传递任何 NewsArticle 或 Weibo 的实例来调用 notify。任何用其它如 String 或 i32 的类型调用该函数的代码都不能编译因为它们没有实现 Summary。 5.Trait Bound 语法 impl Trait 语法适用于直观的例子它实际上是一种较长形式语法的语法糖。我们称为 trait bound它看起来像 pub fn notifyT: Summary(item: T) {println!(热点新闻! {}, item.summarize()); } 这与之前的例子相同不过稍微冗长了一些。trait bound 与泛型参数声明在一起位于尖括号中的冒号后面。 impl Trait 很方便适用于短小的例子。更长的 trait bound 则适用于更复杂的场景。例如可以获取两个实现了 Summary 的参数。使用 impl Trait 的语法看起来像这样 pub fn notify(item1: impl Summary, item2: impl Summary) { 这适用于 item1 和 item2 允许是不同类型的情况只要它们都实现了 Summary。不过如果你希望强制它们都是相同类型呢这只有在使用 trait bound 时才有可能 pub fn notifyT: Summary(item1: T, item2: T) { 泛型 T 被指定为 item1 和 item2 的参数限制如此传递给参数 item1 和 item2 值的具体类型必须一致。 6.通过 指定多个 trait bound 如果 notify 需要显示 item 的格式化形式同时也要使用 summarize 方法那么 item 就需要同时实现两个不同的 traitDisplay 和 Summary。这可以通过 语法实现 pub fn notify(item: (impl Summary Display)) { 语法也适用于泛型的 trait bound pub fn notifyT: Summary Display(item: T) { 通过指定这两个 trait boundnotify 的函数体可以调用 summarize 并使用 {} 来格式化 item。 7.通过 where 简化 trait bound 然而使用过多的 trait bound 也有缺点。每个泛型有其自己的 trait bound所以有多个泛型参数的函数在名称和参数列表之间会有很长的 trait bound 信息这使得函数签名难以阅读。为此Rust 有另一个在函数签名之后的 where 从句中指定 trait bound 的语法。所以除了这么写 fn some_functionT: Display Clone, U: Clone Debug(t: T, u: U) - i32 { 还可以像这样使用 where 从句 fn some_functionT, U(t: T, u: U) - i32 whereT: Display Clone,U: Clone Debug, { 这个函数签名就显得不那么杂乱函数名、参数列表和返回值类型都离得很近看起来跟没有那么多 trait bounds 的函数很像。 8.返回实现 trait 的类型 也可以在返回值中使用 impl Trait 语法来返回实现了某个 trait 的类型 fn returns_summarizable() - impl Summary {Weibo {username: String::from(suntiger),content: String::from(中国队的世界排名因此上升了29位.,),reply: false,reweibo: false,} } 通过使用 impl Summary 作为返回值类型我们指定了 returns_summarizable 函数返回某个实现了 Summary trait 的类型但是不确定其具体的类型。在这个例子中 returns_summarizable 返回了一个 Weibo不过调用方并不知情。 返回一个只是指定了需要实现的 trait 的类型的能力在闭包和迭代器场景十分的有用第十三章会介绍它们。闭包和迭代器创建只有编译器知道的类型或者是非常非常长的类型。impl Trait 允许你简单的指定函数返回一个 Iterator 而无需写出实际的冗长的类型。 不过这只适用于返回单一类型的情况。例如这段代码的返回值类型指定为返回 impl Summary但是返回了 NewsArticle 或 Weibo 就行不通 fn returns_summarizable(switch: bool) - impl Summary {if switch {NewsArticle {headline: String::from(这不是梦,中国队进世界杯了!,),location: String::from(中国北京),author: String::from(suntiger),content: String::from(中国队有史以来第二次闯进世界杯.,),}} else {Weibo {username: String::from(suntiger),content: String::from(中国队的世界排名因此上升了29位.,),reply: false,reweibo: false,}} } 这里尝试返回 NewsArticle 或 Weibo。但不能编译因为 impl Trait 工作方式的限制。 9.使用 trait bound 有条件地实现方法 通过使用带有 trait bound 的泛型参数的 impl 块可以有条件地只为那些实现了特定 trait 的类型实现方法。例如前面例子 中的类型 PairT 总是实现了 new 方法并返回一个 PairT 的实例。不过在下一个 impl 块中只有那些为 T 类型实现了 PartialOrd trait来允许比较 和 Display trait来启用打印的 PairT 才会实现 cmp_display 方法 use std::fmt::Display;struct PairT {x: T,y: T, }implT PairT {fn new(x: T, y: T) - Self {Self { x, y }} }implT: Display PartialOrd PairT {fn cmp_display(self) {if self.x self.y {println!(The largest member is x {}, self.x);} else {println!(The largest member is y {}, self.y);}} } 也可以对任何实现了特定 trait 的类型有条件地实现 trait。对任何满足特定 trait bound 的类型实现 trait 被称为 blanket implementations它们被广泛的用于 Rust 标准库中。例如标准库为任何实现了 Display trait 的类型实现了 ToString trait。这个 impl 块看起来像这样 implT: Display ToString for T {// --snip-- } 因为标准库有了这些 blanket implementation我们可以对任何实现了 Display trait 的类型调用由 ToString 定义的 to_string 方法。例如可以将整型转换为对应的 String 值因为整型实现了 Display let s 3.to_string(); blanket implementation 会出现在 trait 文档的 “Implementers” 部分。 trait 和 trait bound 能够使用泛型类型参数来减少重复而且能够向编译器明确指定泛型类型需要拥有哪些行为。然后编译器可以利用 trait bound 信息检查代码中所用到的具体类型是否提供了正确的行为。在动态类型语言中如果调用了一个未定义的方法会在运行时出现错误。Rust 将这些错误移动到了编译时甚至在代码能够运行之前就强迫我们修复问题。另外我们也无需编写运行时检查行为的代码因为在编译时就已经检查过了。这样既提升了性能又不必放弃泛型的灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/87618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做网站的费用wordpress链接在哪里设置

【摘要】数据安全是计算机安全问题的核心,对于很多具有高度保密要求的单位,安全地存储重要数据,并且在不需要这些数据时作彻底销毁不被他人恢复是至关重要的。本文详细介绍了数据安全存储技术的发展现状,并结合典型的企业信息安全…

2013年以前pc网站建设找网页模板的网站好

产品概述: NCV8705 是一款低噪音、低功耗和低泄漏线性电压稳压器。该器件具有卓越的噪音和 PSRR 规格,适用于使用视频接收器、成像传感器、音频处理器或需要外部洁净电源的任何部件的产品。NCV8705 使用创新的自适应接地电流电路 可确保轻负载调节下的超…

建设网站怎么加购物车网站模板模板

SSH密钥文件 Github里面S设置SH公钥有两者选择方式 账号下的每个仓库都设置一个公钥,因为GitHub官方要求每个仓库的公钥都不能相同,所以每个账号都要搞一个密钥(很麻烦)给账号分配一个公钥,然后这个公钥就可以在这个…

网站建设最好的书籍是北京商场打折

作者简介: 目录 1.概述 2.CPU管理 3.内存管理 4.IO管理 1.概述 操作系统可以看作一个计算机的管理系统,对计算机的硬件资源提供了一套完整的管理解决方案。计算机的硬件组成有五大模块:运算器、控制器、存储器、输入设备、输出设备。操作…

做流量任务的试用网站新郑网络推广外包

MySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的“存储引擎”(storage_engine)呢?有时候面试题中也会问道MySQL几种常用的存储引擎的区别。这次就简短侃一下存储引擎那些事儿。先去查一下“引擎”概念。引擎(Engine)是电子平…

地方文明网站建设wordpress 文章id修改

导言 在如今的互联网时代,Java接口压力测试是评估系统性能和可靠性的关键一环。一旦接口不能承受高并发量,用户体验将受到严重影响,甚至可能导致系统崩溃。因此,了解如何进行有效的Java接口压力测试以及如何优化接口性能至关重要…

成都企业网站公司wordpress 媒体播放

固定时间窗口算法 固定时间窗口算法也可以叫做简单计数算法。网上有很多都将计数算法单独抽离出来。但是笔者认为计数算法是一种思想,而固定时间窗口算法是他的一种实现包括下面滑动时间窗口算法也是计数算法的一种实现。因为计数如果不和时间进行绑定的话那么失去…

网站开发开源软件织梦网站修改教程视频

前面我们讲完了Python的基础语法、基本的数据类型以及各种数据类型间的转换。现在可以进行Python的基础知识的逐步详解学习了。下面我们开始讲解Python基础知识:运算符。 在Python中,运算符是用于执行各种操作的符号,它们可以对数字、字符串…

网站设计与制作软件envato wordpress toolkit

最近公司要制作个文档库,直接就可以将jekyll应用到实际中。 模版使用了Jekyll Clean,这么模版相对内部简单一点,学习成本不会很大,而复杂的Minimal Mistakes就当作参考。 模版使用的CSS是Bootstrap v3.2.0版本的。为了省时点&…

做标签网站邀请码wordpress删除媒体库

如果使用了 https 协议,那么在建立 tcp 连接之后,还会进行 tls 握手。也就是 https 的证书验证和密钥传输的过程。简化的流程如下: 客户端发送请求服务端返回证书客户端验证证书,提取公钥,生成对称加密的密钥&#xf…

网站改版引导做网络销售怎么建立网站

导读:如何撰写出满意的大学本科计算机论文是现在很多人都为之苦恼的问题之一,而论文的撰写也并非易事,必定是需要花费很多心思和汗水的,本论文分类为大学计算机论文,下面是小编为大家整理的几篇大学本科计算机论文范文…

网站 建设可行性报告网站被收录后又被提出了

Java精品项目源码第61期垃圾分类科普平台(代号V061) 大家好,小辰今天给大家介绍一个垃圾分类科普平台,演示视频公众号(小辰哥的Java)对号查询观看即可 文章目录 Java精品项目源码第61期垃圾分类科普平台(代号V061)难度指数&…

电脑当服务器做网站阿里巴巴国际贸易网

目录 1.初始化项目2.配置跨域3.开始编写API3.1准备3.2路由处理函数router_make下的user.js3.3路由模块router下的user.js3.4入口文件app.js里面去新增这段代码3.5启动项目进行测试 👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你…

phpcms 怎么做视频网站首页html网站源码

传统的计算快速傅里叶变换的Cooley-Tukey算法效率极高,因其主要由蝶形运算构成,所以代码形式也非常简单,只是需要将输入或者输出按照位反转的方式重新排序。这个重新排序的步骤并不是必须的。Clive Temperton于1991年在Self-Sorting In-Place…

企业网站建设有哪些书籍app网站建设工作师

需求是这样的,从一个表读取数据,然后每次执行创建一个新表将值写入 读取这个表 写入到这个表 分别对应的是e、h列数据,代码如下: import pandas as pd import openpyxl import datetime dfpd.read_excel(rC:\Users\admin\Deskt…

网站建设协议书 保密条款方维网络科技有限公司

pycharm 官网 JetBrains: 软件开发者和团队的必备工具 python 官网 Python Release Python 3.11.5 | Python.org 软件安装 因为python需要借助pycharm所以需要安装 下边截图是重要的部分 pycharm python 终端安装 然后进行全局配置 打开pycahrm 可以在扩展里边搜索中…

郑州建站时间网页升级请记住新域名

汇编语言应该是我们如今学的最“低级”的语言了,由于如今不会再有人去学机器语言了。而汇编语言还在一些硬件或者嵌入式设备上使用并开发着。下面资料是为了大学的汇编考试整理的资料,如今与大家分享,希望能给大家提供帮助。 汇编语言程序设计…

公司网站后台如何上传视频外贸营销方式有哪些

预祝大家2011农历新年快乐,宏“兔”大展,心想事成~ 又是一年新年到,预祝大家2011农历新年快乐,宏“兔”大展,心想事成~ _____________________________________________________ 以下是附带的……

服务器网站扩容 一年1G价格网站建设可以自己弄吗知乎

DL/T1578-2021电力线路多旋翼无人机巡检系 DL/T 1578—2021标准的发布和实施对于架空电力线路的巡检工作具有里程碑式的意义。它不仅填补了多旋翼无人机巡检系统在行业标准方面的空白,还为电力行业提供了一套完整、科学的测试和评估方法。这将有助于提高架空电力线…

卖普洱茶做网站凡科客户通

我们作为用户是操作客户端的,所以对于客户端的代理就是正向的。牢记,我们是正向的,我们是正向的,我们是正向的。 正向代理和反向代理都是网络中常见的代理服务类型,它们在网络通信中的角色和功能有所不同。 正向代理&…