Rust 学习笔记:面向对象语言的特点

Rust语言的面向对象编程 以下是一个简单的例子,演示了如何定义一个结构体以及为其添加方法:```rustage: u32,println!```在上面的代码中,我们定义了一个Person结构体,其中包含name和age字段。接着,我们通过块为该结构体添加了两个方法:一个构造函数new和一个问候函数greet。 阅读详情

Rust 学习笔记:面向对象语言的特点

在编程社区中,对于一门语言必须具备哪些特性才能被认为是面向对象的,并没有达成共识。

面向对象语言具有某些共同的特征,即对象、封装和继承。让我们看看这些特征的含义以及 Rust 是否支持它们。

对象包含数据和行为

《设计模式:可重用面向对象软件的元素》一书是这样定义 OOP 的:

面向对象程序是由对象组成的。对象将数据和对该数据进行操作的过程打包。这些过程通常称为方法或操作。

使用这个定义,Rust 是面向对象的:结构体和枚举具有数据,而 impl 块提供结构体和枚举的方法。尽管带方法的结构体和枚举不称为对象,但它们提供了相同的功能。

封装隐藏了实现细节

与 OOP 相关的另一个方面是封装的思想,这意味着使用该对象的代码无法访问对象的实现细节。因此,与对象交互的唯一方法是通过它的公共 API。使用对象的代码不应该能够进入对象的内部并直接更改数据或行为。这使程序员能够更改和重构对象的内部结构,而无需更改使用该对象的代码。

我们可以使用 pub 关键字来决定代码中的哪些模块、类型、函数和方法应该是公共的,而默认情况下,其他的都是私有的。

例如,我们可以定义一个结构体 AveragedCollection,它有一个包含 i32 值的数组的字段。该结构体还可以有一个字段,包含向量中值的平均值,这意味着当任何人需要它时,不必根据需要计算平均值。换句话说, AveragedCollection 将为我们缓存计算出的平均值。

AveragedCollection 结构体的定义:

pub struct AveragedCollection {
    list: Vec<i32>,
    average: f64,
}

该结构体被标记为 pub,以便其他代码可以使用它,但结构体中的字段仍然是私有的。

我们希望确保每当从列表中添加或删除值时,平均值也会更新。我们通过在结构体上实现 add、remove 和 average 方法来实现这一点:

impl AveragedCollection {
    pub fn add(&mut self, value: i32) {
        self.list.push(value);
        self.update_average();
    }

    pub fn remove(&mut self) -> Option<i32> {
        let result = self.list.pop();
        match result {
            Some(value) => {
                self.update_average();
                Some(value)
            }
            None => None,
        }
    }

    pub fn average(&self) -> f64 {
        self.average
    }

    fn update_average(&mut self) {
        let total: i32 = self.list.iter().sum();
        self.average = total as f64 / self.list.len() as f64;
    }
}

我们将 list 和 average 字段保留为私有,公共方法 add、remove 和 average 是访问或修改 AveragedCollection 实例中的数据的唯一方法。当使用 add 方法将项添加到列表中或使用 remove 方法删除项时,每个项的实现都会调用私有的 update_average 方法,该方法也会处理平均字段的更新。average 方法返回 average 字段中的值,允许外部代码读取平均值,但不能修改它。

如果封装是一种语言被认为是面向对象的必要方面,那么 Rust 就满足了这个要求。对代码的不同部分使用 pub 或不使用 pub 的选项支持对实现细节进行封装。

作为类型系统和代码共享的继承

继承是一种机制,对象可以从另一个对象的定义中继承元素,从而获得父对象的数据和行为,而不必重新定义它们。

如果一种语言必须具有继承才能是面向对象的,那么 Rust 就不是这样的语言。如果不使用宏,就无法定义继承父结构的字段和方法实现的结构。

选择继承有两个主要原因。

一种是代码重用:为一种类型实现特定的行为,继承使能够为另一种类型重用该实现。在 Rust 代码中,你可以使用默认的 trait 方法实现以有限的方式做到这一点。

pub trait Summary {
    fn summarize(&self) -> String {
        String::from("(Read more...)")
    }
}

我们在 Summary trait 上添加了一个 summarize 方法的默认实现。任何实现 Summary trait 的类型都可以在其上使用 summarize 方法,而无需任何进一步的代码。这类似于父类具有方法的实现,继承子类也具有该方法的实现。当我们实现 Summary trait 时,我们也可以覆盖 summarize 方法的默认实现,这类似于子类覆盖从父类继承的方法的实现。

