广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Rust中的关联类型总结
  • 775
分享到

Rust中的关联类型总结

Rust关联类型Rust关联 2023-05-18 17:05:24 775人浏览 安东尼
摘要

目录1. 关联类型简介2. 关联类型与泛型的区别3. 关联类型的定义语法4. 关联类型的使用场景5. 关联类型与 trait 的配合使用6. 关联类型的优点1. 关联类型简介 关联类

1. 关联类型简介

关联类型是定义通用 trait 的一种机制。它允许在 trait 中定义一个或多个占位符类型,这些类型将在 trait 的实现中具体化。这样可以增强代码的可读性,因为它可以将容器内部的类型移动到 trait 中作为输出类型。

例如,在下面的例子中有一个叫作 Graph 的 trait,它的节点和边使用了两个关联类型。

trait Graph {
    type N;
    type E;

    fn has_edge(&self, n1: &Self::N, n2: &Self::N) -> bool;
    fn edges(&self, n: &Self::N) -> Vec<Self::E>;
}

2. 关联类型与泛型的区别

关联类型和泛型都可以用来定义通用 trait,但它们之间存在一些区别。如果 trait 中包含泛型参数,那么可以对同一个目标类型多次 impl 此 trait,每次提供不同的泛型参数。而关联类型方式只允许对目标类型实现一次。如果 trait 中包含泛型参数,那么在具体方法调用的时候,必须加以类型标注以明确使用的是哪一个具体的实现。而关联类型方式具体调用时不需要标注类型(因为不存在模棱两可的情况)。

例如,假设你有一个叫做 MyNumeric 的类型。你可以在此类型上实现 From、From、From 等多种数据转换。但是对于关联类型,一个类型只能实现一个 trait 一次。

trait A<T> {
    fn f(t: T) -> T;
}

struct S {}

// 第一个实现: A<String>
impl A<String> for S {
    fn f(t: String) -> String {
        t
    }
}

// 第二个实现:A<i32>
impl A<i32> for S {
    fn f(t: i32) -> i32 {
        t
    }
}

trait A {
    type Item;
    fn f(t: Self::Item) -> Self::Item;
}

struct S {}

impl A for S {
    type Item = i32;
    fn f(t: Self::Item) -> Self::Item {
        t
    }
}

因此,在选择使用关联类型还是泛型时,需要根据具体情况进行判断。如果针对特定类型的 trait 有多个实现(例如 From),则使用泛型;否则使用关联类型(例如 Iterator 和 Deref)。

3. 关联类型的定义语法

关联类型的定义语法如下:

trait Contains {
    type A;
    type B;

    fn contains(&self, _: &Self::A, _: &Self::B) -> bool;
}

注意使用了 Contains trait 的函数就不需要写出 A 或 B 了:

// 不使用关联类型
fn difference<A, B, C>(container: &C) -> i32
where
    C: Contains<A, B>,
{
    ...
}

// 使用关联类型
fn difference<C: Contains>(container: &C) -> i32 {
    ...
}

4. 关联类型的使用场景

关联类型可以用于多种场景,例如在定义通用容器时,可以使用关联类型来表示容器内部的元素类型。这样可以增强代码的可读性,因为它可以将容器内部的类型移动到 trait 中作为输出类型。

struct Container(i32, i32);

trait Contains {
    type A;
    type B;

    fn contains(&self, _: &Self::A, _: &Self::B) -> bool;
    fn first(&self) -> i32;
    fn last(&self) -> i32;
}

impl Contains for Container {
    type A = i32;
    type B = i32;

    fn contains(&self, number_1: &i32, number_2: &i32) -> bool {
        (&self.0 == number_1) && (&self.1 == number_2)
    }

    fn first(&self) -> i32 {
        self.0
    }

    fn last(&self) -> i32 {
        self.1
    }
}

5. 关联类型与 trait 的配合使用

关联类型可以与 trait 配合使用,这样可以更好地表达代码中的抽象概念。例如,在下面的例子中,我们定义了一个叫做 Contains 的 trait,它包含两个关联类型 A 和 B。然后我们定义了一个叫做 Container 的结构体,并为它实现了 Contains trait。在实现过程中,我们指定了 A 和 B 的具体类型为 i32。

struct Container(i32, i32);

trait Contains {
    type A;
    type B;

    fn contains(&self, _: &Self::A, _: &Self::B) -> bool;
}

impl Contains for Container {
    type A = i32;
    type B = i32;

    fn contains(&self, number_1: &i32, number_2: &i32) -> bool {
        (&self.0 == number_1) && (&self.1 == number_2)
    }
}

6. 关联类型的优点

关联类型有许多优点。首先,它可以增强代码的可读性,因为它可以将容器内部的类型移动到 trait 中作为输出类型。其次,它可以减少代码的冗余,因为它允许我们在定义通用 trait 时省略一些不必要的泛型参数。此外,它还可以提高代码的灵活性,因为它允许我们在实现 trait 时指定关联类型的具体类型。

以上就是Rust中的关联类型总结的详细内容,更多关于Rust关联类型的资料请关注编程网其它相关文章!

--结束END--

本文标题: Rust中的关联类型总结

