@@ -16,18 +16,26 @@ permalink: "/zh-cn/scala3/book/:title.html"
16
16
17
17
当你查看 Scala 集合类的 ` map ` 方法的 Scaladoc 时,你会看到它被定义为接受一个_函数_ :
18
18
19
+ {% tabs fun_1 %}
20
+ {% tab 'Scala 2 and 3' for=fun_1 %}
19
21
``` scala
20
22
def map [B ](f : (A ) => B ): List [B ]
21
23
------------
22
24
```
25
+ {% endtab %}
26
+ {% endtabs %}
23
27
24
28
事实上,Scaladoc 明确指出,“` f ` 是应用于每个元素的_函数_ 。”
25
29
但尽管如此,你可以通过某种方式将_方法_传递给 ` map ` ,它仍然有效:
26
30
31
+ {% tabs fun_2 %}
32
+ {% tab 'Scala 2 and 3' for=fun_2 %}
27
33
``` scala
28
34
def times10 (i : Int ) = i * 10 // a method
29
35
List (1 , 2 , 3 ).map(times10) // List(10,20,30)
30
36
```
37
+ {% endtab %}
38
+ {% endtabs %}
31
39
32
40
你有没有想过这是如何工作的——如何将_方法_传递给需要_函数_的` map ` ?
33
41
@@ -48,19 +56,28 @@ I’ve made a few changes to that description that I hope are more accurate and
48
56
它们的语法也不同。
49
57
此示例说明如何定义执行相同任务的方法和函数,确定给定整数是否为偶数:
50
58
59
+ {% tabs fun_3 %}
60
+ {% tab 'Scala 2 and 3' for=fun_3 %}
51
61
``` scala
52
62
def isEvenMethod (i : Int ) = i % 2 == 0 // a method
53
63
val isEvenFunction = (i : Int ) => i % 2 == 0 // a function
54
64
```
65
+ {% endtab %}
66
+ {% endtabs %}
55
67
56
68
该函数确实是一个对象,因此您可以像使用任何其他变量一样使用它,例如将其放入列表中:
57
69
70
+ {% tabs fun_4 %}
71
+ {% tab 'Scala 2 and 3' for=fun_4 %}
58
72
``` scala
59
73
val functions = List (isEvenFunction)
60
74
```
75
+ {% endtab %}
76
+ {% endtabs %}
61
77
62
- 相反,从技术上讲,方法不是对象,因此在 Scala 2 中,您不能将方法放入 ` List ` 中,至少不能直接放入,如下例所示:
63
78
79
+ {% tabs fun_5 class=tabs-scala-version %}
80
+ {% tab 'Scala 2' for=fun_5 %}
64
81
``` scala
65
82
// this example shows the Scala 2 error message
66
83
val methods = List (isEvenMethod)
@@ -70,13 +87,21 @@ Unapplied methods are only converted to functions when a function type is expect
70
87
You can make this conversion explicit by writing `isEvenMethod _` or `isEvenMethod(_)` instead of `isEvenMethod`.
71
88
```
72
89
73
- 如该错误消息所示,在 Scala 2 中可以手动将方法转换为函数,但 Scala 3 的重要部分是改进了 Eta 扩展技术,所以现在当您尝试将方法当作变量用,它是可以工作的---您不必自己处理手动转换:
90
+ 相反,从技术上讲,方法不是对象,因此在 Scala 2 中,您不能将方法放入 ` List ` 中,至少不能直接放入,如下例所示:
91
+
92
+ {% endtab %}
93
+ {% tab 'Scala 3' for=fun_5 %}
74
94
75
95
``` scala
76
96
val functions = List (isEvenFunction) // works
77
97
val methods = List (isEvenMethod) // works
78
98
```
79
99
100
+ Scala 3 的重要部分是改进了 Eta 扩展技术,所以现在当您尝试将方法当作变量用,它是可以工作的---您不必自己处理手动转换:
101
+
102
+ {% endtab %}
103
+ {% endtabs %}
104
+
80
105
就这本入门书而言,需要了解的重要事项是:
81
106
82
107
- Eta Expansion 是 Scala 技术,让您可以像使用函数一样使用方法
0 commit comments