AsRef、Deref和Borrow有哪些区别

区别在于AsRef和Borrow都是带了泛型参数的, 这意味着它们的实现者可以同时有多种转换(&T->&U1, &T->&U2 …),而Deref用的是关联类型,只能有一种这样转换。AsRef是用于一般的、轻量级的且不会失败的不同类型的引用之间的转换。

AsRef、Deref和Borrow有哪些区别-Worktile社区

AsRef

AsRef是用于一般的、轻量级的且不会失败的不同类型的引用之间的转换。

(如果转换开销较大请用impl From<&T> for &U,如果可能失败请用一个返回Option或者Result的专用方法)

Borrow

Borrow是用于一个类型的不同表示类型(如Box<T>, Rc<T>,Cow<T>)的引用到原类型(T)引用的转换。

(这些表示类型为不同用途提供了额外的功能,如Box<T>和Rc<T>为T提供的内存管理,Cow<T>提供的写时复制)

它要求Hash, Ord, Eq 在转换前后等价,如x.borrow() == y.borrow()和x == y的结果应该相同。 Borrow对所有T和&T都有个默认的空实现(&T->&T),所以可以用它来同时接收T和&T。

Deref

Deref是为智能指针设计的,只应被智能指针类型实现。它会根据解引用规则自己动,不需要显式的调用.deref(), 并且如果T实现了Deref<Target = U> 那么&T可以隐式转换成&U。

Deref是deref操作符*的 trait,比如*v。在修改mut&的值的时候会用到。Deref还会有更多深层次的嵌套,比如把其它类型的指针(比如在库中定义的,Box, Rc, Arc, Cow 等),转成内部标准形式 &v;或者把多重 & (比如:&&&&&&&v),简化成 &v(通过插入足够数量的 * 进行解引)。

总结:AsRef和Borrow都是带了泛型参数的, 这意味着它们的实现者可以同时有多种转换(&T->&U1, &T->&U2 …),而Deref用的是关联类型,只能有一种这样转换。

延伸阅读:

什么是泛型类?

什么是泛型,如何使用和定义泛型?泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其形参的类型之

文章标题:AsRef、Deref和Borrow有哪些区别,发布者:小编,转载请注明出处:https://worktile.com/kb/p/38528

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编小编站长
上一篇 2023年2月16日 下午11:14
下一篇 2023年2月16日 下午11:16

相关推荐

  • 如何有效管理多代人员的工作团队

    有效管理多代人员的工作团队主要涉及以下几个方面:1、理解不同代人员的价值观和沟通方式;2、创建包容性工作环境;3、提供个性化的激励和支持;4、促进跨代沟通与合作;5、设立公平的评估和晋升体系。在其中,促进跨代沟通与合作是一个关键环节,它涉及到如何通过定期的团队建设活动、合适的沟通工具和开放的沟通氛围…

    2023年8月21日
    13300
  • Java 中的 JDK 和 JRE 有什么区别

    Java 中的 JDK 和 JRE的区别是:JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境和JAVA工具。JRE是一个软件,由太阳微系统所研发,JRE可以让计算机系统运行Java应用程序。

    2023年2月13日
    1.1K00
  • 项目风险评估与管理方法

    项目风险评估与管理是确保项目成功的关键因素。本文将探讨其核心观点:1、风险识别;2、风险分析;3、风险评估;4、风险应对;5、风险监控。 首先,项目组需通过全面识别潜在风险来开始风险管理过程,确保隐患可被提前发现并处理。接着,对已识别风险进行定性与定量分析,以明确风险可能带来的影响及发生概率。评估步…

    2023年11月16日
    1700
  • 管理软件有什么用处

    管理软件的用处:1、便于项目制定计划;2、便于优化项目流程;3、便于各部门沟通协作;4、便于可视化管理;5、便于项目成员办公等。便于项目制定计划是指,项目管理软件可帮助项目团队巧妙地制定项目计划,理清项目计划的优先顺序。 1、便于项目制定计划 项目管理软件可帮助项目团队巧妙地制定项目计划,理清项目计…

    2023年4月4日
    10400
  • 阿拉丁史文禄:恐惧于确定的未来,小程序年内将迎来爆发

    文| babayage 编辑 |笑 笑 有这样一类创业者,他们并不执念于物质与功名,而是沉迷于探究时代的底层脉搏,小有把握便躬身入局。只要为之投身奋斗的行业如期崛起,即便自己磕得头破血流,也会大笑着举杯豪饮,高呼“痛快,痛快!” 史文禄,就是这样一位连续创业者。 有人恐惧于未知有人恐惧于确定 “在国…

    2022年3月20日
    41800
  • 代码编程软件有哪些

    代码编程软件有:1、Vim;2、C++编译器;3、Dev-C++;4、Visual Studio;5、MyEclipse;6、NetBeans;7、Sublime Text。Vim是一款文本代码编辑器,它最大的特点就是全键盘的操作编辑方式,可以完全脱离鼠标,这种方式一旦掌握,结合键盘各种组合操作可以…

    2023年1月12日
    2.2K00
  • 如何在云原生平台上部署机器学习模型

    云原生平台提供强大的基础设施支持,适合在其上部署机器学习(ML)模型以实现高效的运算和全球化的服务。部署ML模型的主体流程包括1、容器化ML模型;2、选择和配置云原生服务;3、持续集成和持续部署(CI/CD)流程的构建;4、服务的监控与优化。容器化有助于在不同环境间一致地部署ML模型。云服务选择侧重…

    2023年11月23日
    700
  • 实现跨部门协作的步骤,提高研发效能

    实现跨部门协作是提高研发效能的关键步骤,详细步骤:1、建立共同目标和愿景;2、理解各部门的角色和责任;3、建立有效的沟通渠道;4、协调流程和工作方式;5、建立协作机制和框架;6、促进知识共享和学习;7、应对冲突和挑战;8、强化团队建设和文化融合;9、利用技术和工具;10、持续优化和改进。跨部门协作的成功关键在于清晰的沟通、共同的目标、有效的协作机制和持续的改进。

    2023年11月12日
    2500
  • apex入库代码

    本文主要解释和展示了在Oracle APEX(Application Express)环境中进行入库操作的代码实现。内容涉及三个主要部分:1、APEX入库操作的基本概念;2、APEX入库代码的核心步骤与示例;3、APEX入库操作的常见问题与解决方案。Oracle Application Expres…

    2023年8月14日
    10200
  • sql server数据库怎么连接不到

    原因有:一、网络连接问题;二、数据库实例问题;三、安全问题;四、数据库配置问题;五、其他问题。SQL Server是一个客户端-服务器架构的数据库系统,因此网络连接是连接数据库的关键。如果网络连接存在问题,数据库连接也会受影响。 一、网络连接问题 SQL Server是一个客户端-服务器架构的数据库…

    2023年6月11日
    47700

发表回复

登录后才能评论
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部