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

Scala学习笔记11: 操作符

目录

    • 第十一章 操作符
      • 1- 标识符
      • 2- 中置操作符
      • 3- 一元操作符
      • 4- 赋值操作符
      • 5- 操作符的优先级
      • 6- 结合性
      • 7- apply和update方法
      • 8- 提取器
      • end

第十一章 操作符

在Scala中, 操作符是用来执行特定操作的符号或符号组合 ;

Scala允许开发人员自定义操作符, 这些操作符可以是字母、数字、符号或符号组合 ;

1- 标识符

在Scala中, 标识符是用来命名变量、方法、类等程序元素的名称 ;

标识符可以包含字母、数字、下划线和连字符, 但必须以字母或下划线开头 ;

标识符中的字母可以是大写或小写字母, Scala是区分大小写的 ;

标识符还可以使用Unicode字符, 但通常建议使用ASCII字符以确保代码的可读性 ;

标识规则:

  1. 标识符可以包含字母、数字、下划线和连字符, 但不能包含其他特殊字符 ;
  2. 标识符不能使用Scala的保留关键字, 如 valvarclass 等作为标识符 ;
  3. 标识符可以是任意长度, 但建议使用有意义且描述性强的名称 ;
  4. 标识符通常使用驼峰命名法, 即首字母小写, 后续单词首字母大写, 例如: myVariableName ;
  5. 对于常量标识符, 通常使用全大写字母和下划线分隔, 例如: MAX_SIZE ;
  6. 避免使用单个字符作为标识符, 除非在循环变量或临时变量等简短作用域内使用 ;

在编写Scala代码时, 选择清晰、简洁和有意义的标识符是很重要的, 这有助于提高代码的可读性和可维护性 .

2- 中置操作符

在Scala中, 中置操作符是指位于两个操作数之间的操作符, 通常以中缀形式表示 ;

这些操作符可以是自定义的, 也可以是内置的 ;

中置操作符的使用, 使代码更具可读性和简洁性 ;

示例:

    // 定义一个类, 包含自定义的中置操作符class ComplexNumber(val real: Double, val imaginary: Double) {def +(other: ComplexNumber): ComplexNumber = {new ComplexNumber(real + other.real, imaginary + other.imaginary)}def -(other: ComplexNumber): ComplexNumber = {new ComplexNumber(real - other.real, imaginary - other.imaginary)}def *(other: ComplexNumber): ComplexNumber = {new ComplexNumber(real * other.real - imaginary * other.imaginary,real * other.imaginary + imaginary * other.real)}}// 创建两个复数对象val c1 = new ComplexNumber(2, 3)val c2 = new ComplexNumber(1, 4)// 使用自定义的中置操作符 + - *val sum = c1 + c2 // 等同于 c1.+(c2) = new ComplexNumber(2 + 1, 3 + 4)val difference = c1 - c2 // 等同于 c1.-(c2) = new ComplexNumber(2 - 1, 3 - 4)val product = c1 * c2 // 等同于 c1.*(c2) = new ComplexNumber(2 * 1 - 3 * 4, 2 * 4 + 3 * 1)println(s"Sum: ${sum.real} + ${sum.imaginary}i") // 输出: Sum: 3.0 + 7.0iprintln(s"Difference: ${difference.real} + ${difference.imaginary}i") // 输出: Difference: 1.0 + -1.0iprintln(s"Product: ${product.real} + ${product.imaginary}i") // 输出: Product: -10.0 + 11.0i
  • 在上面的示例中, ComplexNumber 类定义了自定义的中置操作符 +-* , 这些操作允许对复数进行加法和减法运算 ;
  • 通过使用中置操作符, 可以更直观的表示操作的含义, 使代码更易于理解 ;

3- 一元操作符

在Scala中, 一元操作符是作用于单个操作数的操作符 ;

Scala支持一元操作符的使用, 包括前缀一元操作符和后缀一元操作符 ;

