@@ -46,12 +46,21 @@ Scala中的每个用户定义类型都是 `AnyRef` 的子类型。
46
46
在基于语句的编程语言中, ` void ` 用于没有返回值的方法。
47
47
如果您在Scala中编写没有返回值的方法,例如以下方法,则 ` Unit ` 用于相同的目的:
48
48
49
+ {% tabs unit %}
50
+ {% tab 'Scala 2 and 3' for=unit %}
51
+
49
52
``` scala
50
53
def printIt (a : Any ): Unit = println(a)
51
54
```
52
55
56
+ {% endtab %}
57
+ {% endtabs %}
58
+
53
59
下面是一个示例,它演示了字符串、整数、字符、布尔值和函数都是 ` Any ` 的实例,可以像对待其他所有对象一样处理:
54
60
61
+ {% tabs any %}
62
+ {% tab 'Scala 2 and 3' for=any %}
63
+
55
64
``` scala
56
65
val list : List [Any ] = List (
57
66
" a string" ,
@@ -64,6 +73,9 @@ val list: List[Any] = List(
64
73
list.foreach(element => println(element))
65
74
```
66
75
76
+ {% endtab %}
77
+ {% endtabs %}
78
+
67
79
该代码定义了一个类型为 ` List[Any] ` 的值 ` list ` 。
68
80
该列表使用各种类型的元素进行初始化,但每个元素都是 ` scala.Any ` 的实例,因此我们可以将它们添加到列表中。
69
81
82
94
如上所示,Scala的值类型扩展了 ` AnyVal ` ,它们都是成熟的对象。
83
95
这些示例演示如何声明以下数值类型的变量:
84
96
97
+ {% tabs anyval %}
98
+ {% tab 'Scala 2 and 3' for=anyval %}
99
+
85
100
``` scala
86
101
val b : Byte = 1
87
102
val i : Int = 1
@@ -91,31 +106,52 @@ val d: Double = 2.0
91
106
val f : Float = 3.0
92
107
```
93
108
109
+ {% endtab %}
110
+ {% endtabs %}
111
+
94
112
在前四个示例中,如果未显式指定类型,则数字 ` 1 ` 将默认为 ` Int ` ,因此,如果需要其他数据类型之一 --- ` Byte ` 、` Long ` 或
8000
` Short ` --- 则需要显式声明这些类型,如上面代码所示。
95
113
带有小数的数字(如2.0)将默认为 ` Double ` ,因此,如果您想要 ` Float ` ,则需要声明 ` Float ` ,如上一个示例所示。
96
114
97
115
由于 ` Int ` 和 ` Double ` 是默认数值类型,因此通常在不显式声明数据类型的情况下创建它们:
98
116
117
+ {% tabs anynum %}
118
+ {% tab 'Scala 2 and 3' for=anynum %}
119
+
99
120
``` scala
100
121
val i = 123 // defaults to Int
101
122
val x = 1.0 // defaults to Double
102
123
```
103
124
125
+ {% endtab %}
126
+ {% endtabs %}
127
+
104
128
在代码中,您还可以将字符 ` L ` 、 ` D ` 和 ` F ` (及其小写等效项)加到数字末尾,以指定它们是 ` Long ` , ` Double ` , 或 ` Float ` 值:
105
129
130
+ {% tabs type-post %}
131
+ {% tab 'Scala 2 and 3' for=type-post %}
132
+
106
133
``` scala
107
134
val x = 1_000L // val x: Long = 1000
108
135
val y = 2.2D // val y: Double = 2.2
109
136
val z = 3.3F // val z: Float = 3.3
110
137
```
111
138
139
+ {% endtab %}
140
+ {% endtabs %}
141
+
112
142
Scala还具有 ` String ` 和 ` Char ` 类型,通常可以使用隐式形式声明:
113
143
144
+ {% tabs type-string %}
145
+ {% tab 'Scala 2 and 3' for=type-string %}
146
+
114
147
``` scala
115
148
val s = " Bill"
116
149
val c = 'a'
117
150
```
118
151
152
+ {% endtab %}
153
+ {% endtabs %}
154
+
119
155
如下面表格所示,将字符串括在双引号中 --- 或多行字符串括在三引号中 --- 或字符括在单引号中。
120
156
121
157
这些数据类型及其范围包括:
@@ -136,21 +172,33 @@ val c = 'a'
136
172
137
173
当您需要非常大的数字时,请使用 ` BigInt ` 和 ` BigDecimal ` 类型:
138
174
175
+ {% tabs type-bigint %}
176
+ {% tab 'Scala 2 and 3' for=type-bigint %}
177
+
139
178
``` scala
140
179
val a = BigInt (1_234_567_890_987_654_321L )
141
180
val b = BigDecimal (123_456.789 )
142
181
```
143
182
183
+ {% endtab %}
184
+ {% endtabs %}
185
+
144
186
其中 ` Double ` 和 ` Float ` 是近似的十进制数, ` BigDecimal ` 用于精确算术,例如在使用货币时。
145
187
146
188
` BigInt ` 和 ` BigDecimal ` 的一个好处是,它们支持您习惯于用于数字类型的所有运算符:
147
189
190
+ {% tabs type-bigint2 %}
191
+ {% tab 'Scala 2 and 3' for=type-bigint2 %}
192
+
148
193
``` scala
149
194
val b = BigInt (1234567890 ) // scala.math.BigInt = 1234567890
150
195
val c = b + b // scala.math.BigInt = 2469135780
151
196
val d = b * b // scala.math.BigInt = 1524157875019052100
152
197
```
153
198
199
+ {% endtab %}
200
+ {% endtabs %}
201
+
154
202
## 关于字符串的两个注释
155
203
156
204
Scala字符串类似于Java字符串,但它们有两个很棒的附加特性:
@@ -163,28 +211,46 @@ Scala字符串类似于Java字符串,但它们有两个很棒的附加特性
163
211
字符串插值提供了一种非常可读的方式在字符串中使用变量。
164
212
例如,给定以下三个变量:
165
213
214
+ {% tabs string-inside1 %}
215
+ {% tab 'Scala 2 and 3' for=string-inside1 %}
216
+
166
217
``` scala
167
218
val firstName = " John"
168
219
val mi = 'C'
169
220
val lastName = " Doe"
170
221
```
171
222
223
+ {% endtab %}
224
+ {% endtabs %}
225
+
172
226
你可以把那些变量组合成这样的字符串:
173
227
228
+ {% tabs string-inside2 %}
229
+ {% tab 'Scala 2 and 3' for=string-inside2 %}
230
+
174
231
``` scala
175
232
println(s " Name: $firstName $mi $lastName" ) // "Name: John C Doe"
176
233
```
177
234
235
+ {% endtab %}
236
+ {% endtabs %}
237
+
178
238
只需在字符串前面加上字母 ` s ` ,然后在字符串内的变量名称之前放置一个 ` $ ` 符号。
179
239
180
240
如果要在字符串中使用可能较大的表达式时,请将它们放在大括号中:
181
241
242
+ {% tabs string-inside3 %}
243
+ {% tab 'Scala 2 and 3' for=string-inside3 %}
244
+
182
245
``` scala
183
246
println(s " 2 + 2 = ${2 + 2 }" ) // prints "2 + 2 = 4"
184
247
val x = - 1
185
248
println(s " x.abs = ${x.abs}" ) // prints "x.abs = 1"
186
249
```
187
250
251
+ {% endtab %}
252
+ {% endtabs %}
253
+
188
254
#### 其他插值器
189
255
190
256
放置在字符串前面的 ` s ` 只是一个可能的插值器。
@@ -196,36 +262,60 @@ println(s"x.abs = ${x.abs}") // prints "x.abs = 1"
196
262
197
263
多行字符串是通过将字符串包含在三个双引号内来创建的:
198
264
265
+ {% tabs string-mlines1 %}
266
+ {% tab 'Scala 2 and 3' for=string-mlines1 %}
267
+
199
268
``` scala
200
269
val quote = """ The essence of Scala:
201
270
Fusion of functional and object-oriented
202
271
programming in a typed setting."""
203
272
```
204
273
274
+ {% endtab %}
275
+ {% endtabs %}
276
+
205
277
这种基本方法的一个缺点是,第一行之后的行是缩进的,如下所示:
206
278
279
+ {% tabs string-mlines2 %}
280
+ {% tab 'Scala 2 and 3' for=string-mlines2 %}
281
+
207
282
``` scala
208
283
" The essence of Scala:
209
284
Fusion of functional and object-oriented
210
285
programming in a typed setting."
211
286
```
212
287
288
+ {% endtab %}
289
+ {% endtabs %}
290
+
213
291
当间距很重要时,在第一行之后的所有行前面放一个 ` | ` 符号,并在字符串之后调用 ` stripMargin ` 方法:
214
292
293
+ {% tabs string-mlines3 %}
294
+ {% tab 'Scala 2 and 3' for=string-mlines3 %}
295
+
215
296
``` scala
216
297
val quote = """ The essence of Scala:
217
298
|Fusion of functional and object-oriented
218
299
|programming in a typed setting.""" .stripMargin
219
300
```
220
301
302
+ {% endtab %}
303
+ {% endtabs %}
304
+
221
305
现在字符串里所有行都是左对齐了:
222
306
307
+ {% tabs string-mlines4 %}
308
+ {% tab 'Scala 2 and 3' for=string-mlines4 %}
309
+
223
310
``` scala
224
311
" The essence of Scala:
225
312
Fusion of functional and object-oriented
226
313
programming in a typed setting."
227
314
```
228
315
316
+ {% endtab %}
317
+ {% endtabs %}
318
+
229
319
## 类型转换
230
320
231
321
可以通过以下方式强制转换值类型:
@@ -234,6 +324,9 @@ programming in a typed setting."
234
324
235
325
例如:
236
326
327
+ {% tabs cast1 %}
328
+ {% tab 'Scala 2 and 3' for=cast1 %}
329
+
237
330
``` scala
238
331
val b : Byte = 127
239
332
val i : Int = b // 127
@@ -242,14 +335,23 @@ val face: Char = '☺'
242
335
val number : Int = face // 9786
243
336
```
244
337
338
+ {% endtab %}
339
+ {% endtabs %}
340
+
245
341
只有在没有丢失信息的情况下,才能强制转换为类型。否则,您需要明确说明强制转换:
246
342
343
+ {% tabs cast2 %}
344
+ {% tab 'Scala 2 and 3' for=cast2 %}
345
+
247
346
``` scala
248
347
val x : Long = 987654321
249
348
val y : Float = x.toFloat // 9.8765434E8 (注意 `.toFloat` 是必须的,因为强制类型转换后的精度会损)
250
349
val z : Long = y // Error
251
350
```
252
351
352
+ {% endtab %}
353
+ {% endtabs %}
354
+
253
355
还可以将引用类型强制转换为子类型。
254
356
这将在教程的后面部分介绍。
255
357
0 commit comments