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

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 的注释。
在这里插入图片描述
在这里插入图片描述


二、标识符规范

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

在这里插入图片描述

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

在这里插入图片描述

  • 这种类型的标识符多用于操作符重载、定义自定义的二元运算符或函数。
  • 不应与普通的标识符混淆,因此需要特别注意。
  1. 用反引号(`)包括的任意字符串,即使是 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. varval 的区别

  • var(可变变量)

    • 允许修改变量的值。
    • 使用时不需要额外的限制,适合那些可能需要改变值的场景。
      var counter = 0
      counter += 1  // counter 可以修改
      
  • val(常量):(能用常量的地方不用变量

    • 不允许修改已经赋值的常量。声明后不可变。
    • 更符合函数式编程的理念,推荐使用 val 来定义不可变值。
      val name = "Scala"
      // name = "Java"  // 编译错误,不能改变 val 变量的值
      

在函数内部,varval 的行为是一样的:

  • 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对比

语言关键字变量定义常量定义
Javaintint a = 10;final int b = 20;
Scalavarvar i: Int = 10var i = 10val j: Int = 20val j = 20
  1. 变量与常量定义的关键字

    • 在 Java 中,变量使用 int 等类型直接定义,常量使用 final 关键字。
    • 在 Scala 中,使用 var 定义可变变量,使用 val 定义不可变常量。
  2. 类型推断

    • Java 必须显式指定类型。
    • Scala 支持类型推断,可以省略类型,编译器会自动推断。
  3. 常量的不可变性

    • 在 Java 中,final 常量一旦赋值后不能修改。
    • 在 Scala 中,val 代表常量,赋值后不能再更改。

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和科学实验中&#xff0c;大数据处理需求逐年上升。LabVIEW作为一款图形化编程语言&#xff0c;凭借其强大的数据采集和分析能力&#xff0c;广泛应用于实时数据处理和控制系统中。然而&#xff0c;在面对大数据处理时&#xff0c;LabVIEW也存在一些注意事项。…...

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具视频汇聚技术在智慧安防监控中的应用与优势

随着信息技术的快速发展和数字化时代的到来&#xff0c;安防监控领域也在不断进行技术创新和突破。NVR管理平台EasyNVR作为视频汇聚技术的领先者&#xff0c;凭借其强大的视频处理、汇聚与融合能力&#xff0c;展现出了在安防监控领域巨大的应用潜力和价值。本文将详细介绍Easy…...

海思3403对RTSP进行目标检测

1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库&#xff0c;拉取RTSP流&#xff0c;然后调过3403的VDEC模块进行解码&#xff0c;送个NPU进行目标检测&#xff0c;输出到hdmi&#xff0c;这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…...

Vue之插槽(slot)

插槽是vue中的一个非常强大且灵活的功能&#xff0c;在写组件时&#xff0c;可以为组件的使用者预留一些可以自定义内容的占位符。通过插槽&#xff0c;可以极大提高组件的客服用和灵活性。 插槽大体可以分为三类&#xff1a;默认插槽&#xff0c;具名插槽和作用域插槽。 下面…...

分布式服务高可用实现:复制

分布式服务高可用实现&#xff1a;复制 1. 为什么需要复制 我们可以考虑如下问题&#xff1a; 当数据量、读取或写入负载已经超过了当前服务器的处理能力&#xff0c;如何实现负载均衡&#xff1f;希望在单台服务器出现故障时仍能继续工作&#xff0c;这该如何实现&#xff…...

基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)

摘要&#xff1a;车型识别在交通管理、智能监控和车辆管理中起着至关重要的作用&#xff0c;不仅能帮助相关部门快速识别车辆类型&#xff0c;还为自动化交通监控提供了可靠的数据支撑。本文介绍了一款基于YOLOv8、YOLOv5等深度学习框架的车型识别模型&#xff0c;该模型使用了…...

机器学习—决定下一步做什么

现在已经看到了很多不同的学习算法&#xff0c;包括线性回归、逻辑回归甚至深度学习或神经网络。 关于如何构建机器学习系统的一些建议 假设你已经实现了正则化线性回归来预测房价&#xff0c;所以你有通常的学习算法的成本函数平方误差加上这个正则化项&#xff0c;但是如果…...

Java Optional详解:避免空指针异常的优雅方式

在 Java 编程中&#xff0c;空指针异常&#xff08;NullPointerException&#xff09;一直是困扰开发者的常见问题之一。为了更安全、优雅地处理可能为空的值&#xff0c;Java 8 引入了 Optional 类。Optional 提供了一种函数式的方式来表示一个值可能存在或不存在&#xff0c;…...

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不允许信号处理方法进行嵌套&#xff1a;某一个信号正在被处理时&#xff0c;OS会自动block改信号&#xff0c;之后会自动恢复 同理&#xff0c;sigaction.sa_mask 为捕捉指定信号后临时屏蔽的表 pending什么时候清零&…...

38配置管理工具(如Ansible、Puppet、Chef)

每天五分钟学Linux | 第三十八课&#xff1a;配置管理工具&#xff08;如Ansible、Puppet、Chef&#xff09; 大家好&#xff01;欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中&#xff0c;我们学习了如何安装和配置邮件服务器。今天&#xff0c;我们将探…...

网络技术-定义配置ACL规则的语法和命令

定义ACL&#xff08;访问控制列表&#xff09;规则时&#xff0c;具体命令会根据所使用的设备和操作系统而有所不同。以下是一些常见的设备和操作系统中定义ACL规则的命令示例&#xff1a; 一&#xff1a;思科&#xff08;Cisco&#xff09;路由器/交换机 在思科设备中&#…...

动态规划一>子数组系列

题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; 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(…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...