Scala-注释、标识符、变量与常量-用法详解
Scala

Scala-变量和数据类型-用法详解
- Scala
- 一、注释
- 二、标识符规范
- 三、变量和常量
- 1. 变量(`var`)
- 2. 常量(`val`)
- 3. 类型推断与显式声明
- 4. `var` 和 `val` 的区别
- 5. Scala与Java对比
- Tips:
- 各位看客老爷万福金安,一键三连呀🤣🤣🤣 谢谢啦~
一、注释
Scala中的注释与Java是一样的,熟悉Java的小伙伴可以跳过哈🤣
- 单行注释:使用
//来注释一行代码或行尾注释。 - 多行注释:使用
/*和*/来注释多行代码。 - 文档注释:使用
/**和*/,用于生成自动化文档,通常带有特定的格式。
1. 单行注释
// 这是一个单行注释
val x = 5 // 这是一个行尾注释

// 这是一个表示整数的变量
val number = 10
2. 多行注释
/* 这是一个多行注释可以跨越多行直到遇到结束标记 */
val y = 20

/*这段注释说明了代码的功能:下面的代码用来计算两个数的和
*/
val a = 5
val b = 3
val sum = a + b
3. 文档注释(注释生成工具)
/** 开始,*/ 结束,生成类似 JavaDoc 的注释。


二、标识符规范
- 以字母或下划线开头,后接字母、数字、下划线
- 标识符必须以字母(a-z 或 A-Z)或下划线(
_)开头,后续字符可以是字母、数字或下划线。

