8000 add code tabs in _zh-cn/overviews/scala3-book/first-look-at-types.md … · ysmike/docs.scala-lang@8be8ac5 · GitHub
[go: up one dir, main page]

Skip to content

Commit 8be8ac5

Browse files
authored
add code tabs in _zh-cn/overviews/scala3-book/first-look-at-types.md (scala#2695)
1 pare
8000
nt 4947ff2 commit 8be8ac5

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

_zh-cn/overviews/scala3-book/first-look-at-types.md

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,21 @@ Scala中的每个用户定义类型都是 `AnyRef` 的子类型。
4646
在基于语句的编程语言中, `void` 用于没有返回值的方法。
4747
如果您在Scala中编写没有返回值的方法,例如以下方法,则 `Unit` 用于相同的目的:
4848

49+
{% tabs unit %}
50+
{% tab 'Scala 2 and 3' for=unit %}
51+
4952
```scala
5053
def printIt(a: Any): Unit = println(a)
5154
```
5255

56+
{% endtab %}
57+
{% endtabs %}
58+
5359
下面是一个示例,它演示了字符串、整数、字符、布尔值和函数都是 `Any` 的实例,可以像对待其他所有对象一样处理:
5460

61+
{% tabs any %}
62+
{% tab 'Scala 2 and 3' for=any %}
63+
5564
```scala
5665
val list: List[Any] = List(
5766
"a string",
@@ -64,6 +73,9 @@ val list: List[Any] = List(
6473
list.foreach(element => println(element))
6574
```
6675

76+
{% endtab %}
77+
{% endtabs %}
78+
6779
该代码定义了一个类型为 `List[Any]` 的值 `list`
6880
该列表使用各种类型的元素进行初始化,但每个元素都是 `scala.Any` 的实例,因此我们可以将它们添加到列表中。
6981

@@ -82,6 +94,9 @@ true
8294
如上所示,Scala的值类型扩展了 `AnyVal`,它们都是成熟的对象。
8395
这些示例演示如何声明以下数值类型的变量:
8496

97+
{% tabs anyval %}
98+
{% tab 'Scala 2 and 3' for=anyval %}
99+
85100
```scala
86101
val b: Byte = 1
87102
val i: Int = 1
@@ -91,31 +106,52 @@ val d: Double = 2.0
91106
val f: Float = 3.0
92107
```
93108

109+
{% endtab %}
110+
{% endtabs %}
111+
94112
在前四个示例中,如果未显式指定类型,则数字 `1` 将默认为 `Int` ,因此,如果需要其他数据类型之一 --- `Byte``Long` 8000 `Short` --- 则需要显式声明这些类型,如上面代码所示。
95113
带有小数的数字(如2.0)将默认为 `Double` ,因此,如果您想要 `Float` ,则需要声明 `Float` ,如上一个示例所示。
96114

97115
由于 `Int``Double` 是默认数值类型,因此通常在不显式声明数据类型的情况下创建它们:
98116

117+
{% tabs anynum %}
118+
{% tab 'Scala 2 and 3' for=anynum %}
119+
99120
```scala
100121
val i = 123 // defaults to Int
101122
val x = 1.0 // defaults to Double
102123
```
103124

125+
{% endtab %}
126+
{% endtabs %}
127+
104128
在代码中,您还可以将字符 `L``D``F` (及其小写等效项)加到数字末尾,以指定它们是 `Long`, `Double`, 或 `Float` 值:
105129

130+
{% tabs type-post %}
131+
{% tab 'Scala 2 and 3' for=type-post %}
132+
106133
```scala
107134
val x = 1_000L // val x: Long = 1000
108135
val y = 2.2D // val y: Double = 2.2
109136
val z = 3.3F // val z: Float = 3.3
110137
```
111138

139+
{% endtab %}
140+
{% endtabs %}
141+
112142
Scala还具有 `String``Char` 类型,通常可以使用隐式形式声明:
113143

144+
{% tabs type-string %}
145+
{% tab 'Scala 2 and 3' for=type-string %}
146+
114147
```scala
115148
val s = "Bill"
116149
val c = 'a'
117150
```
118151

152+
{% endtab %}
153+
{% endtabs %}
154+
119155
如下面表格所示,将字符串括在双引号中 --- 或多行字符串括在三引号中 --- 或字符括在单引号中。
120156

121157
这些数据类型及其范围包括:
@@ -136,21 +172,33 @@ val c = 'a'
136172

137173
当您需要非常大的数字时,请使用 `BigInt``BigDecimal` 类型:
138174

175+
{% tabs type-bigint %}
176+
{% tab 'Scala 2 and 3' for=type-bigint %}
177+
139178
```scala
140179
val a = BigInt(1_234_567_890_987_654_321L)
141180
val b = BigDecimal(123_456.789)
142181
```
143182

183+
{% endtab %}
184+
{% endtabs %}
185+
144186
其中 `Double``Float` 是近似的十进制数, `BigDecimal` 用于精确算术,例如在使用货币时。
145187

146188
`BigInt``BigDecimal` 的一个好处是,它们支持您习惯于用于数字类型的所有运算符:
147189

190+
{% tabs type-bigint2 %}
191+
{% tab 'Scala 2 and 3' for=type-bigint2 %}
192+
148193
```scala
149194
val b = BigInt(1234567890) // scala.math.BigInt = 1234567890
150195
val c = b + b // scala.math.BigInt = 2469135780
151196
val d = b * b // scala.math.BigInt = 1524157875019052100
152197
```
153198

199+
{% endtab %}
200+
{% endtabs %}
201+
154202
## 关于字符串的两个注释
155203

156204
Scala字符串类似于Java字符串,但它们有两个很棒的附加特性:
@@ -163,28 +211,46 @@ Scala字符串类似于Java字符串,但它们有两个很棒的附加特性
163211
字符串插值提供了一种非常可读的方式在字符串中使用变量。
164212
例如,给定以下三个变量:
165213

214+
{% tabs string-inside1 %}
215+
{% tab 'Scala 2 and 3' for=string-inside1 %}
216+
166217
```scala
167218
val firstName = "John"
168219
val mi = 'C'
169220
val lastName = "Doe"
170221
```
171222

223+
{% endtab %}
224+
{% endtabs %}
225+
172226
你可以把那些变量组合成这样的字符串:
173227

228+
{% tabs string-inside2 %}
229+
{% tab 'Scala 2 and 3' for=string-inside2 %}
230+
174231
```scala
175232
println(s"Name: $firstName $mi $lastName") // "Name: John C Doe"
176233
```
177234

235+
{% endtab %}
236+
{% endtabs %}
237+
178238
只需在字符串前面加上字母 `s` ,然后在字符串内的变量名称之前放置一个 `$` 符号。
179239

180240
如果要在字符串中使用可能较大的表达式时,请将它们放在大括号中:
181241

242+
{% tabs string-inside3 %}
243+
{% tab 'Scala 2 and 3' for=string-inside3 %}
244+
182245
```scala
183246
println(s"2 + 2 = ${2 + 2}") // prints "2 + 2 = 4"
184247
val x = -1
185248
println(s"x.abs = ${x.abs}") // prints "x.abs = 1"
186249
```
187250

251+
{% endtab %}
252+
{% endtabs %}
253+
188254
#### 其他插值器
189255

190256
放置在字符串前面的 `s` 只是一个可能的插值器。
@@ -196,36 +262,60 @@ println(s"x.abs = ${x.abs}") // prints "x.abs = 1"
196262

197263
多行字符串是通过将字符串包含在三个双引号内来创建的:
198264

265+
{% tabs string-mlines1 %}
266+
{% tab 'Scala 2 and 3' for=string-mlines1 %}
267+
199268
```scala
200269
val quote = """The essence of Scala:
201270
Fusion of functional and object-oriented
202271
programming in a typed setting."""
203272
```
204273

274+
{% endtab %}
275+
{% endtabs %}
276+
205277
这种基本方法的一个缺点是,第一行之后的行是缩进的,如下所示:
206278

279+
{% tabs string-mlines2 %}
280+
{% tab 'Scala 2 and 3' for=string-mlines2 %}
281+
207282
```scala
208283
"The essence of Scala:
209284
Fusion of functional and object-oriented
210285
programming in a typed setting."
211286
```
212287

288+
{% endtab %}
289+
{% endtabs %}
290+
213291
当间距很重要时,在第一行之后的所有行前面放一个 `|` 符号,并在字符串之后调用 `stripMargin` 方法:
214292

293+
{% tabs string-mlines3 %}
294+
{% tab 'Scala 2 and 3' for=string-mlines3 %}
295+
215296
```scala
216297
val quote = """The essence of Scala:
217298
|Fusion of functional and object-oriented
218299
|programming in a typed setting.""".stripMargin
219300
```
220301

302+
{% endtab %}
303+
{% endtabs %}
304+
221305
现在字符串里所有行都是左对齐了:
222306

307+
{% tabs string-mlines4 %}
308+
{% tab 'Scala 2 and 3' for=string-mlines4 %}
309+
223310
```scala
224311
"The essence of Scala:
225312
Fusion of functional and object-oriented
226313
programming in a typed setting."
227314
```
228315

316+
{% endtab %}
317+
{% endtabs %}
318+
229319
## 类型转换
230320

231321
可以通过以下方式强制转换值类型:
@@ -234,6 +324,9 @@ programming in a typed setting."
234324

235325
例如:
236326

327+{% tabs cast1 %}
328+
{% tab 'Scala 2 and 3' for=cast1 %}
329+
237330
```scala
238331
val b: Byte = 127
239332
val i: Int = b // 127
@@ -242,14 +335,23 @@ val face: Char = '☺'
242335
val number: Int = face // 9786
243336
```
244337

338+
{% endtab %}
339+
{% endtabs %}
340+
245341
只有在没有丢失信息的情况下,才能强制转换为类型。否则,您需要明确说明强制转换:
246342

343+
{% tabs cast2 %}
344+
{% tab 'Scala 2 and 3' for=cast2 %}
345+
247346
```scala
248347
val x: Long = 987654321
249348
val y: Float = x.toFloat // 9.8765434E8 (注意 `.toFloat` 是必须的,因为强制类型转换后的精度会损)
250349
val z: Long = y // Error
251350
```
252351

352+
{% endtab %}
353+
{% endtabs %}
354+
253355
还可以将引用类型强制转换为子类型。
254356
这将在教程的后面部分介绍。
255357

0 commit comments

Comments
 (0)
0