Skip to content

Commit e1e3ce1

Browse files
authored
add code tabs in _zh-cn/overviews/scala3-book/taste-methods.md. (#2681)
* add code tabs in _zh-cn/overviews/scala3-book/taste-methods.md. * add code table in _zh-cn/overviews/scala3-book/taste-methods.md * correct label from _9 to _10.
1 parent 234935d commit e1e3ce1

File tree

2 files changed

+102
-1
lines changed

2 files changed

+102
-1
lines changed

_zh-cn/overviews/scala3-book/taste-functions.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,33 @@ Lambdas(也称为 _匿名函数_)是保持代码简洁但可读性的重要
2626

2727
这两个示例是等效的,并演示如何通过将 lambda 传递到 `map` 方法中,将列表中的每个数字乘以 `2`
2828

29+
30+
{% tabs function_1 %}
31+
{% tab 'Scala 2 and 3' for=function_1 %}
32+
2933
```scala
3034
val a = List(1, 2, 3).map(i => i * 2) // List(2,4,6)
3135
val b = List(1, 2, 3).map(_ * 2) // List(2,4,6)
3236
```
3337

38+
{% endtab %}
39+
{% endtabs %}
40+
3441
这些示例也等效于以下代码,该代码使用 `double` 方法而不是lambda:
3542

43+
{% tabs function_2 %}
44+
{% tab 'Scala 2 and 3' for=function_2 %}
45+
3646
```scala
3747
def double(i: Int): Int = i * 2
3848

3949
val a = List(1, 2, 3).map(i => double(i)) // List(2,4,6)
4050
val b = List(1, 2, 3).map(double) // List(2,4,6)
4151
```
4252

53+
{% endtab %}
54+
{% endtabs %}
55+
4356
> 如果您以前从未见过 `map` 方法,它会将给定的函数应用于列表中的每个元素,从而生成一个包含结果值的新列表。
4457
4558
将 lambda 传递给集合类上的高阶函数(如 `List`)是 Scala 体验的一部分,您每天都会这样做。
@@ -51,6 +64,9 @@ val b = List(1, 2, 3).map(double) // List(2,4,6)
5164

5265
例如,此示例演示如何对一个集合进行两次筛选,然后将其余集合中的每个元素乘某个数:
5366

67+
{% tabs function_3 %}
68+
{% tab 'Scala 2 and 3' for=function_3 %}
69+
5470
```scala
5571
// a sample list
5672
val nums = (1 to 10).toList // List(1,2,3,4,5,6,7,8,9,10)
@@ -63,6 +79,9 @@ val x = nums.filter(_ > 3)
6379
// result: x == List(40, 50, 60)
6480
```
6581

82+
{% endtab %}
83+
{% endtabs %}
84+
6685
除了在整个标准库中使用的高阶函数外,您还可以[创建自己的][higher-order] 高阶函数。
6786

6887
[higher-order]: {% link _zh-cn/overviews/scala3-book/fun-hofs.md %}

_zh-cn/overviews/scala3-book/taste-methods.md

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,75 +19,143 @@ permalink: "/zh-cn/scala3/book/:title.html"
1919
Scala 类、样例类、traits、枚举和对象都可以包含方法。
2020
简单方法的语法如下所示:
2121

22+
{% tabs method_1 %}
23+
{% tab 'Scala 2 and 3' for=method_1 %}
24+
2225
```scala
2326
def methodName(param1: Type1, param2: Type2): ReturnType =
2427
// the method body
2528
// goes here
2629
```
2730

31+
{% endtab %}
32+
{% endtabs %}
33+
2834
这有一些例子:
2935

36+
{% tabs method_2 %}
37+
{% tab 'Scala 2 and 3' for=method_2 %}
38+
3039
```scala
3140
def sum(a: Int, b: Int): Int = a + b
3241
def concatenate(s1: String, s2: String): String = s1 + s2
3342
```
3443

44+
{% endtab %}
45+
{% endtabs %}
46+
3547
您不必声明方法的返回类型,因此如果您愿意,可以像这样编写这些方法:
3648

49+
{% tabs method_3 %}
50+
{% tab 'Scala 2 and 3' for=method_3 %}
51+
3752
```scala
3853
def sum(a: Int, b: Int) = a + b
3954
def concatenate(s1: String, s2: String) = s1 + s2
4055
```
4156

57+
{% endtab %}
58+
{% endtabs %}
59+
4260
这是你如何调用这些方法:
4361

62+
{% tabs method_4 %}
63+
{% tab 'Scala 2 and 3' for=method_4 %}
64+
4465
```scala
4566
val x = sum(1, 2)
4667
val y = concatenate("foo", "bar")
4768
```
4869

70+
{% endtab %}
71+
{% endtabs %}
72+
4973
这是一个多行的方法:
5074

75+
{% tabs method_5 class=tabs-scala-version %}
76+
{% tab 'Scala 2' for=method_5 %}
77+
78+
```scala
79+
def getStackTraceAsString(t: Throwable): String = {
80+
val sw = new StringWriter
81+
t.printStackTrace(new PrintWriter(sw))
82+
sw.toString
83+
}
84+
```
85+
86+
{% endtab %}
87+
{% tab 'Scala 3' for=method_5 %}
88+
5189
```scala
5290
def getStackTraceAsString(t: Throwable): String =
5391
val sw = new StringWriter
5492
t.printStackTrace(new PrintWriter(sw))
5593
sw.toString
5694
```
5795

96+
{% endtab %}
97+
{% endtabs %}
98+
5899
方法参数也可以具有默认值。
59100
在此示例中,`timeout` 参数的默认值为 `5000`
60101

102+
{% tabs method_6 %}
103+
{% tab 'Scala 2 and 3' for=method_6 %}
104+
61105
```scala
62106
def makeConnection(url: String, timeout: Int = 5000): Unit =
63107
println(s"url=$url, timeout=$timeout")
64108
```
65109

110+
{% endtab %}
111+
{% endtabs %}
112+
66113
由于方法声明中提供了默认的 `超时` 值,因此可以通过以下两种方式调用该方法:
67114

115+
{% tabs method_7 %}
116+
{% tab 'Scala 2 and 3' for=method_7 %}
117+
68118
```scala
69119
makeConnection("https://localhost") // url=http://localhost, timeout=5000
70120
makeConnection("https://localhost", 2500) // url=http://localhost, timeout=2500
71121
```
72122

123+
{% endtab %}
124+
{% endtabs %}
125+
73126
Scala 还支持在调用方法时使用 _命名参数_,因此如果您愿意,也可以像这样调用该方法:
74127

128+
{% tabs method_8 %}
129+
{% tab 'Scala 2 and 3' for=method_8 %}
130+
75131
```scala
76132
makeConnection(
77133
url = "https://localhost",
78134
timeout = 2500
79135
)
80136
```
81137

138+
{% endtab %}
139+
{% endtabs %}
140+
82141
当多个方法参数具有相同的类型时,命名参数特别有用。
83142
乍一看,使用此方法,您可能想知道哪些参数设置为 `true``false`
84143

144+
{% tabs method_9 %}
145+
{% tab 'Scala 2 and 3' for=method_9 %}
146+
85147
```scala
86148
engage(true, true, true, false)
87149
```
88150

151+
{% endtab %}
152+
{% endtabs %}
153+
89154
如果没有IDE的帮助,那段代码可能很难阅读,但这个代码要明显得多:
90155

156+
{% tabs method_10 %}
157+
{% tab 'Scala 2 and 3' for=method_10 %}
158+
91159
```scala
92160
engage(
93161
speedIsSet = true,
@@ -96,12 +164,17 @@ engage(
96164
turnedOffParkingBrake = false
97165
)
98166
```
167+
{% endtab %}
168+
{% endtabs %}
99169

100170
## 扩展方法
101171

102172
_扩展方法_ 允许您向封闭类添加新方法。
103173
例如,如果要将两个名为 `hello``aloha` 的方法添加到 `String` 类中,请将它们声明为扩展方法:
104174

175+
{% tabs extension0 %}
176+
{% tab 'Scala 3 Only' %}
177+
105178
```scala
106179
extension (s: String)
107180
def hello: String = s"Hello, ${s.capitalize}!"
@@ -111,13 +184,19 @@ extension (s: String)
111184
"friend".aloha // "Aloha, Friend!"
112185
```
113186

187+
{% endtab %}
188+
{% endtabs %}
189+
114190
`extension` 关键字声明了括号内的参数将定义一个或多个扩展方法。
115191
如此示例所示,可以在扩展方法体中使用 `String` 类型的参数 `s`
116192

117193
下一个示例演示如何将 `makeInt` 方法添加到 `String` 类。
118194
在这里,`makeInt` 采用一个名为 `radix` 的参数。
119195
该代码不考虑可能的字符串到整数转换错误,但跳过细节,示例显示了它的工作原理:
120196

197+
{% tabs extension %}
198+
{% tab 'Scala 3 Only' %}
199+
121200
```scala
122201
extension (s: String)
123202
def makeInt(radix: Int): Int = Integer.parseInt(s, radix)
@@ -127,7 +206,10 @@ extension (s: String)
127206
"100".makeInt(2) // Int = 4
128207
```
129208

130-
## See also
209+
{% endtab %}
210+
{% endtabs %}
211+
212+
## 参见
131213

132214
Scala方法可以更强大:它们可以采用类型参数和上下文参数。
133215
它们在[领域建模][data-1]一节中有详细介绍。

0 commit comments

Comments
 (0)