示例:

  1. 前缀一元操作符: 前缀一元操作符位于操作数之前, 用于对操作数进行一元操作 ;

        // 定义一个类, 包含前缀一元操作符class Number(val value: Int) {def unary_+(): Number = new Number(+value)}// 创建一个Number对象val num = new Number(10)// 使用前缀一元操作符 +val positiveNum = +num // 等同于 num.unary_+println(positiveNum.value) // 输出: 10
    
  2. 后缀一元操作符: 后缀一元操作符位于操作数之后, 用于对操作数进行一元操作 ;

        // 定义一个类, 包含后缀一元操作符class BooleanWrapper(val value: Boolean) {def unary_!(): Boolean = !value}// 创建一个BooleanWrapper对象val bool = new BooleanWrapper(true)// 使用后缀一元操作符 !val notBool = !bool // 等同于 bool.unary_!println(notBool) // 输出: false
    
  • 通过使用一元操作符, 可以对单个操作数进行简洁和直观的操作 ;
  • 在Scala中, 开发人员可以自定义一元操作符来实现特定的功能, 增强代码的可读性和表达性 ;

4- 赋值操作符

在Scala中, 赋值操作符是用来给变量赋值的特殊操作符 ;

Scala中的赋值操作符通常以等号 (=) 结尾, 用于将右侧的值赋值给左侧的变量 ;

示例:

  1. 基本赋值操作符: 最基本的赋值操作符是等号 (=) , 用于将一个值赋值给一个变量 ;

        var x: Int = 10 //  将10赋给定义变量xprintln(x) // 输出: 10
    
  2. 复合赋值操作符: Scala还是支持复合赋值操作符, 如 +=-=*= 等, 用于赋值的同时进行运算 ;

        var y: Int = 20y += 3 // 等价于y = y + 3println(y) // 输出: 23
    
  3. 赋值操作符方法: 在Scala中, 赋值操作符实际上是方法调用的简化形式, 例如 x += 1 实际上是 x.+=(1) 的简写 ;

        var z: Int = 30z *= 2 // 等价于z = z * 2println(z) // 输出: 60
    
  • 通过使用赋值操作符, 可以方便地对变量进行赋值和运算操作 ;
  • 在Scala中, 赋值操作符是编写代码是经常使用的重要元素之一 ;

5- 操作符的优先级

在Scala中, 操作符的优先级是根据他们的特性和用法来确定的 ;

通常, Scala中的操作符优先级遵循类似数学运算中的优先级规则, 例如 乘法优先于加法 ;

一下是优先级顺序(从高到低) :

  1. 一元操作符 (例如前缀和后缀一元操作符)
  2. 算术操作符 (例如乘法* 、除法/ 、取模 %)
  3. 加法和减法操作符
  4. 位操作符 (例如按位与& 、按位或 |)
  5. 关系操作符 (例如 大于 > 、小于 < 、等于 == )
  6. 逻辑操作符 (例如 逻辑与 && 、 逻辑或 ||)
  7. 赋值操作符 (例如 赋值 =+=-=)
  8. 其它特殊操作符 (例如 范围操作符 tountil)

在Scala中, 可以使用括号来明确指定操作符的优先级, 以确保表达式的求值顺序符合预期 ;

了解和遵循操作符的优先级规则有助于编写清晰和准确的代码 .

6- 结合性

在Scala中, 操作符的结合性是指子啊表达式中相同优先级的操作符出现时, 确定操作符的计算顺序 ;

Scala中的操作符结合性分为左结合和右结合性 ;

  1. 左结合性: 对于左结合性的操作符, 表达式中相同优先级的操作符从左向计算 ; 大多数操作符 (如加法、减法) 都是左结合的 ;

        // 左结合性val result = 1 + 2 + 3 // 从左向右计算: 1 + 2 = 3, 3 + 3 = 6println(result) // Output: 6
    
  2. 右结合性: 对于右结合性的操作符, 表达式中相同优先级的操作符从右向左计算 ; 在Scala中, 以冒号结尾的操作符通常是右结合的 ;

        // 右结合性val list = 1 :: 2 :: 3 :: Nil // 从右向左计算: 1 :: (2 :: (3 :: Nil)) = List(1, 2, 3)println(list) // Output: List(1, 2, 3)
    

