首页 > 其他分享 >rust对T和&T实现trait意义

rust对T和&T实现trait意义

时间:2023-03-29 11:24:57浏览次数:32  
标签:BasicSpeaker 意义 trait speaker Speaker ref rust speak

如果T实现了某个trait,那么整个T类型的&T,也实现了该trait了吗?不是这样的。
为什么这样,例子说明下:

trait Speaker {
    fn speak(&self);
}

struct BasicSpeaker;
impl Speaker for BasicSpeaker {
    fn speak(&self) {
        println!("Hello!");
    }
}

let speaker = BasicSpeaker;
speaker.speak();

结果可以正确运行,结果打印"Hello!"

如果实现对BasicSpeaker的引用,仍然调用speak,Rust的点号操作会自动解引用变量,所以代码仍然可以工作。

// 为了具体说明,具体给出类型
let speaker_ref: &BasicSpeaker = &speaker;
speaker_ref.speak();

这里不要认为rust会将T自动实现&T的trait。可以用函数参数方式传递,不会发生自动解引用时候。

fn speak_to(s: impl Speaker) {
    s.speak();
}

fn main() {
    // Create a BasicSpeaker struct:
    let speaker = BasicSpeaker;
    // Pass speaker to the new function:
    speak_to(speaker);
}

直接调用没有问题,但是如果实现引用,就会出现问题:

let speaker_ref: &BasicSpeaker = &speaker;
speak_to(speaker_ref);

// 编译报错
error[E0277]: the trait bound `&BasicSpeaker: Speaker` is not satisfied
  --> src/main.rs:31:14
   |
31 |     speak_to(speaker_ref);
   |     -------- ^^^^^^^^^^^ the trait `Speaker` is not implemented for `&BasicSpeaker`
   |     |
   |     required by a bound introduced by this call
   |
   = help: the trait `Speaker` is implemented for `BasicSpeaker`
note: required by a bound in `speak_to`
  --> src/main.rs:16:21
   |
16 | fn speak_to(s: impl Speaker) {
   |                     ^^^^^^^ required by this bound in `speak_to`

For more information about this error, try `rustc --explain E0277`.
  • 错误信息提示需要实现对&BasicSpeaker的trait Speaker才行。

标签:BasicSpeaker,意义,trait,speaker,Speaker,ref,rust,speak
From: https://www.cnblogs.com/ellabrain/p/17268093.html

相关文章

  • rust 项目的文件结构
    发文原因很多初学者都使用cargonew[project_name]来创建项目,并直接在main.rs文件中实现所有功能。这样是不合理的,并不符合我们cargo的开发规范。下面将简单的介......
  • Rust 备忘清单_开发速查表分享
    Rust备忘清单IT宝库整理的Rust开发速查参考备忘单,旨在为编写基本语法和方法提供帮助。入门,为开发人员分享快速参考备忘单。Rust是一门系统编程语言,专注于安全,尤其是并发......
  • 穴位的解剖学意义
    天上一颗蛋22:23:16我不是一直很喜欢传统文化的嘛天上一颗蛋 22:23:37(没有学习过 感兴趣 属于引流狗的程度)天上一颗蛋 22:23:40天上一颗蛋 22:23:52我觉得中医这个东......
  • SQL Server 索引类型及意义
    一、什么是索引拿汉语字典的目录页(索引)打比方:正如汉语字典中的汉字按页存放一样,SQLServer中的数据记录也是按页存放的,每页容量一般为4K。为了加快查找的速度,汉语字(词)典......
  • 软件中各版本号的意义
    软件中各版本号的意义一、Alpha:Alpha是内部测试版,表示最初的版本,通常不向外部发布。Alpha版会有不少Bug,除非你想去测试最新的功能,不然通常不建议使用。测试二、Beta......
  • 深入Rust函数之函数参数与普遍函数
    起这两天翻阅标准库的时候,有一个用法让我十分不解:assert_eq!([2.4,f32::NAN,1.3].into_iter().reduce(f32::max).unwrap(),2......
  • Rust体验
    Rust体验目录Rust体验HelloWorld概述变量基本数据类型容器类型元组数组切片结构体枚举类型转换流程控制if-elseloopwhileforrangematchif-let语法糖while-let语法糖函数......
  • 如何使用Rust迭代器, 以Luhn Algorithm的实现为例
    本题来源自谷歌的Comprehensive-Rust课程第二天下午的练习问题描述在这个练习的描述中,LuhnAlgorithm是一种用来验证银行卡号是否合法的算法.他的具体流程如下:去掉......
  • 复数的物理意义2
    复数不仅有意义,而且可以用图示来优雅地解释。1、实函数与数轴变换大家都认识y=e^x,对于这样的初等函数,我们从小就学会使用直角坐标系来刻画它们:它们的特点都大同小异:把......
  • 复数的物理意义
    复数不仅有意义,而且可以用图示来优雅地解释。1、实函数与数轴变换大家都认识�=��y=e^x,对于这样的初等函数,我们从小就学会使用直角坐标系来刻画它们:它们的特点都大同小异:把......