- 以操作符开头,且只包含操作符(如
+,-,*,/,#,!等)

- 这种类型的标识符多用于操作符重载、定义自定义的二元运算符或函数。
- 不应与普通的标识符混淆,因此需要特别注意。
- 用反引号(`)包括的任意字符串,即使是 Scala 关键字也可以
- Scala 允许使用反引号(``)括起来的字符串作为标识符,甚至可以是 Scala 的保留字或关键字(如
val,var,class,def等)。 - 可以避免与关键字发生冲突,使其能够作为有效的标识符。

Scala 的 39 个关键字如下,它们是保留的语言元素,通常不能作为标识符直接使用(除非用反引号括起来):
abstract,case,catch,class,def,do,else,extends,final,finally,for,forSome,if,implicit,import,lazy,match,native,new,null,object,override,package,private,protected,return,sealed,super,this,throw,trait,try,type,val,var,while,with,yield
三、变量和常量
- 在 Scala 中,变量和常量的定义方式与 Java 有些不同,Scala 语言强调不可变性,推崇函数式编程,因此在处理变量和常量时有一些独特的设计。
1. 变量(var)
var是可变变量,用来定义可以改变值的变量。var定义的变量会自动推断类型,或者你也可以显式指定类型。

显式指定类型,则必须赋一个符合该类型的初始值:

- Tips:
var声明的变量可以修改其值,适用需要多次修改的情况。
2. 常量(val)
val用来定义不可变变量,类似于 Java 中的final关键字。- 一旦为常量赋了值,就不能再修改它。

显式指定类型,依然不可以修改常量的值:

- Tips:
val声明的常量一旦赋值后不能被修改。val的常量是不可变的,这也让它成为函数式编程中常见的实践方式,因为不可变数据结构有助于避免副作用和并发问题。
3. 类型推断与显式声明
-
Scala 的强大之处在于类型推断🤣🤣🤣,编译器可以根据上下文自动推断变量和常量的类型。
-
咱们不需要显式声明类型,除非希望指定一个不同的类型。
(1)变量类型推断:
var x = 10 // 编译器推断 x 是 Int 类型
var name = "yushif" // 编译器推断 name 是 String 类型

(2)常量类型推断:
val pi = 3.14159 // 编译器推断 pi 是 Double 类型
val isScalaFun = true // 编译器推断 isScalaFun 是 Boolean 类型

(3)显式指定类型:
如果需要显式指定类型,可以在变量或常量声明时指定类型:
var a: Int = 42
val b: String = "Hello"
4. var 和 val 的区别
-
var(可变变量):- 允许修改变量的值。
- 使用时不需要额外的限制,适合那些可能需要改变值的场景。
var counter = 0 counter += 1 // counter 可以修改
-
val(常量):(能用常量的地方不用变量)- 不允许修改已经赋值的常量。声明后不可变。
- 更符合函数式编程的理念,推荐使用
val来定义不可变值。val name = "Scala" // name = "Java" // 编译错误,不能改变 val 变量的值
在函数内部,var 和 val 的行为是一样的:
val用于定义不可变的局部变量。var用于定义可以改变的局部变量。
def example(): Unit = {val a = 10 // a 是不可变的var b = 20 // b 是可变的b = 30 // 你可以修改 b 的值// a = 15 // 编译错误:无法修改 val 变量println(b) // 输出 30
}
5. Scala与Java对比
| 语言 | 关键字 | 变量定义 | 常量定义 |
|---|---|---|---|
| Java | int | int a = 10; | final int b = 20; |
| Scala | var | var i: Int = 10 或 var i = 10 | val j: Int = 20 或 val j = 20 |
-
变量与常量定义的关键字:
- 在 Java 中,变量使用
int等类型直接定义,常量使用final关键字。 - 在 Scala 中,使用
var定义可变变量,使用val定义不可变常量。
- 在 Java 中,变量使用
-
类型推断:
- Java 必须显式指定类型。
- Scala 支持类型推断,可以省略类型,编译器会自动推断。
-
常量的不可变性:
- 在 Java 中,
final常量一旦赋值后不能修改。 - 在 Scala 中,
val代表常量,赋值后不能再更改。
- 在 Java 中,
Tips:
-
一旦类型被推断,变量的类型是固定的,不允许修改类型。
-
val:声明的变量是不可变的,一旦赋值之后,值不能被修改。类型一旦推断出来,也不能被改变。 -
var:声明的变量是可变的,可以修改其值,但类型一旦确定后,不能再修改类型。Scala 强制遵守静态类型规则,即在编译时就确定了变量的类型,之后该类型是不可变的。这与动态类型语言(如 Python 或 JavaScript)不同,在那些语言中,可以在运行时修改变量的类型。
无论是
val还是var,一旦 Scala 推断出变量的类型后,该类型就不可再变。不能在后续修改变量的类型(即使是使用var),只有值才是可以修改的。
var number = 10 // 推断为 Int
// number = "Hello" // 错误:类型不匹配,Int 类型的变量不能赋值为 String 类型
将 "Hello" 赋给 number,会报编译错误。
- 在 Scala 中,推荐尽可能使用不可变的数据结构,因为不可变性使得并发编程更加安全,避免了共享数据带来的潜在问题。
val在这里发挥了重要作用,确保了数据结构一旦创建后不能改变。
//eg.
val list = List(1, 2, 3)
val newList = list :+ 4 // 创建一个新的列表,新列表与原列表不同
各位看客老爷万福金安,一键三连呀🤣🤣🤣 谢谢啦~
相关文章:
Scala-注释、标识符、变量与常量-用法详解
Scala Scala-变量和数据类型-用法详解 Scala一、注释二、标识符规范三、变量和常量1. 变量(var)2. 常量(val)3. 类型推断与显式声明4. var 和 val 的区别5. Scala与Java对比Tips: 各位看客老爷万福金安,一键…...
大数据学习14之Scala面向对象--至简原则
1.类和对象 1.1基本概念 面向对象(Object Oriented)是一种编程思想,面向对象主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想,总体来说面向对象的底层还是面向过程,面向过程抽象…...
docker 安装之 windows安装
文章目录 1: 在Windows安装Docker报19044版本错误的时候,请大家下载4.24.1之前的版本(含4.24.1)2: Desktop-WSL kernel version too low3: docker-compose 安装 (v2.21.0) 1: 在Windows安装Docker报19044版本错误的时候,请大家下载…...
JS 实现游戏流畅移动与按键立即响应
AWSD 按键移动 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.box1 {width: 400px;height: 400px;background: yellowgreen;margin: 0 auto;position: relative;}.box2 {width: 50px;height:…...
LabVIEW大数据处理
在物联网、工业4.0和科学实验中,大数据处理需求逐年上升。LabVIEW作为一款图形化编程语言,凭借其强大的数据采集和分析能力,广泛应用于实时数据处理和控制系统中。然而,在面对大数据处理时,LabVIEW也存在一些注意事项。…...
NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势
随着信息技术的快速发展和数字化时代的到来,安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者,凭借其强大的视频处理、汇聚与融合能力,展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…...
海思3403对RTSP进行目标检测
1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库,拉取RTSP流,然后调过3403的VDEC模块进行解码,送个NPU进行目标检测,输出到hdmi,这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…...
Vue之插槽(slot)
插槽是vue中的一个非常强大且灵活的功能,在写组件时,可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽,可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类:默认插槽,具名插槽和作用域插槽。 下面…...
分布式服务高可用实现:复制
分布式服务高可用实现:复制 1. 为什么需要复制 我们可以考虑如下问题: 当数据量、读取或写入负载已经超过了当前服务器的处理能力,如何实现负载均衡?希望在单台服务器出现故障时仍能继续工作,这该如何实现ÿ…...
基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
摘要:车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用,不仅能帮助相关部门快速识别车辆类型,还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型,该模型使用了…...
机器学习—决定下一步做什么
现在已经看到了很多不同的学习算法,包括线性回归、逻辑回归甚至深度学习或神经网络。 关于如何构建机器学习系统的一些建议 假设你已经实现了正则化线性回归来预测房价,所以你有通常的学习算法的成本函数平方误差加上这个正则化项,但是如果…...
Java Optional详解:避免空指针异常的优雅方式
在 Java 编程中,空指针异常(NullPointerException)一直是困扰开发者的常见问题之一。为了更安全、优雅地处理可能为空的值,Java 8 引入了 Optional 类。Optional 提供了一种函数式的方式来表示一个值可能存在或不存在,…...
SpringBoot开发——整合EasyExcel实现百万级数据导入导出功能
文章目录 一、EasyExcel 框架及特性介绍二、实现步骤1、项目创建及依赖配置(pom.xml)2、项目文件结构3、配置文件(application.yml)4、启动类 Application.java5、配置类 EasyExcelConfig.java6、服务接口定义及实现 ExcelService.java7、控制器类 ExcelController.java8、…...
AcWing 1097 池塘计数 flood fill bfs搜索
代码 #include <bits/stdc.h> using namespace std;const int N 1010, M N * N;typedef pair<int, int> PII;int n, m;char g[N][N]; bool st[N][N]; PII q[M];void bfs (int xx, int yy) {int hh 0, tt -1;q[ tt] {xx, yy};st[xx][yy] true;while (hh <…...
R门 - rust第一课陈天 -内存知识学习笔记
内存 #mermaid-svg-1NFTUW33mcI2cBGB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1NFTUW33mcI2cBGB .error-icon{fill:#552222;}#mermaid-svg-1NFTUW33mcI2cBGB .error-text{fill:#552222;stroke:#552222;}#merm…...
java itext后端生成pdf导出
public CustomApiResult<String> exportPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {// 防止日志记录获取session异常request.getSession();// 设置编码格式response.setContentType("application/pdf;charsetUTF-8")…...
信号-3-信号处理
main 信号捕捉的操作 sigaction struct sigaction OS不允许信号处理方法进行嵌套:某一个信号正在被处理时,OS会自动block改信号,之后会自动恢复 同理,sigaction.sa_mask 为捕捉指定信号后临时屏蔽的表 pending什么时候清零&…...
38配置管理工具(如Ansible、Puppet、Chef)
每天五分钟学Linux | 第三十八课:配置管理工具(如Ansible、Puppet、Chef) 大家好!欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中,我们学习了如何安装和配置邮件服务器。今天,我们将探…...
网络技术-定义配置ACL规则的语法和命令
定义ACL(访问控制列表)规则时,具体命令会根据所使用的设备和操作系统而有所不同。以下是一些常见的设备和操作系统中定义ACL规则的命令示例: 一:思科(Cisco)路由器/交换机 在思科设备中&#…...
动态规划一>子数组系列
题目: 2.解析: 代码: public int maxSubArray(int[] nums) {int n nums.length;int[] dp new int[n 1];int ret Integer.MIN_VALUE;for(int i 1; i < n; i){dp[i] Math.max(nums[i - 1], dp[i - 1] nums[i - 1]);ret Math.max(…...
3分钟上手ncmdumpGUI:网易云音乐NCM文件轻松转换的完整指南
3分钟上手ncmdumpGUI:网易云音乐NCM文件轻松转换的完整指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 还在为网易云音乐的NCM格式文件无法在其…...
Downkyi完全指南:三步掌握B站视频下载的10个高效技巧
Downkyi完全指南:三步掌握B站视频下载的10个高效技巧 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#x…...
嵌入式异构多处理器评估板:从核心原理到工业应用实战
1. 项目概述:当“异构”不再是PPT上的概念在嵌入式开发领域,尤其是边缘计算、工业控制和智能物联网设备中,我们正面临一个越来越普遍的困境:单一架构的处理器越来越难以满足复杂且矛盾的系统需求。一方面,我们需要强大…...
从YOLOv5实战反推:手把手在WSL2里搭建PyTorch 1.12 + CUDA 11.3 环境(附国内镜像加速)
逆向工程视角:在WSL2中构建YOLOv5专属PyTorch 1.12CUDA 11.3开发环境 当目标检测项目的截止日期迫在眉睫,却卡在环境配置环节,这种体验对开发者而言无异于噩梦。本文将以结果导向的逆向思维,从YOLOv5的最终运行需求出发࿰…...
OpenWrt opkg配置进阶:手把手教你设置代理、跳过证书检查,解决国内下载慢问题
OpenWrt opkg高效配置指南:突破网络限制的实战技巧 每次在OpenWrt上安装软件时,看着缓慢的下载进度条或者突如其来的连接错误,是不是感觉既熟悉又无奈?作为一款强大的路由器操作系统,OpenWrt的opkg包管理器本该是我们的…...
Mac/Win双平台保姆级教程:从零配置ADB环境到连接真机/模拟器
Mac/Win双平台保姆级教程:从零配置ADB环境到连接真机/模拟器 第一次接触Android开发或测试时,配置ADB环境往往是让人头疼的第一步。不同操作系统、不同设备品牌、不同模拟器之间的差异,让很多新手在"adb devices"命令前败下阵来。…...
用Matlab给变形镜建模:从高斯函数到贝塞尔曲线,两种响应函数仿真全流程
用Matlab给变形镜建模:从高斯函数到贝塞尔曲线,两种响应函数仿真全流程 光学系统工程师在设计自适应光学系统时,经常需要精确模拟变形镜的响应特性。这种模拟不仅关系到系统性能预测的准确性,也直接影响控制算法的开发效率。本文将…...
保姆级教程:用PlatformIO给ESP32刷Marlin固件,搞定WiFi配置和Web界面
从零构建3D打印机无线中枢:ESP32刷写Marlin固件全流程解析 当你的3D打印机突然摆脱数据线的束缚,通过手机就能随时监控打印进度、调整参数时,那种科技带来的愉悦感会瞬间抵消所有配置过程的艰辛。本文将带你用ESP32开发板打造专属无线控制模块…...
字节面试官:你知道Claude Code的多Agent实现机制吗?
上周四晚上,我的微信弹出一条消息。一个准备跳槽字节AI Agent岗的朋友发来语音,语气像刚被泼了一盆冷水:“他们没让我手撕Transformer,也没问RLHF。上来就是一句——你知道Claude Code的多Agent实现机制吗?能不能讲一下…...
AOCODARC-F7MINI飞控固件编译踩坑记:从‘make arm_sdk_install’失败到成功编译
AOCODARC-F7MINI飞控固件编译实战:从工具链安装到烧录全流程解析 1. 环境准备与工具链安装 编译BetaFlight固件最令人头疼的环节往往不是代码本身,而是环境配置。以Ubuntu 20.04为例,我们需要先解决两个核心问题:基础编译环境和AR…...
