当前位置: 首页 > news >正文

[读书日志]从零开始学习Chisel 第四篇:Scala面向对象编程——操作符即方法(敏捷硬件开发语言Chisel与数字系统设计)

3.2操作符即方法
3.2.1操作符在Scala中的解释

在其它语言中,定义了一些基本的类型,但这些类型并不是我们在面向对象中所说的类。比如说1,这是一个int类型常量,但不能说它是int类型的对象。针对这些数据类型,存在一些基本操作符,比如算数操作符“+”。Scala所追求的是极致的面向对象,因此Scala其实定义了 class Byteclass Short等等9个值类,但他们是不可继承的,抽象的,不能通过new创建一个Int对象,也不能编写他们的子类。

严格来说,Scala不存在操作符的概念,这些算术运算的加减乘除,逻辑运算的与或非,比较运算的大于小于等,其实都是定义在class Intclass Double中的成员方法。在Scala中,操作符即方法。在Scala中,表达式1+2的真正形式是1.+(2)也就是说,调用了Int类的“+”方法,对象2是一个传入的参数,最后返回一个对象3。

操作符即方法的概念不仅仅限于9种值类的操作符,Scala种任何类定义的成员方法都是操作符,且方法调用都能写成操作符的形式:去掉句点符号,并且在方法参数只有一个时可以省略括号。

在书中给出的代码是这样的:

scala> class Students3(val name: String,var score: Int) {| def exam(s:Int) = score = s| def friends(n:String,s:Int) = println("My friend " + n + " gets " + s + ".")| override def toString = name + "'s score is " + score + "."| }
​
// defined class Students3
​
scala> val stu3 = new Students3("Alice",80)
val stu3: Students3 = Alice's score is 80.
​
scala> stu3 exam 100
1 warning found
-- Warning: ------------------------------------------------------------------------------------------------------------
1 |stu3 exam 100|     ^^^^|     Alphanumeric method exam is not declared infix; it should not be used as infix operator.|     Instead, use method syntax .exam(...) or backticked identifier `exam`.

但在最新版Scala中直接调用会报错,这是因为新版Scala对于这个使用方法进行了约束,有3种解决方案:解决方法

方法 1:使用标准方法调用语法

将代码修改为标准的点号方法调用:

stu3.exam(100)

方法 2:使用反引号

如果希望继续使用中缀调用,则可以用反引号标记方法:

stu3 `exam` 100

方法 3:定义方法为 @infix(推荐)

如果希望以中缀形式调用 exam,可以在方法定义上添加 @infix 注解。例如:

import scala.annotation.infix
​
class Student {@infixdef exam(score: Int): Unit = {println(s"Score: $score")}
}

然后即可使用:

stu3 exam 100
3.2.2三种操作符

前缀操作符

只有“+,-,!,~”这四个,他们的操作数只有1个。可以创建一个类,在其中自定义这些方法,要求命名的格式类似于“unary_+”,如果末尾操作符在这四个以外,则不能使用这样的方法调用:

scala> class MyInt(val x:Int) {| def unary_! = -x| def unary_* = x * 2| }
// defined class MyInt
​
scala> val mi = new MyInt(10)
val mi: MyInt = MyInt@4df13dd0
​
scala> !mi
val res1: Int = -10
​
scala> *mi

*mi在这里是无法调用的,无法输出结果,必须以下面的形式调用:

scala> mi.unary_*
val res2: Int = 20

中缀操作符

中缀操作符左右两边都接收操作数,它对应普通的有参方法。两个操作数中的一个是调用该方法的对象,一个是传入该方法的参数,参数没有数量限制,只不过多个参数需要放在圆括号中。规定以冒号:结尾的操作符,其右操作数是调用该方法的对象,其余的操作数的左操作数是调用该方法的对象。

scala> class MyInt2(val x:Int) {| def +*(y:Int) = (x + y) * y| def +:(y:Int) = x + y| }
// defined class MyInt2
​
scala> val mi2 = new MyInt2(10)
val mi2: MyInt2 = MyInt2@6bf54260
​
scala> mi2 +* 10
val res3: Int = 200
​
scala> mi2 +: 10
-- [E008] Not Found Error: ---------------------------------------------------------------------------------------------
1 |mi2 +: 10|    ^^^^^|    value +: is not a member of Int
1 error found
​
scala> 10 +: mi2
val res4: Int = 20

后缀操作符

写在操作数后面的操作符称为后缀操作符,并且操作数只有一个,即调用该方法的对象。如果方法名构成前缀操作符的条件,那么既可以写成前缀操作符,又可以把完整的方法名写成后缀操作符。

