Skip to content

Commit 8858474

Browse files
benluojulienrf
authored andcommitted
add code tab in _zh-cn/overviews/scala3-book/fp-functions-are-values.md
1 parent ab2f720 commit 8858474

File tree

1 file changed

+28
-0
lines changed

1 file changed

+28
-0
lines changed

_zh-cn/overviews/scala3-book/fp-functions-are-values.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,25 @@ permalink: "/zh-cn/scala3/book/:title.html"
1919
这个特性有很多好处,其中最常见的是(a)您可以定义方法来接受函数参数,以及(b)您可以将函数作为参数传递给方法。
2020
你已经在本书的多个地方看到了这一点,每当演示像 `map``filter` 这样的方法时:
2121

22+
{% tabs fp-function-as-values-anonymous %}
23+
{% tab 'Scala 2 and 3' %}
2224
```scala
2325
val nums = (1 to 10).toList
2426

2527
val doubles = nums.map(_ * 2) // double each value
2628
val lessThanFive = nums.filter(_ < 5) // List(1,2,3,4)
2729
```
30+
{% endtab %}
31+
{% endtabs %}
2832

2933
在这些示例中,匿名函数被传递到 `map``filter` 中。
3034

3135
> 匿名函数也称为 *lambdas*
3236
3337
除了将匿名函数传递给 `filter``map` 之外,您还可以为它们提供 *方法*
3438

39+
{% tabs fp-function-as-values-defined %}
40+
{% tab 'Scala 2 and 3' %}
3541
```scala
3642
// two methods
3743
def double(i: Int): Int = i * 2
@@ -40,6 +46,8 @@ def underFive(i: Int): Boolean = i < 5
4046
// pass those methods into filter and map
4147
val doubles = nums.filter(underFive).map(double)
4248
```
49+
{% endtab %}
50+
{% endtabs %}
4351

4452
这种将方法和函数视为值的能力是函数式编程语言提供的强大特性。
4553

@@ -50,29 +58,45 @@ val doubles = nums.filter(underFive).map(double)
5058

5159
正如您在这些示例中看到的,这是一个匿名函数:
5260

61+
{% tabs fp-anonymous-function-short %}
62+
{% tab 'Scala 2 and 3' %}
5363
```scala
5464
_ * 2
5565
```
66+
{% endtab %}
67+
{% endtabs %}
5668

5769
[高阶函数][hofs] 讨论中所示,上面的写法是下面语法的简写版本:
5870

71+
{% tabs fp-anonymous-function-full %}
72+
{% tab 'Scala 2 and 3' %}
5973
```scala
6074
(i: Int) => i * 2
6175
```
76+
{% endtab %}
77+
{% endtabs %}
6278

6379
像这样的函数被称为“匿名”,因为它们没有名字。
6480
如果你想给一个名字,只需将它分配给一个变量:
6581

82+
{% tabs fp-function-assignement %}
83+
{% tab 'Scala 2 and 3' %}
6684
```scala
6785
val double = (i: Int) => i * 2
6886
```
87+
{% endtab %}
88+
{% endtabs %}
6989

7090
现在你有了一个命名函数,一个分配给变量的函数。
7191
您可以像使用方法一样使用此函数:
7292

93+
{% tabs fp-function-used-like-method %}
94+
{% tab 'Scala 2 and 3' %}
7395
```scala
7496
double(2) // 4
7597
```
98+
{% endtab %}
99+
{% endtabs %}
76100

77101
在大多数情况下,`double` 是函数还是方法并不重要。 Scala 允许您以同样的方式对待它们。
78102
在幕后,让您像对待函数一样对待方法的 Scala 技术被称为 [Eta 表达式][eta]
@@ -82,6 +106,8 @@ double(2) // 4
82106

83107
如果您对将函数作为参数传递给其他函数的过程不适应,可以尝试以下几个示例:
84108

109+
{% tabs fp-function-as-values-example %}
110+
{% tab 'Scala 2 and 3' %}
85111
```scala
86112
List("bob", "joe").map(_.toUpperCase) // List(BOB, JOE)
87113
List("bob", "joe").map(_.capitalize) // List(Bob, Joe)
@@ -100,6 +126,8 @@ nums.sortWith(_ > _) // List(11, 7, 5, 3, 1)
100126

101127
nums.takeWhile(_ < 6).sortWith(_ < _) // List(1, 3, 5)
102128
```
129+
{% endtab %}
130+
{% endtabs %}
103131

104132
[hofs]: {% link _zh-cn/overviews/scala3-book/fun-hofs.md %}
105133
[eta]: {% link _zh-cn/overviews/scala3-book/fun-eta-expansion.md %}

0 commit comments

Comments
 (0)