You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _pl/tour/multiple-parameter-lists.md
+57-17
Original file line number
Diff line number
Diff line change
@@ -6,37 +6,77 @@ discourse: false
6
6
7
7
partof: scala-tour
8
8
9
-
num: 9
9
+
num: 10
10
10
language: pl
11
11
next-page: case-classes
12
12
previous-page: nested-functions
13
13
---
14
14
15
-
Funkcja może określić dowolną ilość list parametrów. Kiedy jest ona wywołana dla mniejszej liczby niż zostało to zdefiniowane, zwraca funkcję pobierającą dalsze listy parametrów jako jej argument.
15
+
Metoda może określać dowolną liczbę list parametrów.
16
+
W sytuacji, kiedy jest ona wywołana dla mniejszej liczby list parametrów niż zostało to zdefiniowane, zwracana jest funkcja oczekująca pozostałych list parametrów jako argumentów.
16
17
17
-
Przykład rozwijania funkcji:
18
+
Dla przykładu przyjrzyjmy się metodzie `foldLeft` zdefiniowanej w [Traversable](/overviews/collections/trait-traversable.html) z kolekcji w Scali:
18
19
20
+
```
21
+
def foldLeft[B](z: B)(op: (B, A) => B): B
22
+
```
23
+
24
+
Metoda `foldLeft` stosuje binarny operator `op` na wartości początkowej `z` oraz wszystkich elementach zawartych w aktualnym obiekcie `Traversable` - idąc od lewej do prawej strony.
25
+
Poniżej omówiony jest przykład użycia.
26
+
27
+
Zaczynając od początkowej wartości 0, funkcja `foldLeft` stosuje funkcję `(m, n) => m + n` na każdym elemencie listy oraz poprzedniej zakumulowanej wartości.
28
+
29
+
{% scalafiddle %}
19
30
```tut
20
-
object CurryTest extends App {
31
+
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
32
+
val res = numbers.foldLeft(0)((m, n) => m + n)
33
+
println(res) // 55
34
+
```
35
+
{% endscalafiddle %}
36
+
37
+
Metody z wieloma listami parametrów mają bardziej dosadną składnię wywoływania, dlatego powinny być używane oszczędnie.
38
+
Sugerowane przypadki użycia obejmują:
39
+
40
+
#### Funkcja jako pojedynczy parametr
21
41
22
-
def filter(xs: List[Int], p: Int => Boolean): List[Int] =
23
-
if (xs.isEmpty) xs
24
-
else if (p(xs.head)) xs.head :: filter(xs.tail, p)
25
-
else filter(xs.tail, p)
42
+
W przypadku funkcji jako pojedynczego parametru, tak jak w przypadku `op` z `foldLeft` powyżej, wiele list parametrów pozwala na bardziej zwięzłą składnię przy przekazywaniu funkcji anonimowej do metody.
43
+
Bez wielu list parametrów kod wyglądałby w następujący sposób:
44
+
45
+
```
46
+
numbers.foldLeft(0, {(m: Int, n: Int) => m + n})
47
+
```
26
48
27
-
def modN(n: Int)(x: Int) = ((x % n) == 0)
49
+
Zauważ, że użycie wielu list parametrów pozwala na wykorzystanie wnioskowania typów, co z kolei czyni kod bardziej zwięzłym (jak pokazano poniżej).
50
+
Używając standardowej definicji metody, nie byłoby to możliwe.
28
51
29
-
val nums = List(1, 2, 3, 4, 5, 6, 7, 8)
30
-
println(filter(nums, modN(2)))
31
-
println(filter(nums, modN(3)))
32
-
}
52
+
```
53
+
numbers.foldLeft(0)(_ + _)
33
54
```
34
55
35
-
_Uwaga: metoda `modN` jest częściowo zastosowana dla dwóch wywołań `filter`, gdyż jest wywołana tylko dla jej pierwszego argumentu. Wyrażenie `modN(2)`zwraca funkcję typu `Int => Boolean` - stąd też może być przekazane jako drugi argument funkcji `filter`._
56
+
Powyższe wyrażenie `numbers.foldLeft(0)(_ + _)`pozwala trwale ustawić parametr `z` i przekazywać dalej częściową funkcję (partial function), tak jak pokazano to poniżej:
Copy file name to clipboardExpand all lines: _tour/multiple-parameter-lists.md
+3-1
Original file line number
Diff line number
Diff line change
@@ -25,11 +25,13 @@ def foldLeft[B](z: B)(op: (B, A) => B): B
25
25
26
26
Starting with an initial value of 0, `foldLeft` here applies the function `(m, n) => m + n` to each element in the List and the previous accumulated value.
27
27
28
+
{% scalafiddle %}
28
29
```tut
29
30
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
30
31
val res = numbers.foldLeft(0)((m, n) => m + n)
31
-
print(res) // 55
32
+
println(res) // 55
32
33
```
34
+
{% endscalafiddle %}
33
35
34
36
Multiple parameter lists have a more verbose invocation syntax; and hence should be used sparingly. Suggested use cases include:
0 commit comments