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

斗鱼网站开发是用什么语言微信公众号如何快速涨粉

斗鱼网站开发是用什么语言,微信公众号如何快速涨粉,企业云服务,小程序搭建步骤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.ihoyoo.com/news/39723.html

相关文章:

  • 义乌网站建设公司书生商友为了加强公司网站建设
  • 网站如何优化排名网页美工设计实训中职期末试卷
  • 陕西网站备案代理网站建设考虑哪些因素
  • 手机网站开发入门互联网网站制作
  • 网站需要哪些证件如何做好营销
  • 个人网站免费注册广东省建设安全中心网站
  • 企业公司建设网站京东快递 网站建设特点
  • 公司网站怎么做备案html5网页素材
  • 做网站哪个服务器好新市区做网站
  • 推荐个网站免费的射洪哪里可以做网站
  • 哪个网站是专门做招商的平台如何在网站上做支付功能
  • 沈阳公司做网站个人网站项目策划书
  • 中国做网站的网站网站流量被黑
  • 企业网站建设内存分析凡客诚品失败的原因
  • 专门做建筑设计图库的网站设计奉贤高端网站建设
  • 廊坊中小企业网站制作优化关键词快速排名
  • 上海大型网站建设公司杭州seo托管公司推荐
  • 正规网站建设团队是什么seo职业
  • 境外建设网站贴吧网络营销专业职业规划
  • 网站域名在哪里买动态个人网站模板
  • 个人nas做网站精准推广
  • 网站开发使用天气api效果图制作设计
  • 钛钢饰品网站建设腾讯免费企业邮箱注册申请
  • vs网站开发实例vs网站开发需要的组件
  • 鄂州网站建设哪家好计算机网络技术课程
  • 自己做的视频网站上传电影彬县网吧
  • 网站用小程序商城网站离不开支付系统
  • 免费ppt成品网站网站开发和网络设计有什么区别
  • 浏览国外网站 dns福建电信网站备案
  • 海南网站制做的公司宿州科技网站建设