Skip to content

Commit 7e5fe32

Browse files
committed
Fix example code example in explicitly-typed-self-references.md and several minor corrections
1 parent 61e4ed5 commit 7e5fe32

File tree

3 files changed

+31
-15
lines changed

3 files changed

+31
-15
lines changed

pl/tutorials/tour/abstract-types.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ tutorial-next: compound-types
1212
tutorial-previous: inner-classes
1313
---
1414

15-
W Scali, klasy są parametryzowane wartościami (parametry konstruktora) oraz typami (jeżeli klasa jest [generyczna](generic-classes.html)). Aby zachować regularność, zarówno typy jak i wartości są elementami klasy. Analogicznie, mogą być konkretne albo abstrakcyjne.
15+
W Scali, klasy są parametryzowane wartościami (parametry konstruktora) oraz typami (jeżeli klasa jest [generyczna](generic-classes.html)). Aby zachować regularność, zarówno typy jak i wartości są elementami klasy. Analogicznie mogą one być konkretne albo abstrakcyjne.
1616

17-
Poniższy przykład definiuje wartość określaną przez abstrakcyjny typ, będący elementem [cechy](traits.html) `Buffer`:
17+
Poniższy przykład definiuje wartość określaną przez abstrakcyjny typ będący elementem [cechy](traits.html) `Buffer`:
1818

1919
```tut
2020
trait Buffer {
@@ -23,7 +23,7 @@ trait Buffer {
2323
}
2424
```
2525

26-
*Typy abstrakcyjne* są typami, które nie są jednoznacznie określone. W powyższym przykładzie wiemy tylko, że każdy obiekt klasy `Buffer` posiada typ `T`, ale definicja klasy `Buffer` nie zdradza jakiemu konkretnie typowi odpowiada `T`. Tak jak definicje wartość, możemy także nadpisać definicje typów w klasach pochodnych. Pozwala to nam na odkrywanie dodatkowych informacji o abstrakcyjnym typie poprzez zawężanie jego ograniczeń (które opisują możliwe warianty konkretnego typu).
26+
*Typy abstrakcyjne* są typami, które nie są jednoznacznie określone. W powyższym przykładzie wiemy tylko, że każdy obiekt klasy `Buffer` posiada typ `T`, ale definicja klasy `Buffer` nie zdradza jakiemu konkretnie typowi on odpowiada. Tak jak definicje wartości, możemy także nadpisać definicje typów w klasach pochodnych. Pozwala to nam na odkrywanie dodatkowych informacji o abstrakcyjnym typie poprzez zawężanie jego ograniczeń (które opisują możliwe warianty konkretnego typu).
2727

2828
W poniższym programie definiujemy klasę `SeqBuffer`, która ogranicza możliwe typy `T` do pochodnych sekwencji `Seq[U]` dla nowego typu `U`:
2929

