我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Rust的泛型和特性是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Rust的泛型和特性是什么

这篇文章主要介绍了Rust的泛型和特性是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

Rust是 Mozilla 的一个新的编程语言,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。由web语言的领军人物Brendan Eich(js之父),Dave Herman以及Mozilla公司的Graydon Hoare 合力开发。

Rust的泛型和特性是什么

在函数中定义泛型

这是一个对整型数字选择排序的方法: 实例

fn max(array: &[i32]) -> i32 {   let mut max_index = 0;   let mut i = 1;   while i len() {       if array[i] > array[max_index] {           max_index = i;       }       i += 1;   }   array[max_index]}fn main() {   let a = [2, 4, 6, 3, 1];   println!("max = {}", max(&a));}

运行结果:

max = 6

这是一个简单的取最大值程序,可以用于处理 i32 数字类型的数据,但无法用于 f64 类型的数据。通过使用泛型我们可以使这个函数可以利用到各个类型中去。但实际上并不是所有的数据类型都可以比大小,所以接下来一段代码并不是用来运行的,而是用来描述一下函数泛型的语法格式:

实例

fn max(array: &[T]) -> T {   let mut max_index = 0;   let mut i = 1;   while i len() {       if array[i] > array[max_index] {           max_index = i;       }       i += 1;   }   array[max_index]}

结构体与枚举类中的泛型

在之前我们学习的 Option 和 Result 枚举类就是泛型的。

Rust 中的结构体和枚举类都可以实现泛型机制。

struct Point {   x: T,   y: T}

这是一个点坐标结构体,T 表示描述点坐标的数字类型。我们可以这样使用:

let p1 = Point {x: 1, y: 2};let p2 = Point {x: 1.0, y: 2.0};

使用时并没有声明类型,这里使用的是自动类型机制,但不允许出现类型不匹配的情况如下:

let p = Point {x: 1, y: 2.0};

x 与 1 绑定时就已经将 T 设定为 i32,所以不允许再出现 f64 的类型。如果我们想让 x 与 y 用不同的数据类型表示,可以使用两个泛型标识符:

struct Point {   x: T1,   y: T2}

在枚举类中表示泛型的方法诸如 Option 和 Result:

enum Option {   Some(T),   None,}enum Result {   Ok(T),   Err(E),}

结构体与枚举类都可以定义方法,那么方法也应该实现泛型的机制,否则泛型的类将无法被有效的方法操作。

实例

struct Point {   x: T,   y: T,}impl Point {   fn x(&self) -> &T {       &self.x   }}fn main() {   let p = Point { x: 1, y: 2 };   println!("p.x = {}", p.x());}

运行结果:

p.x = 1

注意,impl 关键字的后方必须有 ,因为它后面的 T 是以之为榜样的。但我们也可以为其中的一种泛型添加方法:

impl Point {   fn x(&self) -> f64 {       self.x   }}

impl 块本身的泛型并没有阻碍其内部方法具有泛型的能力:

impl Point {   fn mixup(self, other: Point) -> Point {       Point {           x: self.x,           y: other.y,       }   }}

方法 mixup 将一个 Point 点的 x 与 Point 点的 y 融合成一个类型为 Point 的新点。

特性

特性(trait)概念接近于 Java 中的接口(Interface),但两者不完全相同。特性与接口相同的地方在于它们都是一种行为规范,可以用于标识哪些类有哪些方法。

特性在 Rust 中用 trait 表示:

trait Descriptive {   fn describe(&self) -> String;}

Descriptive 规定了实现者必须有是 describe(&self) -> String 方法。

我们用它实现一个结构体:

实例

struct Person {   name: String,   age: u8}impl Descriptive for Person {   fn describe(&self) -> String {       format!("{} {}", self.name, self.age)   }}

格式是:

impl  for

Rust 同一个类可以实现多个特性,每个 impl 块只能实现一个。

默认特性

这是特性与接口的不同点:接口只能规范方法而不能定义方法,但特性可以定义方法作为默认方法,因为是”默认”,所以对象既可以重新定义方法,也可以不重新定义方法使用默认的方法:

实例

