第一个Scala程序 - Hello World #
一、使用 Scala REPL #
REPL(Read-Eval-Print-Loop)是 Scala 的交互式解释器,适合快速学习和测试。
1.1 启动 REPL #
bash
scala
输出:
text
Welcome to Scala 3.3.1 (11.0.20, Java OpenJDK 64-Bit Server VM).
Type in expressions for evaluation. Or try :help.
scala>
1.2 执行简单表达式 #
scala
scala> 1 + 2
val res0: Int = 3
scala> "Hello" + " " + "Scala"
val res1: String = Hello Scala
scala> println("Hello, World!")
Hello, World!
1.3 定义变量和函数 #
scala
scala> val name = "Scala"
val name: String = Scala
scala> def greet(name: String): String = s"Hello, $name!"
def greet(name: String): String
scala> greet("World")
val res2: String = Hello, World!
1.4 退出 REPL #
scala
scala> :quit
或使用快捷键:Ctrl + D
二、编写脚本文件 #
2.1 创建脚本文件 #
创建 hello.scala 文件:
scala
println("Hello, World!")
2.2 运行脚本 #
bash
scala hello.scala
输出:
text
Hello, World!
2.3 带参数的脚本 #
创建 args.scala:
scala
args.foreach(println)
运行:
bash
scala args.scala Hello Scala
输出:
text
Hello
Scala
三、编译运行方式 #
3.1 创建源文件 #
创建 HelloWorld.scala:
scala
@main def hello(): Unit =
println("Hello, World!")
3.2 编译程序 #
bash
scalac HelloWorld.scala
编译后生成:
HelloWorld.classHelloWorld$.classHelloWorld$package.class
3.3 运行程序 #
bash
scala HelloWorld
或使用 scala -cp .:
bash
scala -cp . hello
四、程序结构解析 #
4.1 Scala 3 程序结构 #
scala
@main def hello(): Unit =
println("Hello, World!")
@main:主程序入口注解def:定义函数的关键字hello:函数名(): Unit:无参数,返回类型为 Unit(类似 void)=:函数体的开始println(...):函数体内容
4.2 传统 main 方法 #
scala
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, World!")
}
}
object:定义单例对象main:程序入口方法args: Array[String]:命令行参数Unit:返回类型,表示无返回值
4.3 继承 App 特质 #
scala
object HelloWorld extends App {
println("Hello, World!")
}
五、使用 sbt 项目 #
5.1 创建项目 #
bash
mkdir hello-world
cd hello-world
5.2 创建 build.sbt #
scala
name := "hello-world"
version := "0.1.0"
scalaVersion := "3.3.1"
5.3 创建源文件 #
创建 src/main/scala/Main.scala:
scala
@main def run(): Unit =
println("Hello, World from sbt!")
5.4 运行项目 #
bash
sbt run
输出:
text
[info] running run
Hello, World from sbt!
5.5 打包项目 #
bash
sbt package
生成的 jar 包在 target/scala-3.3.1/ 目录下。
六、命令行参数 #
6.1 接收命令行参数 #
scala
@main def greet(args: String*): Unit =
args.foreach(name => println(s"Hello, $name!"))
运行:
bash
scala run Alice Bob Charlie
输出:
text
Hello, Alice!
Hello, Bob!
Hello, Charlie!
6.2 传统方式接收参数 #
scala
object Greet {
def main(args: Array[String]): Unit = {
args.foreach { arg =>
println(s"Argument: $arg")
}
}
}
七、输入输出 #
7.1 标准输出 #
scala
println("Hello") // 输出并换行
print("Hello") // 输出不换行
printf("Name: %s, Age: %d%n", "Alice", 25) // 格式化输出
7.2 字符串插值 #
scala
val name = "Scala"
val version = 3
println(s"Hello, $name!") // s 插值器
println(s"2 + 2 = ${2 + 2}") // 表达式
println(raw"Hello\nWorld") // raw 插值器(不转义)
println(f"Pi is approximately $math.Pi%.2f") // f 插值器(格式化)
7.3 多行字符串 #
scala
val text = """This is a
multiline string
in Scala"""
println(text)
7.4 标准输入 #
scala
import scala.io.StdIn
print("Enter your name: ")
val name = StdIn.readLine()
println(s"Hello, $name!")
print("Enter your age: ")
val age = StdIn.readInt()
println(s"You are $age years old.")
八、使用 IDE 开发 #
8.1 IntelliJ IDEA #
- 创建新项目:File → New → Project
- 选择 Scala → sbt
- 输入项目名称
- 选择 Scala 版本
- 创建完成后,在
src/main/scala下创建 Scala 文件
8.2 运行程序 #
- 点击 main 方法旁边的绿色三角形
- 或右键选择 “Run”
8.3 调试程序 #
- 在代码行号旁点击设置断点
- 右键选择 “Debug”
九、常见错误 #
9.1 缩进错误 #
scala
@main def hello(): Unit =
println("Hello") // 错误:缩进不正确
正确写法:
scala
@main def hello(): Unit =
println("Hello") // 正确:正确缩进
9.2 类型不匹配 #
scala
val x: Int = "hello" // 错误:类型不匹配
9.3 缺少等号 #
scala
def add(a: Int, b: Int) // 错误:缺少等号
a + b
正确写法:
scala
def add(a: Int, b: Int) =
a + b
十、Scala 与 Java 对比 #
10.1 Hello World 对比 #
Java:
java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Scala:
scala
@main def hello(): Unit =
println("Hello, World!")
10.2 主要区别 #
| 特性 | Java | Scala |
|---|---|---|
| 分号 | 必需 | 可选 |
| main 方法定义 | 静态方法 | @main 注解或 object |
| 类型声明 | 必须显式 | 可推断 |
| 代码量 | 较多 | 简洁 |
十一、总结 #
编写 Scala 程序的方式:
- REPL:快速测试和学习
- 脚本:简单任务
- 编译运行:正式项目
- sbt 项目:大型项目
关键要点:
- Scala 3 使用
@main注解定义程序入口 - 分号是可选的
- 使用缩进表示代码块
- 字符串插值让输出更简洁
下一步,让我们学习 Scala 基础语法!
最后更新:2026-03-27