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

【Scala】

一、Scala

1、概述

  • 官网地址:https://www.scala-lang.org
  • Github项目地址:https://github.com/scala/scala3/

Scala 是 Scalable Language 的简写,意味着这种语言设计上支持大规模软件开发,是一门多范式的编程语言。

Scala 语言是由 Martin Odersky 等人在 2003 年开发的,并于 2004 年首次发布。

Scala 运行于 Java 平台(Java 虚拟机),并兼容现有的 Java 程序。

Scala 的编译模型(独立编译,动态类加载)与 Java 和 C# 一样,所以 Scala 代码可以调用 Java 类库(对于.NET实现则可调用.NET类库)。

3、安装Scala

这里采用压缩包+环境配置方式,其他方法可参考官网:Install Scala on your computer

wget https://github.com/scala/scala3/releases/download/3.3.5/scala3-3.3.5.tar.gz
tar -xzf scala3-3.3.5.tgz
echo "export SCALA_HOME=/path/to/scala3-3.3.5" > ~/.zshrc
echo "export PATH=$SCALA_HOME/bin:$PATH" > ~/.zshrc
source ~/.zshrc

2、基础语法

  • B站尚硅谷教程
  • Scala 菜鸟教程

4、区分 class、object、case class、trait、

4.1 class(普通类)

  • 定义:用于创建对象的模板,包含字段、方法、构造函数。
  • 特点:
    • 默认成员(字段、方法)是公开的(public)。
    • 支持继承(单继承)。
    • 必须显式使用 new 关键字实例化。
  • 示例:
    class Person(name: String, age: Int) {
      def greet(): String = s"Hello, I'm $name, $age years old."
    }
    
    val person = new Person("Alice", 30)
    println(person.greet()) // 输出:Hello, I'm Alice, 30 years old.
    

4.2 object(单例对象)

  • 定义:全局唯一的单例实例,用于替代静态成员或工具类。
  • 特点:
    • 不能实例化(无构造函数)。
    • 可以直接访问其成员(类似静态调用)。
    • 常与类同名作为 伴生对象(Companion Object),共享私有成员。
  • 示例:
    // 单例对象(工具类)
    object MathUtils {
      def square(x: Int): Int = x * x
    }
    
    println(MathUtils.square(5)) // 输出:25
    
    // 伴生对象(与类同名)
    class Person(val name: String)
    object Person {
      def apply(name: String): Person = new Person(name)
    }
    
    val person = Person("Alice") // 调用伴生对象的 apply 方法
    

4.3 trait(特质)

  • 定义:类似于 Java 的接口,但支持方法实现和字段。
  • 特点:
    • 支持多重继承(一个类可混入多个 trait)。
    • 可以定义抽象方法(无实现)和具体方法(有实现)。
    • 不能有构造函数参数。
  • 示例:
    trait Speaker {
      def speak(): String // 抽象方法
    }
    
    trait Runner {
      def run(): Unit = println("Running...") // 具体方法
    }
    
    class Dog extends Speaker with Runner {
      def speak(): String = "Woof!"
    }
    
    val dog = new Dog
    println(dog.speak()) // 输出:Woof!
    dog.run()            // 输出:Running...
    

4.4 case class(样例类)

  • 定义:专为不可变数据建模设计的类,编译器自动生成实用方法。
  • 特点:
    • 自动生成 equals、hashCode、toString 方法。
    • 支持模式匹配(unapply 方法自动生成)。
    • 无需 new 实例化(通过伴生对象的 apply 方法)。
    • 构造函数参数默认是 val(不可变)。
  • 示例:
    case class Person(name: String, age: Int)
    
    val alice = Person("Alice", 30) // 无需 new
    val bob = alice.copy(name = "Bob") // 创建新实例(不可变性)
    
    // 模式匹配
    alice match {
      case Person(n, a) => println(s"Name: $n, Age: $a")
    }
    

4.5 case object

  • 定义:case object 是一个单例对象(全局唯一实例),编译器会为其自动生成一些实用方法。
  • 核心特性:
    • 不可变单例:与普通 object 一样,case object 是全局唯一的,不可实例化。
    • 自动生成方法:
      • toString:返回对象名称(如 case object Foo 的 toString 为 “Foo”)。
      • equals/hashCode:基于对象身份(单例特性)比较。
    • 模式匹配友好:可直接用于模式匹配,无需参数。
  • 示例:在密封特质(sealed trait)中,使用 case object 表示固定选项或消息:
    sealed trait Message
    case object Start extends Message
    case object Stop extends Message
    
    def handleMessage(msg: Message): Unit = msg match {
      case Start => println("System starting...")
      case Stop  => println("System stopping...")
    }
    

4.6 伴生对象(Companion Object)

  • 定义:与类同名的 object,用于存放类的静态工厂方法或共享逻辑。
  • 作用:
    • 实现 apply 方法(简化对象创建)。
    • 实现 unapply 方法(支持模式匹配)。
    • 访问类的私有成员。
  • 示例:
    class Person private(val name: String)
    
    object Person {
      // 工厂方法
      def apply(name: String): Person = new Person(name)
    
      // 模式匹配提取器
      def unapply(p: Person): Option[String] = Some(p.name)
    }
    
    val person = Person("Alice") // 调用 apply 方法
    person match {
      case Person(n) => println(n) // 输出:Alice
    }
    

二、sbt

1、概述

  • sbt官网地址:https://www.scala-sbt.org

sbt(Scala Build Tool) 是一个专为 Scala 和 Java 项目 设计的开源构建工具,类似于 Java 的 Maven 或 Gradle,但针对 Scala 生态进行了深度优化。