@@ -35,7 +35,7 @@ abstract class SeqBuffer extends Buffer {
3535
}
3636
```
3737

38-
Cechy oraz [klasy](classes.html) z abstrakcyjnymi typami są często używane w połączeniu z anonimowymi klasami. Aby to zilustrować wykorzystamy program, w którym utworzymy bufor sekwencji, ograniczony do listy liczb całkowitych:
38+
Cechy oraz [klasy](classes.html) z abstrakcyjnymi typami są często używane w połączeniu z anonimowymi klasami. Aby to zilustrować wykorzystamy program, w którym utworzymy bufor sekwencji ograniczony do listy liczb całkowitych:
3939

4040
```tut
4141
abstract class IntSeqBuffer extends SeqBuffer {
@@ -76,4 +76,4 @@ object AbstractTypeTest2 extends App {
7676
}
7777
```
7878

79-
Należy pamięctać o tym, żeby zastosować [adnotacji wariancji](variance.html). Inaczej nie byłoby możliwe ukrycie konkretnego typu sekwencji obiektu zwracanego przez metodę `newIntSeqBuf`.
79+
Należy też pamiętać o tym, żeby zastosować [adnotacji wariancji](variance.html). Inaczej nie byłoby możliwe ukrycie konkretnego typu sekwencji obiektu zwracanego przez metodę `newIntSeqBuf`.

pl/tutorials/tour/annotations.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ language: pl
1313

1414
Adnotacje dodają meta-informacje do różnego rodzaju definicji.
1515

16-
Podstawową formą adnotacji jest `@C` lub `@C(a1, ..., an)`. Tutaj `C` jest konstruktorem klasy `C`, który musi odpowiadać klasie `scala.Annotation`. Wszystkie argumenty konstruktora `a1, ..., an` muszą być stałymi wyrażeniami (czyli wyrażeniami takimi jak liczby, łańcuchy znaków, literały klasowe, enumeracji Javy oraz ich jednowymiarowe tablice).
16+
Podstawową formą adnotacji jest `@C` lub `@C(a1, ..., an)`. Tutaj `C` jest konstruktorem klasy `C`, który musi odpowiadać klasie `scala.Annotation`. Wszystkie argumenty konstruktora `a1, ..., an` muszą być stałymi wyrażeniami (czyli wyrażeniami takimi jak liczby, łańcuchy znaków, literały klasowe, enumeracje Javy oraz ich jednowymiarowe tablice).
1717

1818
Adnotację stosuje się do pierwszej definicji lub deklaracji która po niej następuje. Możliwe jest zastosowanie więcej niż jednej adnotacji przed definicją lub deklaracją. Kolejność według której są one określone nie ma istotnego znaczenia.
1919

20-
Znaczenie adnotacji jest zależne od implementacji. Na platformie Java, poniższe adnotacje mają standardowe znaczenie:
20+
Znaczenie adnotacji jest zależne od implementacji. Na platformie Java, poniższe adnotacje domyślnie oznaczają:
2121

2222
| Scala | Java |
2323
| ------ | ------ |

pl/tutorials/tour/explicitly-typed-self-references.md

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,30 @@ Jeżeli przyjrzymy się bliżej implementacji metody `connectWith`, możemy dost
6767
Scala rozwiązuje ten problem pozwalając na powiązanie klasy z innym typem poprzez jawne typowanie samoreferencji. Możemy użyć tego mechanizmu, aby naprawić powyższy kod:
6868

6969
```tut
70-
class NodeImpl extends NodeIntf {
71-
self: Node => // określenie typu "self"
72-
def connectWith(node: Node): Edge = {
73-
val edge = newEdge(this, node) // w tej chwili się skompiluje
74-
edges = edge :: edges
75-
edge
76-
}
77-
}
70+
abstract class DirectedGraph extends Graph {
71+
type Edge <: EdgeImpl
72+
class EdgeImpl(origin: Node, dest: Node) {
73+
def from = origin
74+
def to = dest
75+
}
76+
class NodeImpl extends NodeIntf {
77+
self: Node => // określenie typu "self"
78+
def connectWith(node: Node): Edge = {
79+
val edge = newEdge(this, node) // w tej chwili się skompiluje
80+
edges = edge :: edges
81+
edge
82+
}
83+
}
84+
protected def newNode: Node
85+
protected def newEdge(from: Node, to: Node): Edge
86+
var nodes: List[Node] = Nil
87+
var edges: List[Edge] = Nil
88+
def addNode: Node = {
89+
val node = newNode
90+
nodes = node :: nodes
91+
node
92+
}
93+
}
7894
```
7995

8096
W nowej definicji klasy `NodeImpl` referencja `this` jest typu `Node`. Ponieważ typ `Node` jest abstrakcyjny i stąd nie wiemy jeszczy, czy `NodeImpl` w rzeczywistości odpowiada `Node`, system typów w Scali nie pozwoli nam na utworzenie tego typu. Mimo wszystko za pomocą jawnej adnotacji typu stwierdzamy, że w pewnym momencie klasa pochodna od `NodeImpl` musi odpowiadać typowi `Node` aby dało się ją utworzyć.

0 commit comments

Comments
 (0)