了解操作符的结合性有助于正确理解和编写表达式, 确保表达式按照预期的方式计算 ;

在Scala中, 可以通过查看操作符的定义或参考文档来确定操作符的结合性 .

7- apply和update方法

在Scala中, applyupdate 方法是特殊的方法, 用于实现对象的函数调用和更新操作 ;

  1. apply方法:

    • apply 方法允许对象函数一样被调用 . 当在对象后面加上圆括号并传入参数时, Scala会自动调用该对象的 apply 方法 ;

    • 通过定义 apply 方法, 可以使对象具有函数的行为, 从而简化对象的使用 ;

    • 示例:

    •    class MyFunction {def apply(x: Int): Int = x * 2}val MyFunc = new MyFunction()val result = MyFunc(5) // 调用apply方法, 等同于调用 myFunc.apply(5)println(result) // 输出: 10
      
  2. update方法:

    • update 方法用于更新对象的值, 类似于数字或映射的索引赋值操作 ;

    • 当使用 obj(key) = value 的语法时, Scala会自动调用对象的 update 方法 ;

    • 示例:

    •     class MyMap {private var map = Map[String, Int]()def update(key: String, value: Int): Unit = {map += (key -> value)}def apply(key: String): Int = map(key)}val myMap = new MyMap()myMap("key1") = 10 // 等同于调用 myMap.update("key1", 10)val retrievedValue = myMap("key1") // 等同于调用 myMap.apply("key1")println(retrievedValue) // 输出: 10
      
  • 通过理解和使用 applyupdate 方法, 可以使对象在使用时更具灵活性和表现力, 同时提供类似函数调用和索引赋值的便利性 .

8- 提取器

在Scala中, 提取器 (Extractor) 是一种特殊的对象, 用于从输入中提取出特定模型的部分 ;

提取器通常与模型匹配结合使用, 允许从复杂数据结构中提取所需信息 ;

提取器通常包含两个主要方法: unapplyapply ;

  • unapply 方法用于从输入中提取值, 并返回一个 Option 类型的结果 . 它通常用于模式匹配中的结构操作 ;
  • apply 方法用于根据给定的参数创建对象的实例, 它通常用于构造对象 ;

示例:

    // 定义一个 Person 类class Person(val name: String, val age: Int)// 创建一个 Person 提取器对象object Person {def unapply(person: Person): Option[(String, Int)] = Some((person.name, person.age))}// 使用模式匹配和提取器val person = new Person("John", 30)person match {case Person(name, age) => println(s"Name: $name, Age: $age") // 输出: Name: John, Age: 30case _ => println("Match failed!")}
  • 在上面的示例中, Person 对象作为提取器, unapply 方法用于从 Person 对象中提取 nameage , 以便在模式匹配中使用 ;
  • 通过使用提取器, Scala程序可以更灵活地处理复杂数据结构, 并实现模式匹配的功能 .

end

相关文章:

Scala学习笔记11: 操作符

目录 第十一章 操作符1- 标识符2- 中置操作符3- 一元操作符4- 赋值操作符5- 操作符的优先级6- 结合性7- apply和update方法8- 提取器end 第十一章 操作符 在Scala中, 操作符是用来执行特定操作的符号或符号组合 ; Scala允许开发人员自定义操作符, 这些操作符可以是字母、数字…...

项目五串行通信系统 任务5-3温度信息上传

任务描述&#xff1a;DS18B20测量温度&#xff0c;单片机采集温度数据转换显示代码&#xff0c;并通过串行口发送到上位机显示。 底层文件&#xff1a; /********************************************* ds18b20底层函数:能完成一次温度数据读取 ***************************…...