使用继承的另一个原因与类型系统有关:使子类型能够在与父类型相同的位置使用。这也称为多态性,这意味着如果多个对象共享某些特征,则可以在运行时相互替换。Rust 使用泛型来抽象不同可能的类型和 trait 约束,以对这些类型必须提供的内容施加约束。这有时被称为有界参数多态性。

在许多编程语言中,继承作为一种编程设计解决方案最近已经不受欢迎了,因为它经常冒着共享不必要的代码的风险。子类不应该总是共享父类的所有特征,但继承时会这样做。这可能会使程序设计的灵活性降低。它还引入了在子类上调用没有意义的方法或由于方法不适用于子类而导致错误的可能性。此外,一些语言只允许单继承(意味着子类只能继承一个类),这进一步限制了程序设计的灵活性。

由于这些原因,Rust 采用了使用 trait 对象而不是继承的不同方法。

【Rust指南】面向对象的实现 面向对象的编程语言通常实现了数据的封装与继承并能基于数据调用方法。“设计模式四人帮”在《设计模式》中给出面向对象的定义:面向对象的程序由对象组成,对象包装了数据和操作这些数据的过程,这些过程通常被称作方法或操作。Rust 并不是面向对象的语言,但是面向对象的功能都可以通过自身的特点来实现。 阅读详情

相关推荐

anaconda的conda国内加速镜像源(pytorch 快速安装)

最近清华源不太好使了,所以推荐中科大镜像源,如下 1.还原原始通道 conda config --remove-key channels 2.

qq_41719643的博客 2万+

【Rust】——【面向对象语言的特征】

目录 🎯对象包含数据和行为 🎯封装隐藏了实现细节 🎯继承,作为系统与代码共享

shsjssnn的博客 3416

使用STM32微控制器实现光电传感器的接口和数据处理

本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案,包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤,并给出相应的代码示例。本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案,包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤,并给出相应的代码示例。在光电传感器的接口和数据处理的实现过程中,要关注系统的性能。在使用STM32微控制器实现光电传感器的接口和数据处理之前,需要设计一个合适的硬件平台。

weixin_66608063的博客 3200

Rust 是面向对象的语言吗?

Rust 是一门 **多范式语言**,它不强迫你用 OOP 思维写代码——你可以根据场景选择最合适的范式

码刀攻城 1067

谷歌浏览器崩溃排查:闪退、卡死、网页打不开的修复指南

浏览器多进程架构通过进程隔离、GPU加速和扩展沙箱提升网页渲染效率,但配置损坏、扩展冲突、显卡驱动异常或系统资源不足时,常会以闪退、卡死、白屏、内存占用飙升和能上微信却打不开网页等形式暴露。排查价值在于先分层定位系统、进程、配置扩展与网页内容,再用无痕模式、chrome://crashes、chrome://gpu和浏览器任务管理器收集证据,避免盲目重装。对办公、开发运维和日常维护场景,禁用扩展、关闭硬件加速、刷新DNS缓存、重置配置文件乃至干净重装,都是可复用的工程化处置手段。围绕谷歌浏览器崩溃的典型症状

weixin_34138056的博客 425

反激开关电源变压器设计实战:从理论到绕制的完整流程解析

本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。

weixin_29305313的博客 683

Rust 程序设计语言学习——面向对象

面向对象编程(Object-Oriented Programming,OOP)是一种对程序进行建模方式。对象(Object)作为一个编程概念来源于 20 世纪 60 年代的 Simula 编程语言。这些对象影响了 Alan Kay 的编程架构,该架构中对象之间互相传递消息。他在 1967 年创造了面向对象编程 (object-oriented programming)这个术语。关于 OOP 是什么有很多相互矛盾的定义;在一些定义下,Rust 是面向对象的;在其他定义下,Rust 不是。

洪伟的专栏 2556

传感器模块的电路艺术:从引脚定义到系统集成的设计哲学

本文深入探讨传感器模块的电路设计艺术,从引脚定义到系统集成的完整设计哲学。重点解析电源管理、信号处理及I2C通信协议等核心电路原理,分享多模块协同中的电源架构、信号完整性和接地策略,为硬件工程师提供实用的系统级设计思维与实战案例。

o1p2q3r的博客 223

【Rust指南】面向对象的实现_csdn rust

面向对象的编程语言通常实现了数据的封装与继承并能基于数据调用方法。“设计模式四人帮”在《设计模式》中给出面向对象的定义:面向对象的程序由对象组成,对象包装了数据和操作这些数据的过程,这些过程通常被称作方法或操作。Rust并不是面向对象的语言,但是面向对象的功能都可以通过自身的特点来实现。Rust 避免将struct或enum称为对象,因为它们与impl块是分开的。

