本节介绍 Scala 变量和数据类型。
两种类型的变量
当你在 Scala 中创建一个新变量时,你声明该变量是不可变的还是可变的:
变量类型 | 说明 |
---|---|
val |
创建一个不可变变量——类似于 Java 中的 final 。 您应该始终使用 val 创建一个变量,除非有理由使用可变变量。 |
var |
创建一个可变变量,并且只应在变量的内容随时间变化时使用。 |
这些示例展示了如何创建 val
和 var
变量:
// immutable
val a = 0
// mutable
var b = 1
在应用程序中,不能重新给一个 val
变量赋值。
如果您尝试重新赋值一个 val
变量,将导致编译器错误:
val msg = "Hello, world"
msg = "Aloha" // "reassignment to val" error; this won’t compile
相反,可以给 var
变量重新赋值:
var msg = "Hello, world"
msg = "Aloha" // 因为可以重新分配 var,所以可以编译
声明变量类型
创建变量时,您可以显式声明其类型,或让编译器推断类型:
val x: Int = 1 // 显式
val x = 1 // 隐式的;编译器推断类型
第二种形式称为 类型推断,它是帮助保持此类代码简洁的好方法。 Scala 编译器通常可以为您推断数据类型,如以下 REPL 示例的输出所示:
scala> val x = 1
val x: Int = 1
scala> val s = "a string"
val s: String = a string
scala> val nums = List(1, 2, 3)
val nums: List[Int] = List(1, 2, 3)
如果您愿意,您始终可以显式声明变量的类型,但在像这样的简单赋值中,不须要这样:
val x: Int = 1
val s: String = "a string"
val p: Person = Person("Richard")
请注意,使用这种方法会感觉代码太啰嗦。
内置数据类型
Scala 带有你所期望的标准数值数据类型,它们都是类的成熟(full-blown)实例。 在 Scala 中,一切都是对象。
这些示例展示了如何声明数值类型的变量:
val b: Byte = 1
val i: Int = 1
val l: Long = 1
val s: Short = 1
val d: Double = 2.0
val f: Float = 3.0
因为 Int
和 Double
是默认的数字类型,所以您通常创建它们而不显式声明数据类型:
val i = 123 // 默认为 Int
val j = 1.0 // 默认为 Double
在您的代码中,您还可以将字符 L
、D
和 F
(或者它们对应的小写字母)加到数字后面以指定它们是 Long
、Double
或 Float
值:
val x = 1_000L // val x: Long = 1000
val y = 2.2D // val y: Double = 2.2
val z = 3.3F // val z: Float = 3.3
当您需要非常大的数字时,请使用 BigInt
和 BigDecimal
类型:
var a = BigInt(1_234_567_890_987_654_321L)
var b = BigDecimal(123_456.789)
其中 Double
和 Float
是近似十进制数,BigDecimal
用于精确算术。
Scala 还有 String
和 Char
数据类型:
val name = "Bill" // String
val c = 'a' // Char
字符串
Scala 字符串类似于 Java 字符串,但它们有两个很棒的附加特性:
- 他们支持字符串插值
- 创建多行字符串很容易
字符串插值
字符串插值提供了一种非常易读的方式在字符串中使用变量。 例如,给定这三个变量:
val firstName = "John"
val mi = 'C'
val lastName = "Doe"
您可以将这些变量组合在一个字符串中,如下所示:
println(s"Name: $firstName $mi $lastName") // "Name: John C Doe"
只需在字符串前面加上字母 s
,然后在字符串中的变量名之前放置一个 $
符号。
要将任意表达式嵌入字符串中,请将它们括在花括号中:
println(s"2 + 2 = ${2 + 2}") // 打印 "2 + 2 = 4"
val x = -1
println(s"x.abs = ${x.abs}") // 打印 "x.abs = 1"
放在字符串前面的 s
只是一种可能的插值器。
如果使用 f
而不是 s
,则可以在字符串中使用 printf
样式的格式化语法。
此外,字符串插值器只是一种特殊方法,可以定义自己的方法。
例如,有一些数据库方向的类库定义了非常强大的 sql
插值器。
多行字符串
多行字符串是通过将字符串包含在三个双引号内来创建的:
val quote = """The essence of Scala:
Fusion of functional and object-oriented
programming in a typed setting."""
有关字符串插值器和多行字符串的更多详细信息,请参阅“类型初探”章节。
Contributors to this page:
Contents
- 导言
- Scala 3 特性
- 为什么是 Scala 3 ?
- Scala 的味道
- Hello, World!
- The REPL
- 变量和数据类型
- 控制结构
- 领域建模
- 方法
- 头等函数
- 单例对象
- 集合
- 上下文抽象
- 顶层定义
- 总结
- 类型初探
- 字符串插值
- 控制结构
- 领域建模
- 工具
- OOP 领域建模
- 函数式领域建模
- 方法
- 方法特性
- main 方法
- 总结
- 函数
- 匿名函数
- 函数变量
- Eta 扩展
- 高阶函数
- 自定义 map 函数
- 创建可以返回函数的方法
- 总结
- 打包和导入
- Scala 集合
- 集合类型
- 集合方法
- 总结
- 函数式编程
- 什么是函数式编程?
- 不可变值
- 纯函数
- 函数是值
- 函数式错误处理
- 总结
- 类型和类型系统
- 类型推断
- 泛型
- 相交类型
- 联合类型
- 代数数据类型
- 型变
- 不透明类型
- 结构化类型
- 依赖函数类型
- 其他类型
- 上下文抽象
- 扩展方法
- Given 实例和 Using 语句
- 上下文绑定
- Given 导入
- 实现类型类
- 多元相等性
- 隐式转换
- 总结
- 并发
- Scala 工具
- 使用 sbt 构建和测试 Scala 项目
- worksheet
- 与 Java 交互
- 向 Java 开发者介绍Scala
- Scala for JavaScript Developers
- Scala for Python Developers
- 下一步去哪