前端 JS 经典:统一 Vite 中图片转换逻辑

在 Vue Vite 项目中有这样一段代码如下&#xff0c;引入了两个图片&#xff0c;一大一小。然后 console 出来引入结果。 import bigImg from "./assets/big.png"; import smallImg from "./assets/small.png";console.log(bigImg); console.log(smallImg…...

DOM-获取元素

获取元素的方法&#xff1a; 方法一&#xff1a;根据id获取元素document.getElementById <div id"time">2024-6-4</div> 在script标签中&#xff1a;注意getElementById括号里面必须要有引号&#xff0c;获得的是对象类型 var timer document.getEle…...

【安装笔记-20240612-Linux-内网穿透服务之cpolar极点云】

安装笔记-系列文章目录 安装笔记-20240612-Linux-内网穿透服务之 cpolar 极点云 文章目录 安装笔记-系列文章目录安装笔记-20240612-Linux-内网穿透服务之 cpolar 极点云 前言一、软件介绍名称&#xff1a;cpolar极点云主页官方介绍 二、安装步骤测试版本&#xff1a;openwrt-…...

Java 泛型与集合的深入解析:原理、应用与实践

泛型的基本原理 为什么需要泛型 在Java 5之前&#xff0c;Java的集合类只能存储Object类型的对象。这意味着&#xff0c;存储在集合中的对象在取出时需要进行类型转换&#xff0c;这不仅繁琐&#xff0c;而且容易出错。泛型通过在编译时进行类型检查&#xff0c;确保类型安全…...

Oracle 数据库的自动化工具:AWR 和 ASM

Oracle 数据库提供了一系列工具和技术&#xff0c;以提高数据库管理的效率和性能。其中&#xff0c;AWR和 ASM是两个关键组件。本文将详细介绍 AWR 和 ASM 的功能及其在数据库管理中的重要性。 AWR AWR 是 Oracle 数据库的一个核心部分&#xff0c;用于收集、处理和维护数据库…...

java技术专家面试指南50问【java学习+面试宝典】(五)

Dubbo需要 Web 容器吗&#xff1f; 不需要&#xff0c;如果硬要用 Web 容器&#xff0c;只会增加复杂性&#xff0c;也浪费资源。 一个字符串类型的值能存储最大容量是多少&#xff1f; 512M 什么是Kubectl&#xff1f; Kubectl是一个平台&#xff0c;您可以使用该平台将命…...

Elasticsearch之深入聚合查询

1、正排索引 1.1 正排索引&#xff08;doc values &#xff09;和倒排索引 概念&#xff1a;从广义来说&#xff0c;doc values 本质上是一个序列化的 列式存储 。列式存储 适用于聚合、排序、脚本等操作&#xff0c;所有的数字、地理坐标、日期、IP 和不分词&#xff08; no…...

大模型:分本分割模型

目录 一、文本分割 二、BERT文本分割模型 三、部署模型 3.1 下载模型 3.2 安装依赖 3.3 部署模型 3.4 运行服务 四、测试模型 一、文本分割 文本分割是自然语言处理中的一项基础任务&#xff0c;目标是将连续的文本切分成有意义的片段&#xff0c;这些片段可以是句子、…...

数据预处理 #数据挖掘 #python

数据分析中的预处理步骤是数据分析流程中的重要环节&#xff0c;它的目的是清洗、转换和整理原始数据&#xff0c;以便后续的分析能够准确、有效。预处理通常包括以下几个关键步骤&#xff1a; 数据收集&#xff1a;确定数据来源&#xff0c;可能是数据库、文件、API或网络抓取…...

VS2022 使用C++访问 mariadb 数据库

首先,下载 MariaDB Connector/C++ 库 MariaDB Products & Tools Downloads | MariaDB 第二步,安装后 第三步,写代码 #include <iostream> #include <cstring> #include <memory> #include <windows.h>#include <mariadb/conncpp.hpp>…...