trait Descriptive {   fn describe(&self) -> String {       String::from("[Object]")   }}struct Person {   name: String,   age: u8}impl Descriptive for Person {   fn describe(&self) -> String {       format!("{} {}", self.name, self.age)   }}fn main() {   let cali = Person {       name: String::from("Cali"),       age: 24   };   println!("{}", cali.describe());}

运行结果:

Cali 24

如果我们将 impl Descriptive for Person 块中的内容去掉,那么运行结果就是:

[Object]

特性做参数

很多情况下我们需要传递一个函数做参数,例如回调函数、设置按钮事件等。在 Java 中函数必须以接口实现的类实例来传递,在 Rust 中可以通过传递特性参数来实现:

fn output(object: impl Descriptive) {   println!("{}", object.describe());}

任何实现了 Descriptive 特性的对象都可以作为这个函数的参数,这个函数没必要了解传入对象有没有其他属性或方法,只需要了解它一定有 Descriptive 特性规范的方法就可以了。当然,此函数内也无法使用其他的属性与方法。

特性参数还可以用这种等效语法实现:

fn output(object: T) {   println!("{}", object.describe());}

这是一种风格类似泛型的语法糖,这种语法糖在有多个参数类型均是特性的情况下十分实用:

fn output_two(arg1: T, arg2: T) {   println!("{}", arg1.describe());   println!("{}", arg2.describe());}

特性作类型表示时如果涉及多个特性,可以用 + 符号表示,例如:

fn notify(item: impl Summary + Display)fn notify(item: T)

注意:仅用于表示类型的时候,并不意味着可以在 impl 块中使用。

复杂的实现关系可以使用 where 关键字简化,例如:

fn some_function(t: T, u: U)

可以简化成:

fn some_function(t: T, u: U) -> i32   where T: Display + Clone,         U: Clone + Debug

在了解这个语法之后,泛型章节中的”取最大值”案例就可以真正实现了:

实例

trait Comparable {   fn compare(&self, object: &Self) -> i8;}fn max(array: &[T]) -> &T {   let mut max_index = 0;   let mut i = 1;   while i len() {       if array[i].compare(&array[max_index]) > 0 {           max_index = i;       }       i += 1;   }   &array[max_index]}impl Comparable for f64 {   fn compare(&self, object: &f64) -> i8 {       if &self > &object { 1 }       else if &self == &object { 0 }       else { -1 }   }}fn main() {   let arr = [1.0, 3.0, 5.0, 4.0, 2.0];   println!("maximum of arr is {}", max(&arr));}

运行结果:

maximum of arr is 5

Tip: 由于需要声明 compare 函数的第二参数必须与实现该特性的类型相同,所以 Self (注意大小写)关键字就代表了当前类型(不是实例)本身。

特性做返回值

特性做返回值格式如下:

实例

fn person() -> impl Descriptive {   Person {       name: String::from("Cali"),       age: 24   }}

但是有一点,特性做返回值只接受实现了该特性的对象做返回值且在同一个函数中所有可能的返回值类型必须完全一样。比如结构体 A 与结构体 B 都实现了特性 Trait,下面这个函数就是错误的:

实例

fn some_function(bool bl) -> impl Descriptive {   if bl {       return A {};   } else {       return B {};   }}

有条件实现方法

impl 功能十分强大,我们可以用它实现类的方法。但对于泛型类来说,有时我们需要区分一下它所属的泛型已经实现的方法来决定它接下来该实现的方法:

struct A {}impl A {   fn d(&self) {}}

这段代码声明了 A 类型必须在 T 已经实现 B 和 C 特性的前提下才能有效实现此 impl 块。

感谢你能够认真阅读完这篇文章,希望小编分享的“Rust的泛型和特性是什么”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Rust的泛型和特性是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Rust的泛型和特性是什么

这篇文章主要介绍了Rust的泛型和特性是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Rust是 Mozilla 的一个新的编程语言,专注于安全,尤其是并发安全,支持函数
2023-06-27

Java泛型的特性是什么

本篇内容介绍了“Java泛型的特性是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!泛型概述泛型在java中有很重要的地位,在面向对象编程
2023-06-02

JDK5.0新特性的泛型怎么理解