2、安装

wget https://github.com/sbt/sbt/releases/download/v1.10.7/sbt-1.10.7.tgz
tar -zxvf sbt-1.10.7.tgz
echo "export SBT_HOME=/path/to/sbt" > ~/.zshrc
echo "export PATH=$SBT_HOME/bin:$PATH" > ~/.zshrc
source ~/.zshrc
sbt -version

3、sbt 的核心功能

  • 项目构建与编译
    • 自动化编译:根据代码变动自动增量编译,减少等待时间。
    • 跨版本编译:支持为不同 Scala 版本生成字节码(如同时支持 Scala 2.13 和 Scala 3)。
    • 多模块管理:轻松管理包含多个子模块的复杂项目。
  • 依赖管理
    • 从仓库拉取库:自动从 Maven Central、Sonatype 等仓库下载依赖项。
    • 声明式依赖配置:在 build.sbt 中通过简洁语法声明依赖:
      libraryDependencies += "org.typelevel" %% "cats-core" % "2.10.0"
      
  • 任务执行
    • 运行测试:通过 sbt test 执行单元测试。
    • 打包应用:生成 JAR、WAR 或 Docker 镜像(需插件支持)。
    • 启动应用:直接运行主类或热部署开发服务器。
  • 插件扩展
    • 生态丰富:通过插件支持代码格式化(sbt-scalafmt)、静态分析(sbt-scapegoat)、文档生成(sbt-site)等。
    • 自定义任务:编写插件或内联任务扩展构建流程。
  • 交互式命令行
    • REPL 集成:通过 sbt console 进入 Scala REPL,直接调用项目代码。
    • 持续命令模式:执行 ~test 或 ~run,代码保存后自动重新编译并运行。

4、sbt 的核心优势

特性sbtMaven/Gradle
配置语法基于 Scala DSL,灵活易扩展XML(Maven)或 Groovy(Gradle)
增量编译原生支持,速度更快需插件支持(如 Gradle 增量编译)
Scala 生态集成深度优化(如交叉编译)通用支持,需额外配置
交互式体验提供命令自动补全和历史记录无交互式 CLI

5、sbt 的典型使用场景

  • 开发 Scala 应用:从零创建 Web 服务(如 Play Framework)、数据分析工具或库。
    sbt new scala/scala3.g8       # 创建 Scala 3 项目模板
    sbt compile                   # 编译代码
    sbt run                       # 运行主程序
    
  • 管理多模块项目:定义父子模块,共享配置,独立编译:
    // build.sbt
    lazy val core = project.in(file("core")).settings(/* 核心模块配置 */)
    lazy val api = project.in(file("api")).dependsOn(core)
    
  • 持续集成(CI):在 Jenkins、GitHub Actions 中通过 sbt test 自动化测试和部署。

6、sbt 项目的基础结构

my-project/
├── build.sbt         # 项目配置(依赖、插件、任务)
├── project/          # 元配置(插件定义、全局设置)
│   ├── build.properties  # 指定 sbt 版本
│   └── plugins.sbt   # 插件依赖
├── src/
│   ├── main/
│   │   ├── scala/    # Scala 源代码
│   │   └── resources # 配置文件
│   └── test/         # 测试代码和资源
└── target/           # 编译输出目录

7、常用 sbt 命令速查

命令作用
sbt compile编译源代码
sbt test运行所有测试
sbt run执行主程序
sbt package打包为 JAR 文件
sbt clean清理编译生成的文件
sbt update更新依赖库
sbt console进入 Scala REPL(可调用项目代码)
sbt reload重新加载构建配置(修改后必用)

8、为什么选择 sbt?

  • 为 Scala 量身定制:语法与 Scala 无缝衔接,支持最新语言特性。
  • 高效开发体验:增量编译和交互式命令大幅提升效率。
  • 社区支持:Scala 生态中主流库均提供 sbt 支持。

十、资料

相关文章:

  • 论文分享 | HE-Nav: 一种适用于复杂环境中空地机器人的高性能高效导航系统
  • TIA博途在编译 PLC时出现崩溃的解决方法
  • 测不准关系
  • 【redis】zset 类型:基本命令(上)
  • Java中架构DDD:理解聚合、实体和值对象三种核心构造块
  • C#+EF+SqlServer性能优化笔记
  • Python 科学计算与机器学习入门:NumPy + Scikit-Learn 实战指南
  • 大数据-spark3.5安装部署之local模式
  • ubuntu24.04-qt5-mysql8.0
  • 【网工第6版】第1章 计算机网络概论
  • mac安装navicat及使用
  • CentOS 7 系统上安装 SQLite
  • LDR6500在Type-C转DP视频双向互传方案
  • RAW图与BAYER图异同
  • LinuX---Shell---read命令
  • 02 windows qt配置ffmpeg开发环境搭建
  • Leetcode3340:检查平衡字符串
  • 实验5 逻辑回归
  • C语言基础笔记整理(附代码示例)
  • React开发指南:核心、实践与案例
  • 林诗栋/蒯曼混双取胜,国乒赢得多哈世乒赛开门红
  • 美国贸易政策|特朗普模式:你想做交易吗?
  • “GoFun出行”订单时隔7年扣费后续:平台将退费,双方已和解
  • 【社论】打破“隐形高墙”,让老年人更好融入社会
  • 工商银行杭州金融研修院原院长蒋伟被“双开”
  • 由我国牵头制定,适老化数字经济国际标准发布