kotlin 语法糖

Use of “when” Expression Instead of “switch” fun getDayOfWeek(day: Int): String {return when (day) {1 -> "Monday"2 -> "Tuesday"3 -> "Wednesday"4 -> "Thursday"5 -> "Friday"6 -> "Sa…...

.NET MAUI Sqlite数据库操作(一)

一、安装 NuGet 包 安装 sqlite-net-pcl 安装 SQLitePCLRawEx.bundle_green 二、配置数据库&#xff08;数据库文件名和路径&#xff09; namespace TodoSQLite; public static class Constants {public const string DatabaseFilename "TodoSQLite.db3";//数据库…...

SQL 窗口函数

1.窗口函数之排序函数 RANK, DENSE_RANK, ROW_NUMBER RANK函数 计算排序时,如果存在相同位次的记录,则会跳过之后的位次 有 3 条记录排在第 1 位时: 1 位、1 位、1 位、4 位…DENSE_RANK函数 同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次 有 3 条记录排在…...

staruml怎么合并多个Project工程文件

如图现在有两个staruml文件 现在我想要把project2合并到project1里面 步骤如下&#xff1a; 1、首先打开project2 2、如图选择导出Fragment 3、选中自己想导出的模块&#xff08;可以不止一个&#xff09; 4、将其保存在桌面 5、打开project1 6、选择导入 7、选中刚刚…...

设计模式——外观模式

外观模式(Facade) 为系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 #include <iostream>using namespace std;// 四个系统子类 class SubSystemOne { public:void MethodOne(){cout <&l…...

开源-Docker部署Cook菜谱工具

开源-Docker部署Cook菜谱工具 文章目录 开源-Docker部署Cook菜谱工具介绍资源列表基础环境一、安装Docker二、配置加速器三、查看Docker版本四、拉取cook镜像五、部署cook菜谱工具5.1、创建cook容器5.2、查看容器运行状态5.3、查看cook容器日志 六、访问cook菜谱服务6.1、访问c…...

使用PHP对接企业微信审批接口的问题与解决办法(二)

在现代企业中&#xff0c;审批流程是非常重要的一环&#xff0c;它涉及到企业内部各种业务流程的规范和高效运转。而随着企业微信的流行&#xff0c;许多企业希望将审批流程整合到企业微信中&#xff0c;以实现更便捷的审批操作。本文将介绍如何使用PHP对接企业微信审批接口&am…...

RK3288 android7.1 实现ota升级时清除用户数据

一&#xff0c;OTA简介(整包&#xff0c;差分包) OTA全称为Over-The-Air technology(空中下载技术)&#xff0c;通过移动通信的接口实现对软件进行远程管理。 1. 用途&#xff1a; OTA两种类型最大的区别莫过于他们的”出发点“&#xff08;我们对两种不同升级包的创建&…...

okHttp的https请求忽略ssl证书认证

使用okhttp请求第三方https接口返回异常 sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target意思就是非安全的调用&#…...

在Java中使用Spring Boot设置全局的BusinessException

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…...

Java 异常处理 -- Java 语言的异常、异常链与断言

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 009 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…...

Spring Cloud Nacos 详解:服务注册与发现及配置管理平台

Spring Cloud Nacos 详解&#xff1a;服务注册与发现及配置管理平台 Spring Cloud Nacos 是 Spring Cloud 生态系统中的一个子项目&#xff0c;提供了服务注册与发现、配置管理等功能&#xff0c;基于 Alibaba 开源的 Nacos 项目。Nacos 是一个易于使用的动态服务发现、配置管…...

java多线程临界区介绍

在Java多线程编程中&#xff0c;"临界区"是指一段必须互斥执行的代码区域。当多个线程访问共享资源时&#xff0c;为了防止数据不一致或逻辑错误&#xff0c;需要确保同一时刻只有一个线程可以进入临界区。Java提供了多种机制来实现这一点&#xff0c;例如synchroniz…...

基于JSP的超市管理系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP MyBatis 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 员工管理界面图 管…...

一文讲清:生产报工系统的功能、报价以及如何选择

最近这几年&#xff0c;企业越来越注重生产的速度和成本&#xff0c;尤其是“性价比”&#xff0c;生产报工系统已经变成了制造业里不可或缺的一部分。不过&#xff0c;市场上生产报工系统的选择太多&#xff0c;价格也都不一样&#xff0c;这就给很多企业出了个难题&#xff1…...

blender bpy将顶点颜色转换为UV纹理vertex color to texture

一、关于环境 安装blender的bpy&#xff0c;不需要额外再安装blender软件。在python控制台中直接输入pip install bpy即可。 二、关于代码 本文所给出代码仅为参考&#xff0c;禁止转载和引用&#xff0c;仅供个人学习。 本文所给出的例子是https://download.csdn.net/downl…...

Flink Sql:四种Join方式详解(基于flink1.15官方文档)

JOINs flink sql主要有四种连接方式&#xff0c;分别是Regular Joins、Interval Joins、Temporal Joins、lookup join 1、Regular Joins&#xff08;常规连接 &#xff09; 这种连接方式和hive sql中的join是一样的&#xff0c;包括inner join&#xff0c;left join&#xff…...

(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第3节(泛型约束)

14.3 泛型约束 ​ 正如我们所看到的&#xff0c;您在泛型类的方法中可以做的事情非常少。您可以传递它&#xff08;即分配它&#xff09;并执行上面我介绍的泛型类型函数允许的有限操作。 ​ 为了能够执行泛型类的实际操作&#xff0c;通常需要对其进行约束。例如&#xff0c…...

巩义网站建设优化公司/网店推广是什么

为什么80%的码农都做不了架构师&#xff1f;>>> 安装Zephir 为了安装Zephir&#xff0c;请根据下面的步骤来做&#xff1a; 预备知识 使用Zephir来编译PHP扩展&#xff0c;下面的一些软件是必须的&#xff1a; gcc > 4.x/clang > 3.xre2c 0.13 or latergnu m…...

上海网站建设 润/微营销平台系统

直接放上我的代码。希望能给碰到相同问题的朋友提供帮助 Runnable runnable new Runnable() {public void run() {ClipboardManager clipboard (ClipboardManager)GameUtil.getIntance().getContext().getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText(cont…...

海口做网站的公司/windows优化大师要钱

今天没事干谢谢防火墙的基本命令吧&#xff01;感觉没啥可学的&#xff0c;以下是我基本掌握的一下防火墙的命令&#xff0c;具体再深了就不太了解了&#xff0c;公司只用到这些&#xff0c;dis cu /查看当前设备所有配置dis ip int brief /查看接口状态dis ip rout /查看设备路…...

天津做网站的公司排行/广州百度seo代理

我有下面的python代码来创建一个会议事件&#xff0c;它正在工作。我计划将这个脚本与Web表单提交结合在一起&#xff0c;用户可以输入一些基本信息&#xff0c;比如主题、与会者和会议日期/时间&#xff0c;然后Python脚本将根据提交的Web表单信息创建一个会议事件。我没有问题…...

如何用腾讯云做网站/开发app需要多少资金

增加ref属性 &#xff1a; <el-form ref"formData"></el-form> ElementUI自带清除表单方法this.$refs[formName].resetFields(); // 重置表单移除校验 this.$refs[formName].clearValidate(); // 仅清除验证...

电子商务网站建设课程标准/温州seo网站建设

今天开始调试ARM的板子&#xff0c;要通过tftp下载到板子上&#xff0c;所以又要配置tftp服务器&#xff0c;真的烦死了… (本人酷爱装系统&#xff0c;所以经常都要搞配置) 因为之前已经在Ubuntu下搭建过很多次tftp服务器了&#xff0c;但是一直记不住那一个配置文件的名字(记…...