本篇文章给大家分享的是有关JDK5.0新特性的泛型怎么理解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。没有参数的情况下使用泛型 既然在J2SE 5.0中收集类型已经泛型
2023-06-03

C++ 泛型编程的优势和局限性是什么?

泛型编程是一种c++++技术,具有如下优势:提高代码重用性,可处理多种数据类型。代码更简洁易读。在某些情况下可提高效率。但它也存在局限性:编译时需要更多时间。编译后代码会更大。可能产生运行时开销。C++ 泛型编程:优势与局限性优势代码重用
C++ 泛型编程的优势和局限性是什么?
2024-04-24

泛型和元编程的模型是什么

这篇文章主要介绍“泛型和元编程的模型是什么”,在日常操作中,相信很多人在泛型和元编程的模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”泛型和元编程的模型是什么”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-15

golang泛型的特点和限制:探索值得的新特性

golang泛型的优势和限制:值得一试的新特性,需要具体代码示例摘要:Golang是一种强类型的静态语言,一直以来,其缺乏泛型特性一直备受争议。然而,近期Golang开发团队正积极推进泛型特性的引入,以提供更高的代码复用性和可读性。本文将
golang泛型的特点和限制:探索值得的新特性
2024-01-20

TypeScript中的接口和泛型是什么

这篇文章给大家分享的是有关TypeScript中的接口和泛型是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。接口使用 interface 关键字来定义数据类型对象类型当存在于较长的数据类型约束时,我们可以通过
2023-06-29

LINQ查询和泛型类型的关系是什么

本篇内容介绍了“LINQ查询和泛型类型的关系是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!LINQ查询基于泛型类型,在 .NET Fr
2023-06-17

java泛型指的是什么

这篇文章主要讲解了“java泛型指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java泛型指的是什么”吧!概念1、泛型是指类型可以作为参数传递,本质上是类型参数。例如,当我们定义一
2023-06-30

java中使用泛型屏蔽类型的差异性是什么

这篇文章主要为大家展示了“java中使用泛型屏蔽类型的差异性是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中使用泛型屏蔽类型的差异性是什么”这篇文章吧。使用泛型屏蔽类型的差异性在C
2023-06-02

Java泛型的作用是什么

这篇“Java泛型的作用是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java泛型的作用是什么”文章吧。简介泛型的作用
2023-06-29

javascript引用类型的特性是什么

这篇文章主要介绍javascript引用类型的特性是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、引用类型的值是可变的。var person = {};//创建个控对象 --引用类型person.name =
2023-06-15

java中的泛型指的是什么

这篇文章主要讲解了“java中的泛型指的是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中的泛型指的是什么”吧!目录一、什么是泛型二、语法三、示例1、简单示例2、返回最大值-支持
2023-06-20

Java中的泛型是什么意思

这篇文章主要介绍“Java中的泛型是什么意思”,在日常操作中,相信很多人在Java中的泛型是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的泛型是什么意思”的疑惑有所帮助!接下来,请跟着小编
2023-06-03

go语言中泛型是的是什么

今天小编给大家分享的是go语言中泛型是的是什么,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。在go语言中,泛型就是编写模板适应所有类型,只有在具体使用时才定义具体变量类型;通过引入类
2023-07-04

FlexBuilder的概念和特性是什么

这篇文章将为大家详细讲解有关FlexBuilder的概念和特性是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。【FlexBuilder】FlexBuilder4将改名FlashBuilder42009
2023-06-17

Django的优点和特性是什么

Django是一个用于Web开发的高级Python框架,拥有许多优点和特性,包括:高度可扩展性:Django提供了许多可插拔的组件和扩展,使开发人员能够轻松地扩展和定制应用程序。高度安全性:Django内置了一些安全功能,如防止SQL注入、
Django的优点和特性是什么
2024-03-05

golang泛型的使用方法是什么

Golang目前还不支持泛型,不过Go团队正在开发一种新的泛型系统,以提供更灵活的类型系统。该泛型系统将被称为Type Parameters(类型参数)。尽管Golang当前版本不支持泛型,但可以使用其他方法来模拟泛型的行为。下面是一些常见
2023-10-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录