scala> class MyInt3(val x:Int) {| def display() = println("the value is " + x + ".")| }
// defined class MyInt3
​
scala> val mi3 = new MyInt3(10)
val mi3: MyInt3 = MyInt3@1aee6d14
​
scala> import scala.language.postfixOps
​
scala> mi3.display()
the value is 10.
3.2.3操作符的优先级和结合性

优先级

可以通过方法名的首个字符比较优先级,前缀操作符的方法名要去掉关键字。圆括号优先级是最高的。下表从高到低列出了字符的优先级:

首个字符
所有其他字符(最高)
*/%
+-
:
=!
<>
&
^
|
所有字母
所有赋值操作符(最低)

这个规则有一个例外,就是如果操作符以等号结尾,并且不是<=,>=,==,!=,那么就认为是赋值运算符,优先级最低。比如sum*=1+2,优先级是+更高。

结合性

一般情况下同级的操作符都是从左往右结合的,但是以冒号结尾的中缀操作符的调用对象在右侧,所以这些操作符是从右往左结合的。

3.2.4预设操作符

Scala预设了常用的算术运算、逻辑运算的操作符,如下图所示:

3.2.5对象的相等性

相等性可以分为两种,一种是自然相等性,一种是引用相等性。

自然相等性就是我们常见的相等性,只要字面上的值相等,就认为两个对象相等。引用相等性用于比较两个变量是否引用了同一个对象,即是否指向JVM堆中的同一个内存空间。Scala种==和!=只用来比较自然相等性,引用相等性可以使用eqne方法,它们是被所有类隐式继承的,且不可被子类重写。

相关文章:

[读书日志]从零开始学习Chisel 第四篇:Scala面向对象编程——操作符即方法(敏捷硬件开发语言Chisel与数字系统设计)

3.2操作符即方法 3.2.1操作符在Scala中的解释 在其它语言中&#xff0c;定义了一些基本的类型&#xff0c;但这些类型并不是我们在面向对象中所说的类。比如说1&#xff0c;这是一个int类型常量&#xff0c;但不能说它是int类型的对象。针对这些数据类型&#xff0c;存在一些…...

三子棋游戏

目录 1.创建项目 2.主函数编写 3.菜单函数编写 4.宏定义棋盘行和列 5.棋盘初始化 6.打印棋盘 7.玩家下棋 8.电脑下棋 9.平局判断 10.输赢判断 11.game函数 三子棋游戏&#xff08;通过改变宏定义可以变成五子棋&#xff09;&#xff0c;玩家与电脑下棋 1.创建项目…...

MyBatis执行一条sql语句的流程(源码解析)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 MyBatis执行一条sql语句的流程&#xff08;源码解析&#xff09; MyBatis执行sql语句的流程加载配置文件加载配置文件的流程 创建sqlsessionFactory对象解析Mapper创建sqlses…...

【电机控制】低通滤波器及系数配置

【电机控制】低通滤波器及系数配置 文章目录 [TOC](文章目录) 前言一、低通滤波器原理二、理论计算三、代码四、参考资料总结 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、低通滤波器原理 二、理论计算 三、代码 //低通滤波 pv->Ealpha…...

ArcgisServer过了元旦忽然用不了了?许可过期

昨天过完元旦之后上班发现好多ArcgisServer的站点运行出错了&#xff0c;点击日志发现&#xff0c;说是许可过去&#xff0c;也就是当时安装ArcgisServer时读取的ecp文件过期了&#xff0c;需要重新读取。 解决方法 1.临时方法&#xff0c;修改系统时间&#xff0c;早于2024年…...

如何在不丢失数据的情况下从 IOS 14 回滚到 IOS 13

您是否后悔在 iPhone、iPad 或 iPod touch 上安装 iOS 14&#xff1f;如果你这样做&#xff0c;你并不孤单。许多升级到 iOS 14 beta 的 iPhone、iPad 和 iPod touch 用户不再适应它。 如果您在正式发布日期之前升级到 iOS 14 以享受其功能&#xff0c;但您不再适应 iOS 14&am…...

【算法刷题】链表

文章目录 环形链表判断是否有环找出环的入口位置 双指针反转链表&#xff08;Reverse a Linked List&#xff09;移除链表中的指定元素&#xff08;Remove Linked List Elements&#xff09; 环形链表 判断是否有环 环形链表是指链表中的某些节点的 next 指针指向了链表中的某…...

计算机网络 —— 网络编程实操(1)(UDP)

计算机网络 —— 网络编程实操&#xff08;UDP&#xff09; 套接字端口套接字的定义为什么需要套接字&#xff1f; 套接字的分类1. 按照通信协议分类2. 按照地址族&#xff08;Address Family&#xff09;分类3. 按照通信模式分类 socket APIsockaddr结构 使用接口套接字初始化…...

selenium 确保页面完全加载

