@@ -19,75 +19,143 @@ permalink: "/zh-cn/scala3/book/:title.html"
19
19
Scala 类、样例类、traits、枚举和对象都可以包含方法。
20
20
简单方法的语法如下所示:
21
21
22
+ {% tabs method_1 %}
23
+ {% tab 'Scala 2 and 3' for=method_1 %}
24
+
22
25
``` scala
23
26
def methodName (param1 : Type1 , param2 : Type2 ): ReturnType =
24
27
// the method body
25
28
// goes here
26
29
```
27
30
31
+ {% endtab %}
32
+ {% endtabs %}
33
+
28
34
这有一些例子:
29
35
36
+ {% tabs method_2 %}
37
+ {% tab 'Scala 2 and 3' for=method_2 %}
38
+
30
39
``` scala
31
40
def sum (a : Int , b : Int ): Int = a + b
32
41
def concatenate (s1 : String , s2 : String ): String = s1 + s2
33
42
```
34
43
44
+ {% endtab %}
45
+ {% endtabs %}
46
+
35
47
您不必声明方法的返回类型,因此如果您愿意,可以像这样编写这些方法:
36
48
49
+ {% tabs method_3 %}
50
+ {% tab 'Scala 2 and 3' for=method_3 %}
51
+
37
52
``` scala
38
53
def sum (a : Int , b : Int ) = a + b
39
54
def concatenate (s1 : String , s2 : String ) = s1 + s2
40
55
```
41
56
57
+ {% endtab %}
58
+ {% endtabs %}
59
+
42
60
这是你如何调用这些方法:
43
61
62
+ {% tabs method_4 %}
63
+ {% tab 'Scala 2 and 3' for=method_4 %}
64
+
44
65
``` scala
45
66
val x = sum(1 , 2 )
46
67
val y = concatenate(" foo" , " bar" )
47
68
```
48
69
70
+ {% endtab %}
71
+ {% endtabs %}
72
+
49
73
这是一个多行的方法:
50
74
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
+
51
89
``` scala
52
90
def getStackTraceAsString (t : Throwable ): String =
53
91
val sw = new StringWriter
54
92
t.printStackTrace(new PrintWriter (sw))
55
93
sw.toString
56
94
```
57
95
96
+ {% endtab %}
97
+ {% endtabs %}
98
+
58
99
方法参数也可以具有默认值。
59
100
在此示例中,` timeout ` 参数的默认值为 ` 5000 ` :
60
101
102
+ {% tabs method_6 %}
103
+ {% tab 'Scala 2 and 3' for=method_6 %}
104
+
61
105
``` scala
62
106
def makeConnection (url : String , timeout : Int = 5000 ): Unit =
63
107
println(s " url= $url, timeout= $timeout" )
64
108
```
65
109
110
+ {% endtab %}
111
+ {% endtabs %}
112
+
66
113
由于方法声明中提供了默认的 ` 超时 ` 值,因此可以通过以下两种方式调用该方法:
67
114
115
+ {% tabs method_7 %}
116
+ {% tab 'Scala 2 and 3' for=method_7 %}
117
+
68
118
``` scala
69
119
makeConnection(" https://localhost" ) // url=http://localhost, timeout=5000
70
120
makeConnection(" https://localhost" , 2500 ) // url=http://localhost, timeout=2500
71
121
```
72
122
123
+ {% endtab %}
124
+ {% endtabs %}
125
+
73
126
Scala 还支持在调用方法时使用 _ 命名参数_ ,因此如果您愿意,也可以像这样调用该方法:
74
127
128
+ {% tabs method_8 %}
129
+ {% tab 'Scala 2 and 3' for=method_8 %}
130
+
75
131
``` scala
76
132
makeConnection(
77
133
url = " https://localhost" ,
78
134
timeout = 2500
79
135
)
80
136
```
81
137
138
+ {% endtab %}
139
+ {% endtabs %}
140
+
82
141
当多个方法参数具有相同的类型时,命名参数特别有用。
83
142
乍一看,使用此方法,您可能想知道哪些参数设置为 ` true ` 或 ` false ` :
84
143
144
+ {% tabs method_9 %}
145
+ {% tab 'Scala 2 and 3' for=method_9 %}
146
+
85
147
``` scala
86
148
engage(true , true , true , false )
87
149
```
88
150
151
+ {% endtab %}
152
+ {% endtabs %}
153
+
89
154
如果没有IDE的帮助,那段代码可能很难阅读,但这个代码要明显得多:
90
155
156
+ {% tabs method_10 %}
157
+ {% tab 'Scala 2 and 3' for=method_10 %}
158
+
91
159
``` scala
92
160
engage(
93
161
speedIsSet = true ,
@@ -96,12 +164,17 @@ engage(
96
164
turnedOffParkingBrake = false
97
165
)
98
166
```
167
+ {% endtab %}
168
+ {% endtabs %}
99
169
100
170
## 扩展方法
101
171
102
172
_ 扩展方法_ 允许您向封闭类添加新方法。
103
173
例如,如果要将两个名为 ` hello ` 和 ` aloha ` 的方法添加到 ` String ` 类中,请将它们声明为扩展方法:
104
174
175
+ {% tabs extension0 %}
176
+ {% tab 'Scala 3 Only' %}
177
+
105
178
``` scala
106
179
extension (s : String )
107
180
def hello : String = s " Hello, ${s.capitalize}! "
@@ -111,13 +184,19 @@ extension (s: String)
111
184
" friend" .aloha // "Aloha, Friend!"
112
185
```
113
186
187
+ {% endtab %}
188
+ {% endtabs %}
189
+
114
190
` extension ` 关键字声明了括号内的参数将定义一个或多个扩展方法。
115
191
如此示例所示,可以在扩展方法体中使用 ` String ` 类型的参数 ` s ` 。
116
192
117
193
下一个示例演示如何将 ` makeInt ` 方法添加到 ` String ` 类。
118
194
在这里,` makeInt ` 采用一个名为 ` radix ` 的参数。
119
195
该代码不考虑可能的字符串到整数转换错误,但跳过细节,示例显示了它的工作原理:
120
196
197
+ {% tabs extension %}
198
+ {% tab 'Scala 3 Only' %}
199
+
121
200
``` scala
122
201
extension (s : String )
123
202
def makeInt (radix : Int ): Int = Integer .parseInt(s, radix)
@@ -127,7 +206,10 @@ extension (s: String)
127
206
" 100" .makeInt(2 ) // Int = 4
128
207
```
129
208
130
- ## See also
209
+ {% endtab %}
210
+ {% endtabs %}
211
+
212
+ ## 参见
131
213
132
214
Scala方法可以更强大:它们可以采用类型参数和上下文参数。
133
215
它们在[ 领域建模] [ data-1 ] 一节中有详细介绍。
0 commit comments