【Scala】

一、Scala

1、概述

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、基础语法

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(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 支持。

十、资料

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值