在使用Python和Selenium进行Web自动化时&#xff0c;确保页面完全加载是非常重要的。为了实现这一点&#xff0c;Selenium提供了两种主要类型的等待&#xff1a;显式等待&#xff08;Explicit Waits&#xff09;和隐式等待&#xff08;Implicit Waits&#xff09;。此外&#x…...

[极客大挑战 2019]HardSQL 1

看了大佬的wp&#xff0c;没用字典爆破&#xff0c;手动试出来的&#xff0c;屏蔽了常用的关键字&#xff0c;例如&#xff1a;order select union and 最搞的是&#xff0c;空格也有&#xff0c;这个空格后面让我看了好久&#xff0c;该在哪里加括号。 先传入1’ 1试试&#…...

vip与haproxy构建nginx高可用集群传递客户端真实ip

问题 系统使用了vip与haproxy实现高可用以及对nginx进行负载均衡&#xff0c;但是发现在上游的应用服务无法拿到客户端的请求ip地址&#xff0c;拿到的是主haproxy机器的ip&#xff0c;以下是nginx与haproxy的缩减配置&#xff1a; location ~* ^/(xx|xx) {proxy_pass http:/…...

Easticsearch介绍|实战?

Elasticsearch 是一个分布式的、RESTful 风格的搜索和数据分析引擎&#xff0c;适用于各种用例&#xff0c;如日志分析、全文搜索、实时应用监控等。它设计用来处理大量数据&#xff0c;并且可以快速地提供相关的搜索结果。以下是一些 Elasticsearch 的实战应用场景以及如何在这…...

Python图形界面(GUI)Tkinter笔记(二十一):Messagebox信息提示功能控件

messagebox 就像是 tkinter 库里的一个好帮手,它能帮你弹出各种各样的消息框给用户看。这些消息框可以告诉用户很多东西,比如提示、警告或者错误信息之类的。在 tkinter 库里,messagebox 这个模块有很多不同的函数,每个函数都能弹出一种特定的消息框。用这些函数,开发者可…...

vue3+ts+element-plus 表单el-form取消回车默认提交

问题描述&#xff1a;在表单el-form中的el-input中按回车后&#xff0c;页面会刷新&#xff0c;url也会改变&#xff0c; 回车前&#xff1a; 回车后&#xff1a; 相关代码&#xff1a; 解决方法1&#xff1a;在 el-form 上阻止默认的 submit 事件&#xff0c;增加 submit.pre…...

Web Services 简介

Web Services 简介 1. 引言 Web Services 是一种基于网络的软件服务,它允许不同的应用程序在互联网上相互通信和交互。这种技术是基于开放的互联网标准,如HTTP、XML、SOAP和WSDL,使得不同平台和编程语言的应用程序能够轻松地实现互操作性。Web Services 的出现,极大地推动…...

Vue3苦逼的学习之路

从一名测试转战到全栈是否可以自学做到&#xff0c;很多朋友肯定会说不可能&#xff0c;或就算转了也是个一般水平&#xff0c;我很认同&#xff0c;毕竟没有经过各种项目的摧残&#xff0c;但是还是得踏足一下这个领域。所以今天和大家分享vue3中的相关内容&#xff0c;大佬勿…...

AcWing练习题:两点间的距离

给定两个点 P1 和 P2&#xff0c;其中 P1P1 的坐标为 (x1,y1)&#xff0c;P2 的坐标为 (x2,y2)&#xff0c;请你计算两点间的距离是多少。 distance√(x2−x1)^2(y2−y1)^2 输入格式 输入共两行&#xff0c;每行包含两个双精度浮点数 xi,yi&#xff0c;表示其中一个点的坐标…...

文献分享:RoarGraph——跨模态的最邻近查询

文章目录 1. \textbf{1. } 1. 导论 1.1. \textbf{1.1. } 1.1. 研究背景 1.2. \textbf{1.2. } 1.2. 本文的研究 1.3. \textbf{1.3. } 1.3. 有关工作 2. \textbf{2. } 2. 对 OOD \textbf{OOD} OOD负载的分析与验证 2.1. \textbf{2.1. } 2.1. 初步的背景及其验证 2.1.1. \textbf{2…...

故事可视化AI

i68,爱六八,链接你我他 StoryWeaver故事可视化 通过知识增强的角色定制技术&#xff0c;实现高质量的故事可视化论文链接:https://arxiv.org/pdf/2412.07375项目仓库:https://github.com/Aria-Zhangjl/StoryWeaver由厦门大学多媒体可信感知与高效计算教育部重点实验室和网易伏…...

【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门

文章目录 【机器学习篇】从新手探寻到算法初窥&#xff1a;数据智慧的开启之门前言一、什么是机器学习&#xff1f;二、机器学习的基本类型1. 监督学习&#xff08;Supervised Learning&#xff09;2. 无监督学习&#xff08;Unsupervised Learning&#xff09;3. 半监督学习&a…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...