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: _es/tour/abstract-type-members.md
+43-37Lines changed: 43 additions & 37 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,56 +14,62 @@ previous-page: tour-of-scala
14
14
En Scala, las cases son parametrizadas con valores (los parámetros de construcción) y con tipos (si las clases son [genéricas](generic-classes.html)). Por razones de consistencia, no es posible tener solo valores como miembros de objetos; tanto los tipos como los valores son miembros de objetos. Además, ambos tipos de miembros pueden ser concretos y abstractos.
15
15
A continuación un ejemplo el cual define de forma conjunta una asignación de valor tardía y un tipo abstracto como miembros del [trait](traits.html)`Buffer`.
16
16
17
-
trait Buffer {
18
-
type T
19
-
val element: T
20
-
}
17
+
```scala mdoc
18
+
traitBuffer {
19
+
typeT
20
+
valelement:T
21
+
}
22
+
```
21
23
22
24
Los *tipos abstractos* son tipos los cuales su identidad no es precisamente conocida. En el ejemplo anterior, lo único que sabemos es que cada objeto de la clase `Buffer` tiene un miembro de tipo `T`, pero la definición de la clase `Buffer` no revela qué tipo concreto se corresponde con el tipo `T`. Tal como las definiciones de valores, es posible sobrescribir las definiciones de tipos en subclases. Esto permite revelar más información acerca de un tipo abstracto al acotar el tipo ligado (el cual describe las posibles instancias concretas del tipo abstracto).
23
25
24
26
En el siguiente programa derivamos la clase `SeqBuffer` la cual nos permite almacenar solamente sequencias en el buffer al estipular que el tipo `T` tiene que ser un subtipo de `Seq[U]` para un nuevo tipo abstracto `U`:
25
27
26
-
abstract class SeqBuffer extends Buffer {
27
-
type U
28
-
type T <: Seq[U]
29
-
def length = element.length
30
-
}
28
+
```scala mdoc
29
+
abstractclassSeqBufferextendsBuffer {
30
+
typeU
31
+
typeT<:Seq[U]
32
+
deflength= element.length
33
+
}
34
+
```
31
35
32
36
Traits o [clases](classes.html) con miembros de tipos abstractos son generalmente usados en combinación con instancias de clases anónimas. Para ilustrar este concepto veremos un programa el cual trata con un buffer de sequencia que se remite a una lista de enteros.
El tipo retornado por el método `newIntSeqBuf` está ligado a la especialización del trait `Buffer` en el cual el tipo `U` es ahora equivalente a `Int`. Existe un tipo alias similar en la instancia de la clase anónima dentro del cuerpo del método `newIntSeqBuf`. En ese lugar se crea una nueva instancia de `IntSeqBuffer` en la cual el tipo `T` está ligado a `List[Int]`.
50
56
51
57
Es necesario notar que generalmente es posible transformar un tipo abstracto en un tipo paramétrico de una clase y viceversa. A continuación se muestra una versión del código anterior el cual solo usa tipos paramétricos.
52
58
53
-
abstract class Buffer[+T] {
54
-
val element: T
55
-
}
56
-
abstract class SeqBuffer[U, +T <: Seq[U]] extends Buffer[T] {
Nótese que es necesario usar [variance annotations](variances.html) aquí; de otra manera no sería posible ocultar el tipo implementado por la secuencia concreta del objeto retornado por `newIntSeqBuf`. Además, existen casos en los cuales no es posible remplazar tipos abstractos con tipos parametrizados.
Copy file name to clipboardExpand all lines: _es/tour/basics.md
+6-6Lines changed: 6 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -61,7 +61,7 @@ x = 3 // This does not compile.
61
61
62
62
Scala es capaz de inferir el tipo de un valor. Aun así, también se puede indicar el tipo usando una anotación:
63
63
64
-
```scala mdoc
64
+
```scala mdoc:nest
65
65
valx:Int=1+1
66
66
```
67
67
@@ -71,15 +71,15 @@ Nótese que la anotación del tipo `Int` sigue al identificador `x` de la variab
71
71
72
72
Una variable es como un valor, excepto que a una variable se le puede re-asignar un valor después de declararla. Una variable se declara con la palabra reservada `var`.
73
73
74
-
```scala mdoc
74
+
```scala mdoc:nest
75
75
varx=1+1
76
76
x =3// This compiles because "x" is declared with the "var" keyword.
77
77
println(x * x) // 9
78
78
```
79
79
80
80
Como con los valores, si se quiere se puede especificar el tipo de una variable mutable:
81
81
82
-
```scala mdoc
82
+
```scala mdoc:nest
83
83
varx:Int=1+1
84
84
```
85
85
@@ -140,7 +140,7 @@ Los métodos se parecen y comportan casi como a las funciones, pero se diferenci
140
140
Un método se define con la palabra reservada `def`, seguida por el nombre del método, la lista de parámetros, el tipo de valores que el método devuelve, y el cuerpo del método.
141
141
142
142
{% scalafiddle %}
143
-
```scala mdoc
143
+
```scala mdoc:nest
144
144
defadd(x: Int, y: Int):Int= x + y
145
145
println(add(1, 2)) // 3
146
146
```
@@ -271,7 +271,7 @@ Los traits son tipos que contienen campos y métodos. Se pueden combinar múltip
271
271
272
272
Un trait se define usando la palabra reservada `trait`.
273
273
274
-
```scala mdoc
274
+
```scala mdoc:nest
275
275
traitGreeter {
276
276
defgreet(name: String):Unit
277
277
}
@@ -280,7 +280,7 @@ trait Greeter {
280
280
Un `trait` también puede definir un método, o un valor, con una implementación por defecto.
0 commit comments