2501_90252633的博客 869

RFC 字符码转换深度解析:Unicode、非 Unicode 与 MDMP 系统的协奏

老版本 MDMP 系统不上传自定义映射时,Unicode 端会落回“预配置列表”。列表里可见西欧 1100、日文 8000、中文 8400 等经典编号。若需强制覆写映射,可在 SM59 ➡Unicode页签启用,或直接勾选作为兜底。字符编码问题常“潜伏”多年,一旦旧系统升级或新增语种便集中爆发。掌握 RFC code page 转换机理、灵活运用 SM59 选项、在早期对 LANG 字段和字段长度进行治理,是根治乱码与 short dump 的关键。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 222

锂电池的充电和放电曲线解读

锂电池充放电曲线是反映其性能的关键指标。充电曲线分为恒流和恒压两阶段:恒流阶段电压快速上升,恒压阶段电流逐渐降低;放电曲线则呈现平台期和快速衰减期特征。这些曲线受温度、充放电倍率及材料体系(如三元锂或磷酸铁锂)显著影响。通过分析曲线特征,可优化电池管理系统,实现精准的SOC估算、快充策略制定及故障诊断,从而在电池性能与安全性间取得平衡。不同应用场景(如新能源汽车或消费电子)对曲线形态有特定要求。

start_up_go的博客 5063

Rust 语言:认识 Rust

Rust语言在2006年作为 Mozilla 员工 Graydon Hoare 的私人项目出现,而 Mozilla 于 2009 年开始赞助这个项目。第一个有版本号的 Rust 编译器于2012 年 1 月发布。Rust 1.0 是第一个稳定版本,于 2015年5月15日发布。Graydon Hoare 是一个职业编程语言工程师,其日常工作就是给其他语言开发编译器和工具集,但是不会参与语言本身的设计,由于这种工作性质,他接触过很多编程语言,了解各种语言的优缺点。

简简单单Onlinezuozuo 1748

使用Transformer实现自动调制识别(RML2018)

image_size = 1024 # resize重置输入大小patch_size = 16 # 从输入图片中将被提取的块大小# 分成 num_patches 个块num_patches = (image_size // patch_size) #(72/6)**2 横着裁剪),],return x})

QAQIknow的博客 1321

Rust面向对象特性

一文了解Rust面向对象特性

分享Java,Rust相关技术 1565

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Rust 笔记:Rust 语言中的 结构体 与面向对象编程的实现

本文先介绍 Rust 语言中的 结构体 的基本用法,然后重点介绍了在 Rust 语言中通过结构体实现面向对象编程的思想、方法并给出了相当多的代码示范。

jclee95的个人博客 1481

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

30天拿下Rust之面向对象

在编程语言的世界中,Rust以其独特的内存安全、并发控制和高性能特性吸引了众多开发者。虽然Rust并非传统的面向对象编程语言(比如:C++、Java),但它依然支持并提供了一种颇具特色的面向对象编程方式,以实现类似于面向对象的编程范式。在Rust中,没有类的概念,但提供了模块、结构体、枚举、Trait来模拟面向对象编程的三大特性:封装、继承和多态。下面,我们分别进行介绍。虽然Rust并不是传统意义上的面向对象编程语言,但它提供了丰富的工具来模拟和实现面向对象的概念。

hope_wisdom的技术博客 1824

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Rust】Rust学习 第十七章Rust 的面向对象特性

关于 OOP 是什么有很多相互矛盾的定义;在一些定义下,Rust 是面向对象的;在其他定义下,Rust 不是。在本章节中,我们会探索一些被普遍认为是面向对象的特性和这些特性是如何体现在 Rust 语言习惯中的。接着会展示如何在 Rust 中实现面向对象设计模式,并讨论这么做与利用 Rust 自身的一些优势实现的方案相比有什么取舍。面向对象编程(Object-Oriented Programming,OOP)是一种模式化编程方式。这些对象影响了 Alan Kay 的编程架构中对象之间的消息传递。

StudyWinter的博客 1449

【Rust自学】17.1. Rust的面向对象的编程特性

基于某些定义,Rust是面向对象的:`struct`、`enum`包含数据,`impl`块为之提供了方法。但在Rust里带有方法的`struct`和`enum`并没有称之为对象。

A Rookie in San Domenico School 1183
上一篇: Rust 学习笔记:trait 对象
下一篇: Rust 学习笔记:实现状态模式
UestcXiye
博客等级 码龄8年 9028粉丝 1306原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值