@@ -13,7 +13,6 @@ permalink: "/zh-cn/scala3/book/:title.html"
13
13
---
14
14
15
15
16
-
17
16
本节介绍 Scala 变量和数据类型。
18
17
19
18
## 两种类型的变量
@@ -41,6 +40,9 @@ permalink: "/zh-cn/scala3/book/:title.html"
41
40
42
41
这些示例展示了如何创建 ` val ` 和 ` var ` 变量:
43
42
43
+ {% tabs var-express-1 %}
44
+ {% tab 'Scala 2 and 3' %}
45
+
44
46
``` scala
45
47
// immutable
46
48
val a = 0
@@ -49,33 +51,57 @@ val a = 0
49
51
var b = 1
50
52
```
51
53
54
+ {% endtab %}
55
+ {% endtabs %}
56
+
52
57
在应用程序中,不能重新给一个 ` val ` 变量赋值。
53
58
如果您尝试重新赋值一个 ` val ` 变量,将导致编译器错误:
54
59
60
+ {% tabs var-express-2 %}
61
+ {% tab 'Scala 2 and 3' %}
62
+
55
63
``` scala
56
64
val msg = " Hello, world"
57
65
msg = " Aloha" // "reassignment to val" error; this won’t compile
58
66
```
59
67
60
- 相反,可以重新分配一个 ` var ` 变量:
68
+ {% endtab %}
69
+ {% endtabs %}
70
+
71
+ 相反,可以给 ` var ` 变量重新赋值:
72
+
73
+ {% tabs var-express-3 %}
74
+ {% tab 'Scala 2 and 3' %}
61
75
62
76
``` scala
63
77
var msg = " Hello, world"
64
78
msg = " Aloha" // 因为可以重新分配 var,所以可以编译
65
79
```
66
80
81
+ {% endtab %}
82
+ {% endtabs %}
83
+
67
84
## 声明变量类型
68
85
69
86
创建变量时,您可以显式声明其类型,或让编译器推断类型:
70
87
88
+ {% tabs var-express-4 %}
89
+ {% tab 'Scala 2 and 3' %}
90
+
71
91
``` scala
72
92
val x : Int = 1 // 显式
73
93
val x = 1 // 隐式的;编译器推断类型
74
94
```
75
95
96
+ {% endtab %}
97
+ {% endtabs %}
98
+
76
99
第二种形式称为 _ 类型推断_ ,它是帮助保持此类代码简洁的好方法。
77
100
Scala 编译器通常可以为您推断数据类型,如以下 REPL 示例的输出所示:
78
101
102
+ {% tabs var-express-5 %}
103
+ {% tab 'Scala 2 and 3' %}
104
+
79
105
``` scala
80
106
scala> val x = 1
81
107
val x : Int = 1
@@ -87,14 +113,23 @@ scala> val nums = List(1, 2, 3)
87
113
val nums : List [Int ] = List (1 , 2 , 3 )
88
114
```
89
115
116
+ {% endtab %}
117
+ {% endtabs %}
118
+
90
119
如果您愿意,您始终可以显式声明变量的类型,但在像这样的简单赋值中,不须要这样:
91
120
121
+ {% tabs var-express-6 %}
122
+ {% tab 'Scala 2 and 3' %}
123
+
92
124
``` scala
93
125
val x : Int = 1
94
126
val s : String = " a string"
95
127
val p : Person = Person (" Richard" )
96
128
```
97
129
130
+ {% endtab %}
131
+ {% endtabs %}
132
+
98
133
请注意,使用这种方法会感觉代码太啰嗦。
99
134
100
135
{% comment %}
@@ -108,6 +143,9 @@ Scala 带有你所期望的标准数值数据类型,它们都是类的成熟
108
143
109
144
这些示例展示了如何声明数值类型的变量:
110
145
146
+ {% tabs var-express-7 %}
147
+ {% tab 'Scala 2 and 3' %}
148
+
111
149
``` scala
112
150
val b : Byte = 1
113
151
val i : Int = 1
@@ -117,37 +155,64 @@ val d: Double = 2.0
117
155
val f : Float = 3.0
118
156
```
119
157
158
+ {% endtab %}
159
+ {% endtabs %}
160
+
120
161
因为 ` Int ` 和 ` Double ` 是默认的数字类型,所以您通常创建它们而不显式声明数据类型:
121
162
163
+ {% tabs var-express-8 %}
164
+ {% tab 'Scala 2 and 3' %}
165
+
122
166
``` scala
123
167
val i = 123 // 默认为 Int
124
168
val j = 1.0 // 默认为 Double
125
169
```
126
170
171
+ {% endtab %}
172
+ {% endtabs %}
173
+
127
174
在您的代码中,您还可以将字符 ` L ` 、` D ` 和 ` F ` (或者它们对应的小写字母)加到数字后面以指定它们是 ` Long ` 、` Double ` 或 ` Float ` 值:
128
175
176
+ {% tabs var-express-9 %}
177
+ {% tab 'Scala 2 and 3' %}
178
+
129
179
``` scala
130
180
val x = 1_000L // val x: Long = 1000
131
181
val y = 2.2D // val y: Double = 2.2
132
182
val z = 3.3F // val z: Float = 3.3
133
183
```
134
184
185
+ {% endtab %}
186
+ {% endtabs %}
187
+
135
188
当您需要非常大的数字时,请使用 ` BigInt ` 和 ` BigDecimal ` 类型:
136
189
190
+ {% tabs var-express-10 %}
191
+ {% tab 'Scala 2 and 3' %}
192
+
137
193
``` scala
138
194
var a = BigInt (1_234_567_890_987_654_321L )
139
195
var b = BigDecimal (123_456.789 )
140
196
```
141
197
198
+ {% endtab %}
199
+ {% endtabs %}
200
+
142
201
其中 ` Double ` 和 ` Float ` 是近似十进制数,` BigDecimal ` 用于精确算术。
143
202
144
203
Scala 还有 ` String ` 和 ` Char ` 数据类型:
145
204
205
+ {% tabs var-express-11 %}
206
+ {% tab 'Scala 2 and 3' %}
207
+
146
208
``` scala
147
209
val name = " Bill" // String
148
210
val c = 'a' // Char
149
211
```
150
212
213
+ {% endtab %}
214
+ {% endtabs %}
215
+
151
216
### 字符串
152
217
153
218
Scala 字符串类似于 Java 字符串,但它们有两个很棒的附加特性:
@@ -160,29 +225,47 @@ Scala 字符串类似于 Java 字符串,但它们有两个很棒的附加特
160
225
字符串插值提供了一种非常易读的方式在字符串中使用变量。
161
226
例如,给定这三个变量:
162
227
228
+ {% tabs var-express-12 %}
229
+ {% tab 'Scala 2 and 3' %}
230
+
163
231
``` scala
164
232
val firstName = " John"
165
233
val mi = 'C'
166
234
val lastName = " Doe"
167
235
```
168
236
237
+ {% endtab %}
238
+ {% endtabs %}
239
+
169
240
您可以将这些变量组合在一个字符串中,如下所示:
170
241
242
+ {% tabs var-express-13 %}
243
+ {% tab 'Scala 2 and 3' %}
244
+
171
245
``` scala
172
246
println(s " Name: $firstName $mi $lastName" ) // "Name: John C Doe"
173
247
```
174
248
249
+ {% endtab %}
250
+ {% endtabs %}
251
+
175
252
只需在字符串前面加上字母 ` s ` ,然后在字符串中的变量名之前放置一个 ` $ ` 符号。
176
253
177
254
要将任意表达式嵌入字符串中,请将它们括在花括号中:
178
255
256
+ {% tabs var-express-14 %}
257
+ {% tab 'Scala 2 and 3' %}
258
+
179
259
``` scala
180
260
println(s " 2 + 2 = ${2 + 2 }" ) // 打印 "2 + 2 = 4"
181
261
182
262
val x = - 1
183
263
println(s " x.abs = ${x.abs}" ) // 打印 "x.abs = 1"
184
264
```
185
265
266
+ {% endtab %}
267
+ {% endtabs %}
268
+
186
269
放在字符串前面的 ` s ` 只是一种可能的插值器。
187
270
如果使用 ` f ` 而不是 ` s ` ,则可以在字符串中使用 ` printf ` 样式的格式化语法。
188
271
此外,字符串插值器只是一种特殊方法,可以定义自己的方法。
@@ -192,12 +275,18 @@ println(s"x.abs = ${x.abs}") // 打印 "x.abs = 1"
192
275
193
276
多行字符串是通过将字符串包含在三个双引号内来创建的:
194
277
278
+ {% tabs var-express-15 %}
279
+ {% tab 'Scala 2 and 3' %}
280
+
195
281
``` scala
196
282
val quote = """ The essence of Scala:
197
283
Fusion of functional and object-oriented
198
284
programming in a typed setting."""
199
285
```
200
286
201
- > 有关字符串插值器和多行字符串的更多详细信息,请参阅[ “First Look at Types”章节] [ first-look ] 。
287
+ {% endtab %}
288
+ {% endtabs %}
289
+
290
+ > 有关字符串插值器和多行字符串的更多详细信息,请参阅[ “类型初探”章节] [ first-look ] 。
202
291
203
- [ first-look] : {% link _ zh-cn/overviews/scala3-book/first-look-at-types.md %}
292
+ [ first-look] : {% link _ zh-cn/overviews/scala3-book/first-look-at-types.md %}
0 commit comments