本文链接: https://www.lsjlt.com/news/212247.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Rust中的关联类型总结
    目录1. 关联类型简介2. 关联类型与泛型的区别3. 关联类型的定义语法4. 关联类型的使用场景5. 关联类型与 trait 的配合使用6. 关联类型的优点1. 关联类型简介 关联类...
    99+
    2023-05-18
    Rust关联类型 Rust关联
  • JavaScript数据类型相关知识总结
    本篇内容介绍了“JavaScript数据类型相关知识总结”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!js...
    99+
    2022-10-19
  • php中的标量数据类型总结
    PHP 的数据类型可以分为三大类,分别是标量数据类型、复合数据类型和特殊数据类型。 其中,标量数据类型是数据结构的最基础单元,只能存储一个数据。在 PHP 中的标量数据类型分为四种,如下表所示: 类型 功能 boolean(布尔型) 最简单...
    99+
    2016-10-26
    php 标量数据类型
  • 总结Node.js中的一些错误类型
    前言 Node.js应用中可能会发生多种类型的错误。如:当出现语法错误或运行时错误时,会触发JavaScript错误;当试图试访问一个不存在或没有访问的文件时,会触发系统错误;除JavaScript错误和系...
    99+
    2022-06-04
    错误 类型 Node
  • java中引用类型的用法总结
    一、class作为成员变量在定义一个类Role(游戏角色)时,代码如下:使用 int 类型表示角色id和生命值,使用String类型表示姓名。此时,String 本身就是引用类型,由于使用的方式类似常量,所以往往忽略了它是引用类型的存在。如...
    99+
    2016-05-29
    java 引用类型 用法
  • Typescript中的数据类型实例总结
    目录是什么有哪些booleannumberstringarraytupleenumanynull和undefinedvoidneverobject总结是什么 typescript和j...
    99+
    2022-11-13
  • Python基础之数据类型相关知识总结
    1、字符串 (1)概念 字符串英文名string,简称str。 字符串就是由一个个字符连接起来的组合, 你平时所见的字母、数字、汉字、符号都是字符。 字符串可以用...
    99+
    2022-11-12
  • Java中String类常用类型实例总结
    目录1.创建字符串的方法1.1构造1.2引用对象 2.字符串的比较3.字符串的不可改变性4.数组转字符串 5.判断是否是数字字符串  isNumberChar(  ) 6....
    99+
    2022-11-12
  • 关于JS数据类型检测的多种方式总结
    目录背景 判断数据类型的手段有哪些? 1. 用typeof判断基础数据类型: 2. 用instanceof判断对象数据类型3. 用contructor属性 4. toString方法...
    99+
    2022-11-12
  • Android Mms之:对话与联系人关联的总结详解
    在Mms中每个Thread都有其相应的联系人,但是threads表中并没有直接保存联系人的信息(号码或名字),而是保存一个叫做recipient_id的东西,也还有一个类叫做d...
    99+
    2022-06-06
    联系 Android
  • Java中引用类型class的用法总结
    目录class作为成员变量角色类武器类铠甲类角色增强类测试类实际的开发中,引用类型的使用非常重要,也是非常普遍的。我们可以在理解基本类型的使用方式基础上,进一步去掌握引用类型的使用方...
    99+
    2022-11-13
    Java引用类型class Java引用 class Java class
  • PHP中最低级别的错误类型总结
    序言:php错误就是会使脚本运行不正常的情况。 php的错误有很多种,包括warning、notice、deprecated、fetal error等。其中notice不叫通知,而叫通知级别的错误,warning也不叫警告,而叫警告级别的错...
    99+
    2019-07-10
    PHP 低级错误
  • c语言中缺省参数的类型总结
    1、函数全缺省参数,函数在定义或者声明时,所有的形参都默认值。 #include <stdio.h> //x,y为函数的形参,如果函数被调用时,没有设置x和y值,x值...
    99+
    2022-11-12
  • php缓存的类型总结及用法
    一个网站或者一个应用的标准流程是浏览器向应用服务器发出请求,应用服务器做一些计算和逻辑判断之后再请求数据库,数据库收到请求后在经过计算将数据返回给应用服务器,应用服务器再次计算后把数据返回给浏览器 那么,随着web业务的复杂度和并发量的增加...
    99+
    2016-10-24
    php 缓存
  • Java引用类型interface的用法总结
    目录interface作为成员变量法术接口和实现英雄角色interface作为方法参数和返回值类型interface作为成员变量 接口是对方法的封装,对应游戏当中,可以看作是扩展游戏...
    99+
    2022-11-13
    Java引用类型interface Java引用 interface Java interface
  • 默认的MIME类型关联是怎样的
    默认的MIME类型关联是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。根据 Web 服务器的情况,不同的 MIME 类型可以与不同的文件扩展名相关联。下表列出了 Inte...
    99+
    2023-06-03
  • Java中类与对象的相关知识点总结
    目录一、面向过程与面向对象的理解二、类与对象的理解与认识三、类的成员1.字段/属性/成员变量2.对null的基本认识3.方法 (method)4.static 关键字四、封装1. p...
    99+
    2022-11-12
  • SQL关系模型的知识梳理总结
    目录关系模型主键外键一对多多对多一对一索引索引的概念与用法唯一索引Tips关系模型 关系数据库是建立在关系模型上的。而关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Ex...
    99+
    2022-11-12
  • 枚举类型的定义和应用总结
    定义:如果一种变量只有几种可能的值,可以定义为枚举类型。所谓“枚举类型”是将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。 声明:声明枚举类型用enum开头,例如:复制代...
    99+
    2022-11-15
    枚举类型
  • 总结Python函数参数的六种类型
    目录一、函数的单参数传递二、多参数传递三、关键字参数四、缺省参数五、不定长参数 - 元组六、不定长参数 - 字典前言: Python函数之所以很好用,还有一点就的能传递参数实现不同场...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作