diff --git a/es/tutorials/tour/abstract-types.md b/es/tutorials/tour/abstract-types.md index 4d91f5abc9..27d2691075 100644 --- a/es/tutorials/tour/abstract-types.md +++ b/es/tutorials/tour/abstract-types.md @@ -65,4 +65,4 @@ Es necesario notar que generalmente es posible transformar un tipo abstracto en println("content = " + buf.element) } -Nótese que es debido 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. +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. diff --git a/es/tutorials/tour/annotations.md b/es/tutorials/tour/annotations.md index 56435650a6..1de3c7b9a0 100644 --- a/es/tutorials/tour/annotations.md +++ b/es/tutorials/tour/annotations.md @@ -88,7 +88,7 @@ Y después utilizarlo de la siguiente manera mail = "support@coders.com") public class MyClass extends HisClass ... -Una anotación en Scala aparenta como una invocación a un constructor. Para instanciar una anotación de Java es necesario usar los argumentos nombrados: +Una anotación en Scala se asemeja a una invocación a un constructor. Para instanciar una anotación de Java es necesario usar los argumentos nombrados: @Source(URL = "http://coders.com/", mail = "support@coders.com") diff --git a/es/tutorials/tour/anonymous-function-syntax.md b/es/tutorials/tour/anonymous-function-syntax.md index 6e45493c5e..c5c1740691 100644 --- a/es/tutorials/tour/anonymous-function-syntax.md +++ b/es/tutorials/tour/anonymous-function-syntax.md @@ -27,7 +27,7 @@ o sin parámetros: () => { System.getProperty("user.dir") } -Esiste también una forma simple para escribir los tipos de las funciones. A continuación se muestran los tipos de las tre funciones escritas anteriormente: +Existe también una forma simple para escribir los tipos de las funciones. A continuación se muestran los tipos de las trés funciones escritas anteriormente: Int => Int (Int, Int) => String diff --git a/es/tutorials/tour/automatic-closures.md b/es/tutorials/tour/automatic-closures.md index f45f4a46e9..97c54fe8c8 100644 --- a/es/tutorials/tour/automatic-closures.md +++ b/es/tutorials/tour/automatic-closures.md @@ -9,7 +9,7 @@ num: 16 language: es --- -Scala permite pasar a un método como parámetro funciones que no reciban parámetros. Cuando un método así es invocado, los parámetros reales de la función enviada sin parámetros no son evaluados y una función "nularia" (de aridad creo, 0-aria, o sin parámetros) es pasada en su llugar la cual encapsula el comportamiento del parámetro correspondiente (comunmente conocido como "llamada por nombre"). +Scala permite pasar funciones sin parámetros como parámetros de un método. Cuando un método así es invocado, los parámetros reales de la función enviada sin parámetros no son evaluados y una función "nularia" (de aridad cero, 0-aria, o sin parámetros) es pasada en su lugar. Esta función encapsula el comportamiento del parámetro correspondiente (comunmente conocido como "llamada por nombre"). Para aclarar un poco esto aquí se muestra un ejemplo: @@ -26,9 +26,9 @@ Para aclarar un poco esto aquí se muestra un ejemplo: } } -La función `whileLoop` recibe dos parámetros `cond` y `body`. Cuando la función es llamada, los parámetros reales no son evaluados en ese momento. Pero cuando los parámetros son utilizados en el cuerpo de la función `whileLoop`, las funciones nularias creadas implicitamente serán evaluadas en su lugar. Así, nuestro método `whileLoop` implementa un bucle tipo Java mediante una implementación recursiva. +La función `whileLoop` recibe dos parámetros `cond` y `body`. Cuando la función es llamada, los parámetros reales no son evaluados en ese momento. Pero cuando los parámetros son utilizados en el cuerpo de la función `whileLoop`, las funciones nularias creadas implícitamente serán evaluadas en su lugar. Así, nuestro método `whileLoop` implementa un bucle tipo Java mediante una implementación recursiva. -Es posible combinar el uso de [operadores de infijo y postfijo (infix/postfix)](operators.html) con este mecanismo para crear declaraciones más complejas (con una sintaxis agrdadable). +Es posible combinar el uso de [operadores de infijo y postfijo (infix/postfix)](operators.html) con este mecanismo para crear declaraciones más complejas (con una sintaxis agradadable). Aquí mostramos la implementación de una declaración tipo repetir-a-menos-que (repetir el bucle a no ser que se cumpla X condición): @@ -48,7 +48,7 @@ Aquí mostramos la implementación de una declaración tipo repetir-a-menos-que } unless (i == 0) } -La función `loop` solo acepta el cuerpo de un bucle y retorna una instancia de la clase `LoopUnlessCond` (la cual encapsula el cuerpo del objeto). Es importante notar que en este punto el cuerpo del bucle no ha sido evaluado aun. La clase `LoopUnlessCond` tiene un método `unless` el cual puede ser usado como un *operador de infijo (infix)*. De esta manera podemos lograr una sintaxis muy natural para nuestro nuevo bucle `repetir { a_menos_que ( )`. +La función `loop` solo acepta el cuerpo de un bucle y retorna una instancia de la clase `LoopUnlessCond` (la cual encapsula el cuerpo del objeto). Es importante notar que en este punto el cuerpo del bucle no ha sido evaluado aún. La clase `LoopUnlessCond` tiene un método `unless` el cual puede ser usado como un *operador de infijo (infix)*. De esta manera podemos lograr una sintaxis muy natural para nuestro nuevo bucle `repetir { a_menos_que ( )`. A continuación se expone el resultado de la ejecución de `TargetTest2`: diff --git a/es/tutorials/tour/case-classes.md b/es/tutorials/tour/case-classes.md index d56b7a4667..d51061cf6f 100644 --- a/es/tutorials/tour/case-classes.md +++ b/es/tutorials/tour/case-classes.md @@ -42,7 +42,7 @@ imprime Var(x) == Var(x) => true Var(x) == Var(y) => false -Solo tiene sentido definir una clase Case si el reconocimiento de patrones es usado para descomponer la estructura de los datos de la clase. El siguiente objeto define define una linda función que imprime en pantalla nuestra representación del cálculo lambda: +Solo tiene sentido definir una clase Case si el reconocimiento de patrones es usado para descomponer la estructura de los datos de la clase. El siguiente objeto define define una función de impresión `elegante` (en inglés `pretty`) que imprime en pantalla nuestra representación del cálculo lambda: object TermTest extends scala.App { def printTerm(term: Term) { diff --git a/es/tutorials/tour/classes.md b/es/tutorials/tour/classes.md index 3b7fdf4229..902fc881f5 100644 --- a/es/tutorials/tour/classes.md +++ b/es/tutorials/tour/classes.md @@ -21,11 +21,11 @@ Aquí se presenta una clase la cual define la clase `Point`: override def toString(): String = "(" + x + ", " + y + ")"; } -Esta clase define dos variables `x` e `y`, y dos métodos: `move` y `toString`. El método `move` recibe dos argumentos de tipo entero, pero no retorna ningún valor (implicitamente se retorna el tipo `Unit`, el cual se corresponde a `void` en lenguajes tipo Java). `toString`, por otro lado, no recibe ningún parámetro pero retorna un valor tipo `String`. Ya que `toString` sobreescribe el método `toString` predefinido en una superclase, tiene que ser anotado con `override`. +Esta clase define dos variables `x` e `y`, y dos métodos: `move` y `toString`. El método `move` recibe dos argumentos de tipo entero, pero no retorna ningún valor (implícitamente se retorna el tipo `Unit`, el cual se corresponde a `void` en lenguajes tipo Java). `toString`, por otro lado, no recibe ningún parámetro pero retorna un valor tipo `String`. Ya que `toString` sobreescribe el método `toString` predefinido en una superclase, tiene que ser anotado con `override`. -Las clases en Scala son parametrizadas con argumentos constructores (inicializadores). En el código anterior se definen dos argumentos contructores, `xc` y `yc`; ambos son visibles en toda la clase. En nuestro ejemplo son utilizzados para inicializar las variables `x` e `y`. +Las clases en Scala son parametrizadas con argumentos constructores (inicializadores). En el código anterior se definen dos argumentos contructores, `xc` y `yc`; ambos son visibles en toda la clase. En nuestro ejemplo son utilizados para inicializar las variables `x` e `y`. -Para instanciar una clase es necesario usar la primitiva new, como se muestra en el siguiente ejemplo: +Para instanciar una clase es necesario usar la primitiva `new`, como se muestra en el siguiente ejemplo: object Classes { def main(args: Array[String]) { @@ -36,7 +36,7 @@ Para instanciar una clase es necesario usar la primitiva new, como se muestra en } } -El programa define una aplicación ejecutable a través del método `main` del objeto singleton Classes. El método `main` crea un nuevo `Point` y lo almacena en `pt`. _Note que valores definidos con la signatura `val` son distintos de los definidos con `var` (véase la clase `Point` arriba) ya que los primeros (`val`) no permiten reasignaciones; es decir, que el valor es una constante._ +El programa define una aplicación ejecutable a través del método `main` del objeto singleton `Classes`. El método `main` crea un nuevo `Point` y lo almacena en `pt`. _Note que valores definidos con la signatura `val` son distintos de los definidos con `var` (véase la clase `Point` arriba) ya que los primeros (`val`) no permiten reasignaciones; es decir, que el valor es una constante._ Aquí se muestra la salida del programa: diff --git a/es/tutorials/tour/compound-types.md b/es/tutorials/tour/compound-types.md index 849c59aba4..7dc8640201 100644 --- a/es/tutorials/tour/compound-types.md +++ b/es/tutorials/tour/compound-types.md @@ -30,7 +30,7 @@ Ahora suponga que queremos escribir una función `cloneAndReset` la cual recibe cloned } -La pregunta que surge es cuál es el tipo del parámetro `obj`. Si este fuera `Cloneable` entonces el objeto puede ser clonado mediante el método `clone`, pero no puede usarse el método `reset`; Si fuera `Resetable` podríamos resetearlo mediante el método `reset`, pero no sería posible clonarlo. Para evitar casteos (refundiciones) de tipos en situaciones como la descripta, podemos especificar que el tipo del objeto `obj` sea tanto `Clonable` como `Resetable`. En tal caso estaríamos creando un tipo compuesto; de la siguiente manera: +La pregunta que surge es cuál es el tipo del parámetro `obj`. Si este fuera `Cloneable` entonces el objeto puede ser clonado mediante el método `clone`, pero no puede usarse el método `reset`; Si fuera `Resetable` podríamos resetearlo mediante el método `reset`, pero no sería posible clonarlo. Para evitar casteos (refundiciones, en inglés `casting`) de tipos en situaciones como la descrita, podemos especificar que el tipo del objeto `obj` sea tanto `Clonable` como `Resetable`. En tal caso estaríamos creando un tipo compuesto; de la siguiente manera: def cloneAndReset(obj: Cloneable with Resetable): Cloneable = { //... diff --git a/es/tutorials/tour/currying.md b/es/tutorials/tour/currying.md index 118ab193cc..4a3f772a54 100644 --- a/es/tutorials/tour/currying.md +++ b/es/tutorials/tour/currying.md @@ -11,7 +11,7 @@ language: es _Nota de traducción: Currying es una técnica de programación funcional nombrada en honor al matemático y lógico Haskell Curry. Es por eso que no se intentará hacer ninguna traducción sobre el término Currying. Entiendase este como una acción, técnica base de PF. Como una nota al paso, el lenguaje de programación Haskell debe su nombre a este eximio matemático._ -Métodos pueden definir múltiples listas de parámetros. Cuando un método es invocado con un número menor de listas de parámetros, en su lugar se devolverá una función que toma las listas faltantes como sus argumentos. +Los métodos pueden definir múltiples listas de parámetros. Cuando un método es invocado con un número menor de listas de parámetros, en su lugar se devolverá una función que toma las listas faltantes como sus argumentos. Aquí se muestra un ejemplo: diff --git a/es/tutorials/tour/default-parameter-values.md b/es/tutorials/tour/default-parameter-values.md index e6bbea0759..0d0a281a21 100644 --- a/es/tutorials/tour/default-parameter-values.md +++ b/es/tutorials/tour/default-parameter-values.md @@ -9,9 +9,9 @@ num: 34 language: es --- -Scala tiene la capacidad de de dar a los parámetros valores por defecto que pueden ser usados para permitir a quien invoca el método o función que omita dichos parámetros. +Scala tiene la capacidad de dar a los parámetros valores por defecto que pueden ser usados para permitir a quien invoca el método o función que omita dichos parámetros. -En Java, uno tiende a ver muchos métodos sobrecargados que solamente sirven para proveer valores por defecto para ciertos parámetros de un método largo. En especial se ve este comportamiento en contstructores: +En Java, uno tiende a ver muchos métodos sobrecargados que solamente sirven para proveer valores por defecto para ciertos parámetros de un método largo. En especial se ve este comportamiento en constructores: public class HashMap { public HashMap(Map m); @@ -24,9 +24,9 @@ En Java, uno tiende a ver muchos métodos sobrecargados que solamente sirven par public HashMap(int initialCapacity, float loadFactor); } -Existen realmente dos constructores aquí; uno que toma otro mapa y uno que toma una capacidad y un factor de carga. El tercer y cuarto constructores están ahí para premitir a los usuarios de la clase HashMap crear instancias con el valor por defecto que probablemente sea el mejor para ambos, el factor de carga y la capacidad. +Existen realmente dos constructores aquí; uno que toma otro mapa y uno que toma una capacidad y un factor de carga. Los constructores tercero y cuarto están ahí para premitir a los usuarios de la clase HashMap crear instancias con el valor por defecto que probablemente sea el mejor para ambos, el factor de carga y la capacidad. -Más problemático es que los valores usados para ser por defecto están tanto en la documentación (Javadoc) y en el código. Mantener esto actualizado es fácil de olvidar. Un típico patrón utilizado para no cometer estos errores es agregar constantes públicas cuyo valor será mostrado en el Javadoc: +Más problemático es que los valores usados para ser por defecto están tanto en la documentación (Javadoc) como en el código. Mantener ambos actualizado es dificil. Un patrón típico utilizado para no cometer estos errores es agregar constantes públicas cuyo valor será mostrado en el Javadoc: public class HashMap { public static final int DEFAULT_CAPACITY = 16; diff --git a/es/tutorials/tour/explicitly-typed-self-references.md b/es/tutorials/tour/explicitly-typed-self-references.md index fdf7dcf43f..0f6d3dc3ea 100644 --- a/es/tutorials/tour/explicitly-typed-self-references.md +++ b/es/tutorials/tour/explicitly-typed-self-references.md @@ -9,7 +9,7 @@ num: 27 language: es --- -Cuando se está construyendo software extensible, algunas veces resulta útil declarar el tipo de la variable `this` explicitamente. Para motivar esto, realizaremos una pequeña representación de una estructura de datos Grafo, en Scala. +Cuando se está construyendo software extensible, algunas veces resulta útil declarar el tipo de la variable `this` explícitamente. Para motivar esto, realizaremos una pequeña representación de una estructura de datos Grafo, en Scala. Aquí hay una definición que sirve para describir un grafo: @@ -52,7 +52,9 @@ Una posible implementación de la clase `Grafo`es dada en el siguiente programa: } } -La clase `GrafoDirigido` especializa la clase `Grafo` al proveer una implementación parcial. La implementación es solamente parcial, porque queremos que sea posible extender `GrafoDirigido` aun más. Por lo tanto, esta clase deja todos los detalles de implementación abiertos y así tanto los tipos vértice como nodo son abstractos. De todas maneras, la clase `GrafoDirigido` revela algunos detalles adicionales sobre la implementación del tipo vértice al acotar el límite a la clase `VerticeImpl`. Además, tenemos algunas implementaciones preliminares de vértices y nodos representados por las clases `VerticeImpl` y `NodoImpl`. Ya que es necesario crear nuevos objetos nodo y vértice con nuestra implementación parcial del grafo, también debimos agregar los métodos constructores `nuevoNodo` y `nuevoVertice`. Los métodos `agregarNodo` y `conectarCon` están ambos definidos en términos de estos métodos constructores. Una mirada más cercana a la implementación del método `conectarCon` revela que para crear un vértice es necesario pasar la auto-referencia `this` al método constructor `newEdge`. Pero a `this` en ese contexto le es asignado el tipo `NodoImpl`, por lo tanto no es compatible con el tipo `Nodo` el cual es requerido por el correspondiente método constructor. Como consecuencia, el programa superior no está bien definido y compilador mostrará un mensaje de error. +La clase `GrafoDirigido` especializa la clase `Grafo` al proveer una implementación parcial. La implementación es solamente parcial, porque queremos que sea posible extender `GrafoDirigido` aun más. Por lo tanto, esta clase deja todos los detalles de implementación abiertos y así tanto los tipos vértice como nodo son abstractos. De todas maneras, la clase `GrafoDirigido` revela algunos detalles adicionales sobre la implementación del tipo vértice al acotar el límite a la clase `VerticeImpl`. Además, tenemos algunas implementaciones preliminares de vértices y nodos representados por las clases `VerticeImpl` y `NodoImpl`. + +Ya que es necesario crear nuevos objetos nodo y vértice con nuestra implementación parcial del grafo, también debimos agregar los métodos constructores `nuevoNodo` y `nuevoVertice`. Los métodos `agregarNodo` y `conectarCon` están ambos definidos en términos de estos métodos constructores. Una mirada más cercana a la implementación del método `conectarCon` revela que para crear un vértice es necesario pasar la auto-referencia `this` al método constructor `newEdge`. Pero a `this` en ese contexto le es asignado el tipo `NodoImpl`, por lo tanto no es compatible con el tipo `Nodo` el cual es requerido por el correspondiente método constructor. Como consecuencia, el programa superior no está bien definido y compilador mostrará un mensaje de error. En Scala es posible atar a una clase otro tipo (que será implementado en el futuro) al darle su propia auto-referencia `this` el otro tipo explicitamente. Podemos usar este mecanismo para arreglar nuestro código de arriba. El tipo the `this` explícito es especificado dentro del cuerpo de la clase `GrafoDirigido`. @@ -71,7 +73,7 @@ Este es el progama arreglado: ... } -En esta nueva definición de la clase `NodoImpl`, `this` tiene el tipo `Nodo`. Ya que `Nodo` es abstracta y por lo tanto todavía no sabemos si `NodoImpl` es realmente un subtipo de `Nodo`, el sistema de tipado de Scala no permitirá instanciar esta clase. Pero de todas maneras, estipulamos con esta anotación explicita de tipo que que en algún momento en el tiempo , una subclase de `NodeImpl` tiene que denotar un subtipo del tipo `Nodo` de forma de ser instanciable. +En esta nueva definición de la clase `NodoImpl`, `this` tiene el tipo `Nodo`. Ya que `Nodo` es abstracta y por lo tanto todavía no sabemos si `NodoImpl` es realmente un subtipo de `Nodo`, el sistema de tipado de Scala no permitirá instanciar esta clase. Pero de todas maneras, estipulamos con esta anotación explicita de tipo que en algún momento en el tiempo, una subclase de `NodeImpl` tiene que denotar un subtipo del tipo `Nodo` de forma de ser instanciable. Aquí presentamos una especialización concreta de `GrafoDirigido` donde todos los miembros abstractos son definidos: diff --git a/es/tutorials/tour/extractor-objects.md b/es/tutorials/tour/extractor-objects.md index c4f027ecd8..5c7daa6a32 100644 --- a/es/tutorials/tour/extractor-objects.md +++ b/es/tutorials/tour/extractor-objects.md @@ -9,7 +9,7 @@ num: 8 language: es --- -En Scala pueden ser definidos patrones independientemente de las clases Caso. Para este fin exite un método llamado `unapply` que proveera el ya dicho extractor. Por ejemplo, en el código siguiente se define el objeto extractor `Twice` +En Scala pueden ser definidos patrones independientemente de las clases Caso (en inglés case classes, desde ahora clases Case). Para este fin exite un método llamado `unapply` que proveera el ya dicho extractor. Por ejemplo, en el código siguiente se define el objeto extractor `Twice` object Twice { def apply(x: Int): Int = x * 2 diff --git a/es/tutorials/tour/generic-classes.md b/es/tutorials/tour/generic-classes.md index cacbc7ed33..677fe3ccaa 100644 --- a/es/tutorials/tour/generic-classes.md +++ b/es/tutorials/tour/generic-classes.md @@ -9,7 +9,7 @@ num: 9 language: es --- -Tal como en Java 5 ([JDK 1.5](http://java.sun.com/j2se/1.5/)), Scala provee soporte nativo para parametrizar clases con tipos. Eso es llamado clases genéricas y son especialmente importantes para el desarrollo de clases tipo colección. +Tal como en Java 5 ([JDK 1.5](http://java.sun.com/j2se/1.5/)), Scala provee soporte nativo para clases parametrizados con tipos. Eso es llamado clases genéricas y son especialmente importantes para el desarrollo de clases tipo colección. A continuación se muestra un ejemplo: diff --git a/es/tutorials/tour/higher-order-functions.md b/es/tutorials/tour/higher-order-functions.md index 84ac705f7b..7ca4748e31 100644 --- a/es/tutorials/tour/higher-order-functions.md +++ b/es/tutorials/tour/higher-order-functions.md @@ -31,4 +31,4 @@ La ejecución da como valor el siguiente resultado: [7] -En este ejemplo, el método `decorator.layout` es coaccionado automáticamente a un valor del tipo `Int => String` como es requerido por el método `apply`. Por favor note que el método `decorator.layout` es un _método polimórfico_ (esto es, se abstrae de algunos de los sus tipos) y el compilador de Scala primero tiene que instanciar correctamente el tipo del método. +En este ejemplo, el método `decorator.layout` es coaccionado automáticamente a un valor del tipo `Int => String` como es requerido por el método `apply`. Por favor note que el método `decorator.layout` es un _método polimórfico_ (esto es, se abstrae de algunos de sus tipos) y el compilador de Scala primero tiene que instanciar correctamente el tipo del método. diff --git a/es/tutorials/tour/implicit-parameters.md b/es/tutorials/tour/implicit-parameters.md index c95cdf8273..8561f5317d 100644 --- a/es/tutorials/tour/implicit-parameters.md +++ b/es/tutorials/tour/implicit-parameters.md @@ -12,8 +12,8 @@ language: es Un método con _parámetros implícitos_ puede ser aplicado a argumentos tal como un método normal. En este caso la etiqueta `implicit` no tiene efecto. De todas maneras, si a un método le faltan argumentos para sus parámetros implícitos, tales argumentos serán automáticamente provistos. Los argumentos reales que son elegibles para ser pasados a un parámetro implícito están contenidos en dos categorías: -* Primero, son elegibles todos los identificadores x que puedan ser accedidos en el momento de la llamda al método sin ningún prefijo y que denotan una definición implícita o un parámetro implícito. -* Segundo, además son elegibles todos los miembros de modulos `companion` (ver objetos companion) del tipo de parámetro implicito que tienen la etiqueta `implicit`. +* Primera, son elegibles todos los identificadores x que puedan ser accedidos en el momento de la llamada al método sin ningún prefijo y que denotan una definición implícita o un parámetro implícito. +* Segunda, además son elegibles todos los miembros de modulos `companion` (ver [objetos companion] (singleton-objects.html) ) del tipo de parámetro implicito que tienen la etiqueta `implicit`. En el siguiente ejemplo definimos un método `sum` el cual computa la suma de una lista de elementos usando las operaciones `add` y `unit` de `Monoid`. Note que los valores implícitos no pueden ser de nivel superior (top-level), deben ser miembros de una plantilla. diff --git a/es/tutorials/tour/inner-classes.md b/es/tutorials/tour/inner-classes.md index 2e0ae52611..8904761986 100644 --- a/es/tutorials/tour/inner-classes.md +++ b/es/tutorials/tour/inner-classes.md @@ -9,7 +9,7 @@ num: 11 language: es --- -En Scala es posible que las clases tengan como miembro otras clases. A diferencia de lenguajes tipo Java donde ese tipo de clases internas son miembros de las clases que las envuelven, en Scala esas clases internas están ligadas al objeto externo. Para ilustrar esta diferencia, vamos a mostrar rápidamente una implementación del tipo grafo: +En Scala es posible que las clases tengan como miembro otras clases. A diferencia de lenguajes similares a Java donde ese tipo de clases internas son miembros de las clases que las envuelven, en Scala esas clases internas están ligadas al objeto externo. Para ilustrar esta diferencia, vamos a mostrar rápidamente una implementación del tipo grafo: class Graph { class Node { diff --git a/es/tutorials/tour/local-type-inference.md b/es/tutorials/tour/local-type-inference.md index af9dbaa1f6..030086a591 100644 --- a/es/tutorials/tour/local-type-inference.md +++ b/es/tutorials/tour/local-type-inference.md @@ -41,7 +41,7 @@ Las últimas dos lineas de este programa son equivalentes al siguiente código, val x: MyPair[Int, String] = MyPair[Int, String](1, "scala") val y: Int = id[Int](1) -En algunas situaciones puede ser bastante peligroso confira en el mecanismo de inferencia de tipos de Scala, como se ilustra en el siguiente ejemplo: +En algunas situaciones puede ser bastante peligroso confiar en el mecanismo de inferencia de tipos de Scala, como se ilustra en el siguiente ejemplo: object InferenceTest4 { var obj = null diff --git a/es/tutorials/tour/mixin-class-composition.md b/es/tutorials/tour/mixin-class-composition.md index 008b16b25b..ae82bab04a 100644 --- a/es/tutorials/tour/mixin-class-composition.md +++ b/es/tutorials/tour/mixin-class-composition.md @@ -10,7 +10,7 @@ language: es --- _Nota de traducción: La palabra `mixin` puede ser traducida como mezcla, dando título a esta sección de: Composición de clases Mezcla, pero es preferible utilizar la notación original_ -En diferencia de lenguajes que solo soportan _herencia simple_, Scala tiene una notación más general de la reutilización de clases. Scala hace posible reutilizar la _nueva definición de miembros de una clase_ (es decir, el delta en relación a la superclase) en la definición de una nueva clase. Esto es expresado como una _composición de clases mixin_. Considere la siguiente abstracción para iteradores. +A diferencia de lenguajes que solo soportan _herencia simple_, Scala tiene una notación más general de la reutilización de clases. Scala hace posible reutilizar la _nueva definición de miembros de una clase_ (es decir, el delta en relación a la superclase) en la definición de una nueva clase. Esto es expresado como una _composición de clases mixin_. Considere la siguiente abstracción para iteradores. abstract class AbsIterator { type T diff --git a/es/tutorials/tour/nested-functions.md b/es/tutorials/tour/nested-functions.md index f3e04e5bf4..c01517924d 100644 --- a/es/tutorials/tour/nested-functions.md +++ b/es/tutorials/tour/nested-functions.md @@ -9,7 +9,7 @@ num: 13 language: es --- -En scala es posible anidar definiciones de funciones. El siguiente objeto provee una función `filter` para extraer valores de una lista de enteros que están por debajo de un determinado valor: +En scala es posible anidar definiciones de funciones. El siguiente objeto provee una función `filter` para extraer valores de una lista de enteros que están por debajo de un valor determinado: object FilterTest extends App { def filter(xs: List[Int], threshold: Int) = { diff --git a/es/tutorials/tour/pattern-matching.md b/es/tutorials/tour/pattern-matching.md index ad78092582..6b56386da7 100644 --- a/es/tutorials/tour/pattern-matching.md +++ b/es/tutorials/tour/pattern-matching.md @@ -11,9 +11,6 @@ language: es _Nota de traducción: Es dificil encontrar en nuestro idioma una palabra que se relacione directamente con el significado de `match` en inglés. Podemos entender a `match` como "coincidir" o "concordar" con algo. En algunos lugares se utiliza la palabra `machear`, aunque esta no existe en nuestro idioma con el sentido que se le da en este texto, sino que se utiliza como traducción de `match`._ -Scala has a built-in general pattern matching mechanism. It allows to match on any sort of data with a first-match policy. -Here is a small example which shows how to match against an integer value: - Scala tiene incorporado un mecanismo general de reconocimiento de patrones. Este permite identificar cualquier tipo de datos una política primero-encontrado. Aquí se muestra un pequeño ejemplo el cual muestra cómo coincidir un valor entero: object MatchTest1 extends App { @@ -27,7 +24,7 @@ Scala tiene incorporado un mecanismo general de reconocimiento de patrones. Este El bloque con las sentencias `case` define una función la cual mapea enteros a cadenas de caracteres (strings). La palabra reservada `match` provee una manera conveniente de aplicar una función (como la función anterior) a un objeto. -Aquí se muestra un ejemplo el cual machea un valor contra un patrón de diferentes tipos: +Aquí se muestra un ejemplo el cual coincide un valor contra un patrón de diferentes tipos: object MatchTest2 extends App { def matchTest(x: Any): Any = x match { @@ -38,6 +35,6 @@ Aquí se muestra un ejemplo el cual machea un valor contra un patrón de diferen println(matchTest("two")) } -El primer `case` coincide si `x` se refiere a un valor entero `1`. El segundo `case` coincide si `x` es igual al string `"two"`. El tersero consiste en un patron tipado (se provee un tipo); se produce una coincidencia contra cualquier entero que se provea y además se liga la variable `y` al valor pasado `x` de tipo entero. +El primer `case` coincide si `x` se refiere a un valor entero `1`. El segundo `case` coincide si `x` es igual al string `"two"`. El tercero consiste en un patrón tipado (se provee un tipo); se produce una coincidencia contra cualquier entero que se provea y además se liga la variable `y` al valor pasado `x` de tipo entero. -El reconocimiento de patrones en Scala es más útil para hacer coincidir tipos algebráicos expresados mediante [clases case](case-classes.html). Scala también permite la definición de patrones independientemente de las clases case, a través del método `unapply` de [objetos extractores](extractor-objects.html). +El reconocimiento de patrones en Scala es más útil para hacer coincidir tipos algebráicos expresados mediante [clases case](case-classes.html). Scala también permite la definición de patrones independientemente de las clases Case, a través del método `unapply` de [objetos extractores](extractor-objects.html). diff --git a/es/tutorials/tour/polymorphic-methods.md b/es/tutorials/tour/polymorphic-methods.md index 79c48344e9..91ebae17df 100644 --- a/es/tutorials/tour/polymorphic-methods.md +++ b/es/tutorials/tour/polymorphic-methods.md @@ -23,4 +23,4 @@ Aquí hay un ejemplo: El método `dup` en el objeto `PolyTest` es parametrizado con el tipo `T` y con los parámetros `x: T` y `n: Int`. Cuando el método `dup` es llamado, el programador provee los parámetros requeridos _(vea la linea 5 del programa anterior)_, pero como se muestra en la linea 6 no es necesario que se provea el parámetro de tipo `T` explicitamente. El sistema de tipado de Scala puede inferir estos tipos. Esto es realizado a través de la observación del tipo de los parámetros pasados y del contexto donde el método es invocado. -Por favor note que el trait `App` está diseñado para escribir programas cortos de testeo, pero debe ser evitado en código en producción (para versiones de Scala 2.8.x y anteriores) ya que puede afectar la habilidad de la JVM de optimizar el código resultante; por favor use `def main()` en su lugar. +Por favor note que el trait `App` está diseñado para escribir programas cortos de pruebas. Debe ser evitado en código en producción (para versiones de Scala 2.8.x y anteriores) ya que puede afectar la habilidad de la JVM de optimizar el código resultante; por favor use `def main()` en su lugar. diff --git a/es/tutorials/tour/singleton-objects.md b/es/tutorials/tour/singleton-objects.md new file mode 100644 index 0000000000..5acb50ecd9 --- /dev/null +++ b/es/tutorials/tour/singleton-objects.md @@ -0,0 +1,66 @@ +--- +layout: tutorial +title: Singleton Objects + +disqus: true + +tutorial: scala-tour +num: 12 +language: es +tutorial-next: xml-processing +tutorial-previous: pattern-matching +--- + +Métodos y valores que no están asociados con instancias individuales de una [clase](classes.html) se denominan *objetos singleton* y se denotan con la palabra reservada `object` en vez de `class`. + + package test + + object Blah { + def sum(l: List[Int]): Int = l.sum + } + +Este método `sum` está disponible de manera global, y puede ser referenciado, o importado, como `test.Blah.sum`. + +Los objetos singleton son una especie de mezcla entre la definición de una clase de utilización única, la cual no pueden ser instanciada directamente, y un miembro `val`. De hecho, de la misma menera que los `val`, los objetos singleton pueden ser definidos como miembros de un [trait](traits.html) o de una clase, aunque esto no es muy frecuente. + +Un objeto singleton puede extender clases y _traits_. De hecho, una [clase Case](case-classes.html) sin [parámetros de tipo](generic-classes.html) generará por defecto un objeto singleton del mismo nombre, con una [`Función*`](http://www.scala-lang.org/api/current/scala/Function1.html) trait implementada. + +## Acompañantes ## + +La mayoría de los objetos singleton no están solos, sino que en realidad están asociados con clases del mismo nombre. El "objeto singleton del mismo nombre" de una case Case, mencionada anteriormente es un ejemplo de esto. Cuando esto sucede, el objeto singleton es llamado el *objeto acompañante* de la clase, y la clase es a su vez llamada la *clase acompañante* del objeto. + +[Scaladoc](https://wiki.scala-lang.org/display/SW/Introduction) proporciona un soporte especial para ir y venir entre una clase y su acompañante: Si el gran círculo conteniendo la “C” u la “O” tiene su borde inferior doblado hacia adentro, es posible hacer click en el círculo para ir a su acompañante. + +Una clase y su objeto acompañante, si existe, deben estar definidos en el mismo archivo fuente. Como por ejemplo: + + class IntPair(val x: Int, val y: Int) + + object IntPair { + import math.Ordering + + implicit def ipord: Ordering[IntPair] = + Ordering.by(ip => (ip.x, ip.y)) + } + +Es común ver instancias de clases tipo como [valores implícitos](implicit-parameters.html), (`ipord` en el ejemplo anterior) definida en el acompañante cuando se sigue el patron de clases tipo. Esto es debido a que los miembros del acompañante se incluyen en la búsqueda de implícitos por defecto. + +## Notas para los programadores Java ## +`static` no es una palabra reservada en Scala. En cambio, todos los miembros que serían estáticos, incluso las clases, van en los objetos acompañantes. Estos, pueden ser referenciados usando la misma sintaxis, importados de manera individual o en grupo, etc. + +Frecuentemente, los programadores Java, definen miembros estáticos, incluso definidos como `private`, como ayudas en la implementacion de los miembros de la instancia. Estos elementos también van en el objeto acompañante. Un patrón comúnmente utilizado es de importar los miembros del objeto acompañante en la clase, como por ejemplo: + + class X { + import X._ + + def blah = foo + } + + object X { + private def foo = 42 + } + +Esto permite ilustrar otra característica: en el contexto de un `private`, una clase y su acompañante son amigos. El `objecto X` puede acceder miembros de la `clase X`, y vice versa. Para hacer un miembro *realmente* privado para uno u otro, utilice `private[this]`. + +Para conveniencia de Java, los métodos que incluyen `var` y `val`, definidos directamente en un objeto singleton también tienen un método estático definido en la clase acompañante, llamado *static forwarder*. Otros miembros son accesibles por medio del campo estático `X$.MODULE$` para el `objeto X`. + +Si todos los elementos se mueven al objeto acompanante y se descubre que lo que queda es una clase que no se quiere instanciar, entonces simplemente bórrela. Los *static forwarder* de todas formas van a ser creados. diff --git a/es/tutorials/tour/tour-of-scala.md b/es/tutorials/tour/tour-of-scala.md index 58a49b6cbf..86dff2436e 100644 --- a/es/tutorials/tour/tour-of-scala.md +++ b/es/tutorials/tour/tour-of-scala.md @@ -9,18 +9,18 @@ num: 1 language: es --- -Scala es un moderno lenguaje de programación multi-paradigma diseñado para expresar patrones de programación comunes de una forma concisa, elegante, y de tipado seguro. Integra facilmente características de lenguajes orientados a objetos y funcionales. +Scala es un lenguaje de programación moderno multi-paradigma diseñado para expresar patrones de programación comunes de una forma concisa, elegante, y de tipado seguro. Integra fácilmente características de lenguajes orientados a objetos y funcionales. ## Scala es orientado a objetos ## -Scala es un lenguaje puramente orientado a objetos en el sentido de que [todo es un objeto](unified_types.html). Los tipos y comportamientos de objetos son descriptos por [clases](classes.html) y [traits](traits.html) (que podría ser traducido como un "rasgo"). Las clases pueden ser extendidas a través de subclases y un flexible mecanismo [de composición mezclada](mixin-class-composition.html) que provee un claro remplazo para la herencia múltiple. +Scala es un lenguaje puramente orientado a objetos en el sentido de que [todo es un objeto](unified_types.html). Los tipos y comportamientos de objetos son descritos por [clases](classes.html) y [traits](traits.html) (que podría ser traducido como un "rasgo"). Las clases pueden ser extendidas a través de subclases y un mecanismo flexible [de composición mezclada](mixin-class-composition.html) que provee un claro remplazo a la herencia múltiple. ## Scala es funcional ## Scala es también un lenguaje funcional en el sentido que [toda función es un valor](unified_types.html). Scala provee una [sintaxis ligera](anonymous-function-syntax.html) para definir funciones anónimas. Soporta [funciones de primer orden](higher-order-functions.html), permite que las funciones sean [anidadas](nested-functions.html), y soporta [currying](currying.html). Las [clases caso](case-classes.html) de Scala y las construcciones incorporadas al lenguaje para [reconocimiento de patrones](pattern-matching.html) modelan tipos algebráicos usados en muchos lenguajes de programación funcionales. -Además, la noción de reconocimiento de patrones de Scala se puede extender naturalmente al [procesamiento de datos XML](xml-processing.html) con la ayuda de [patrones de secuencias que igonoran a la derecha](regular-expression-patterns.html). En este contexto, [seq comprehensions](sequence-comprehensions.html) resultan útiles para formular consultas. Estas características hacen a Scala ideal para desarrollar aplicaciones como Web Services. +Además, la noción de reconocimiento de patrones de Scala se puede extender naturalmente al [procesamiento de datos XML](xml-processing.html) con la ayuda de [patrones de expresiones regulares](regular-expression-patterns.html). En este contexto, [seq comprehensions](sequence-comprehensions.html) resultan útiles para formular consultas. Estas características hacen a Scala ideal para desarrollar aplicaciones como Web Services. -## Scala estaticamente tipado ## -Scala cuenta con un expresivo sistema de tipado que fuerza estaticamente las abstracciones a ser usadas en una manera coherente y segura. En particular, el sistema de tipado soprta: +## Scala estáticamente tipado ## +Scala cuenta con un expresivo sistema de tipado que fuerza estáticamente las abstracciones a ser usadas en una manera coherente y segura. En particular, el sistema de tipado soporta: * [Clases genéricas](generic-classes.html) * [anotaciones variables](variances.html), * límites de tipado [superiores](upper-type-bounds.html) e [inferiores](lower-type-bouunds.html), diff --git a/es/tutorials/tour/traits.md b/es/tutorials/tour/traits.md index a577dc2dc5..2b277f683d 100644 --- a/es/tutorials/tour/traits.md +++ b/es/tutorials/tour/traits.md @@ -9,7 +9,7 @@ num: 24 language: es --- -_Nota de traducción: La palabra `trait` en inglés puede traducirse literalmente como `rasgo` o `caracteristica`. Preferimos la designación oringial trait por ser una característica muy natural de Scala._ +_Nota de traducción: La palabra `trait` en inglés puede traducirse literalmente como `rasgo` o `caracteristica`. Preferimos la designación original trait por ser una característica muy natural de Scala._ De forma similar a las interfaces de Java, los traits son usados para definir tipos de objetos al especificar el comportamiento mediante los métodos provistos. A diferencia de Java, Scala permite a los traits ser parcialmente implementados, esto es, es posible definir implementaciones por defecto para algunos métodos. En contraste con las clases, los traits no pueden tener parámetros de constructor. A continuación se muestra un ejemplo: @@ -19,7 +19,7 @@ A continuación se muestra un ejemplo: def isNotSimilar(x: Any): Boolean = !isSimilar(x) } -Este trait consiste de dos métodos `isSimilar` y `isNotSimilar`. Mientras `isSimilar` no provee una implementación concreta del método (es abstracto en la terminología Java), el método `isNotSimilar` define una implementación concreta. Consecuentemente, las clases que integren este trait solo tienen que proveer una implementación concreta para `isSimilar`. El comportamiento de `isNotSimilar` es directamente herdado del trait. Los traits tipicamente son integrados a una clase (u otros traits) mediante una [Composición de clases mixin](mixin-class-composition.html): +Este trait consiste de dos métodos `isSimilar` y `isNotSimilar`. Mientras `isSimilar` no provee una implementación concreta del método (es abstracto en la terminología Java), el método `isNotSimilar` define una implementación concreta. Consecuentemente, las clases que integren este trait solo tienen que proveer una implementación concreta para `isSimilar`. El comportamiento de `isNotSimilar` es directamente heredado del trait. Los traits típicamente son integrados a una clase (u otros traits) mediante una [Composición de clases mixin](mixin-class-composition.html): class Point(xc: Int, yc: Int) extends Similarity { var x: Int = xc diff --git a/es/tutorials/tour/unified-types.md b/es/tutorials/tour/unified-types.md index 4a5acf7446..08573070dc 100644 --- a/es/tutorials/tour/unified-types.md +++ b/es/tutorials/tour/unified-types.md @@ -17,6 +17,7 @@ A diferencia de Java, todos los valores en Scala son objetos (incluyendo valores La superclase de todas las clases, `scala.Any`, tiene dos subclases directas, `scala.AnyVal` y `scala.AnyRef` que representan dos mundos de clases muy distintos: clases para valores y clases para referencias. Todas las clases para valores están predefinidas; se corresponden con los tipos primitivos de los lenguajes tipo Java. Todas las otras clases definen tipos referenciables. Las clases definidas por el usuario son definidas como tipos referenciables por defecto, es decir, siempre (indirectamente) extienden de `scala.AnyRef`. Toda clase definida por usuario en Scala extiende implicitamente el trait `scala.ScalaObject`. Clases pertenecientes a la infraestructura en la cual Scala esté corriendo (ejemplo, el ambiente de ejecución de Java) no extienden de `scala.ScalaObject`. Si Scala es usado en el contexto de un ambiente de ejecución de Java, entonces `scala.AnyRef` corresponde a `java.lang.Object`. Por favor note que el diagrama superior también muestra conversiones implícitas llamadas viestas entre las clases para valores. + Aquí se muestra un ejemplo que demuestra que tanto valores numéricos, de caracteres, buleanos y funciones son objetos, tal como cualquier otro objeto: object UnifiedTypes extends App { @@ -32,7 +33,7 @@ Aquí se muestra un ejemplo que demuestra que tanto valores numéricos, de carac } } -El programa declara una aplicación `UnifiedTypes` en forma de un objeto singleton de primer nive con un método `main`. El aplicación define una variable local `set` (un conjunto), la cual se refiere a una instancia de la clase `LinkedHashSet[Any]`. El programa suma varios elementos a este conjunto. Los elementos tienen que cumplir con el tipo declarado para los elementos por el conjunto, que es `Any`. En el final, una representación en texto (cadena de caracteres, o string) es impresa en pantalla. +El programa declara una aplicación `UnifiedTypes` en forma de un objeto singleton de primer nivel con un método `main`. La aplicación define una variable local `set` (un conjunto), la cual se refiere a una instancia de la clase `LinkedHashSet[Any]`. El programa suma varios elementos a este conjunto. Los elementos tienen que cumplir con el tipo declarado para los elementos del conjunto, que es `Any`. Al final, una representación en texto (cadena de caracteres, o string) es impresa en pantalla. Aquí se muestra la salida del programa: diff --git a/es/tutorials/tour/variances.md b/es/tutorials/tour/variances.md index d0c0b75a47..255e0f9993 100644 --- a/es/tutorials/tour/variances.md +++ b/es/tutorials/tour/variances.md @@ -9,9 +9,7 @@ num: 31 language: es --- -Scala soporta anotaciones de varianza para parámetros de tipo para [clases genéricas](generic-classes.html). A diferencia de Java 5 (es decir: [JDK 1.5](http://java.sun.com/j2se/1.5/)), las anotaciones de varianza pueden ser agregadas cuando una abstracción de clase es definidia, mientras que en Java 5, las anotaciones de varianza son dadas por los clientes cuando una albstracción de clase es usada. - -In the page about generic classes an example for a mutable stack was given. We explained that the type defined by the class `Stack[T]` is subject to invariant subtyping regarding the type parameter. This can restrict the reuse of the class abstraction. We now derive a functional (i.e. immutable) implementation for stacks which does not have this restriction. Please note that this is an advanced example which combines the use of [polymorphic methods](polymorphic-methods.html), [lower type bounds](lower-type-bounds.html), and covariant type parameter annotations in a non-trivial fashion. Furthermore we make use of [inner classes](inner-classes.html) to chain the stack elements without explicit links. +Scala soporta anotaciones de varianza para parámetros de tipo para [clases genéricas](generic-classes.html). A diferencia de Java 5 ([JDK 1.5](http://java.sun.com/j2se/1.5/)), las anotaciones de varianza pueden ser agregadas cuando una abstracción de clase es definidia, mientras que en Java 5, las anotaciones de varianza son dadas por los clientes cuando una albstracción de clase es usada. En el artículo sobre clases genéricas dimos un ejemplo de una pila mutable. Explicamos que el tipo definido por la clase `Stack[T]` es objeto de subtipos invariantes con respecto al parámetro de tipo. Esto puede restringir el reuso de la abstracción (la clase). Ahora derivaremos una implementación funcional (es decir, inmutable) para pilas que no tienen esta restricción. Nótese que este es un ejemplo avanzado que combina el uso de [métodos polimórficos](polymorphic-methods.html), [límites de tipado inferiores](lower-type-bounds.html), y anotaciones de parámetros de tipo covariante de una forma no trivial. Además hacemos uso de [clases internas](inner-classes.html) para encadenar los elementos de la pila sin enlaces explícitos. @@ -36,4 +34,4 @@ En el artículo sobre clases genéricas dimos un ejemplo de una pila mutable. Ex La anotación `+T` declara que el tipo `T` sea utilizado solamente en posiciones covariantes. De forma similar, `-T` declara que `T` sea usado en posiciones contravariantes. Para parámetros de tipo covariantes obtenemos una relación de subtipo covariante con respecto al parámetro de tipo. Para nuestro ejemplo, esto significa que `Stack[T]` es un subtipo de `Stack[S]` si `T` es un subtipo de `S`. Lo contrario se cumple para parámetros de tipo que son etiquetados con un signo `-`. -Para el ejemplo de la pila deberíamos haber usado el parámetro de tipo covariante `T` en una posición contravariante para que nos sea posible definir el método `push`. Ya que deseamos que existan subtipos covariantes para las pilas, utilizamos un truco y utilizamos un parámetro de tipo abstracto en el método `push`. De esta forma obtenemos un método polimórfico en el cual utilizamos el tipo del elemento `T` como límite inferior de la variable de tipo de `push`. Esto tiene el efecto de sincronizar la varianza de `T` con su declaración como un parámetro de tipo covariante. Ahora las pilas son covariantes, y nuestra solución permite por ejemplo apilar un String en una pila de enteros (Int). El resultado será una pila de tipo `Stack[Any]`; por lo tantosolo si el resultado es utilizado en un contexto donde se esperan pilas de enteros se detectará un error. De otra forma, simplemente se obtiene una pila con un tipo más general. +Para el ejemplo de la pila deberíamos haber usado el parámetro de tipo covariante `T` en una posición contravariante para que nos sea posible definir el método `push`. Ya que deseamos que existan subtipos covariantes para las pilas, utilizamos un truco y utilizamos un parámetro de tipo abstracto en el método `push`. De esta forma obtenemos un método polimórfico en el cual utilizamos el tipo del elemento `T` como límite inferior de la variable de tipo de `push`. Esto tiene el efecto de sincronizar la varianza de `T` con su declaración como un parámetro de tipo covariante. Ahora las pilas son covariantes, y nuestra solución permite por ejemplo apilar un String en una pila de enteros (Int). El resultado será una pila de tipo `Stack[Any]`; por lo tanto solo si el resultado es utilizado en un contexto donde se esperan pilas de enteros se detectará un error. De otra forma, simplemente se obtiene una pila con un tipo más general. diff --git a/es/tutorials/tour/views.md b/es/tutorials/tour/views.md index db156b4a03..acb1a876de 100644 --- a/es/tutorials/tour/views.md +++ b/es/tutorials/tour/views.md @@ -35,9 +35,9 @@ La función `list2ordered` puede ser también expresada con el uso de un _límit implicit def list2ordered[A <% Ordered[A]](x: List[A]): Ordered[List[A]] = ... -El compilador de Scala que genera después genera el código equivalente a la definición de `list2ordered` vista anteriormente. +El compilador de Scala genera código equivalente a la definición de `list2ordered` vista anteriormente. -El objeto `scala.Predef` importado implicitamente declara varios tipos predefinidos (ej. `Pair`) and métodos (ej. `assert`) pero también varias vistas. El siguiente ejemplo muestra una idea de la vista predefinida `charWrapper`: +El objeto `scala.Predef` importado implicitamente declara varios tipos predefinidos (ej. `Pair`) y métodos (ej. `assert`) pero también varias vistas. El siguiente ejemplo muestra una idea de la vista predefinida `charWrapper`: final class RichChar(c: Char) { def isDigit: Boolean = Character.isDigit(c) diff --git a/es/tutorials/tour/xml-processing.md b/es/tutorials/tour/xml-processing.md index abb605016a..7edc6788b4 100644 --- a/es/tutorials/tour/xml-processing.md +++ b/es/tutorials/tour/xml-processing.md @@ -12,9 +12,9 @@ language: es Scala ha sido usado para crear, parsear y procesar de forma fácil documentos XML. Datos XML pueden ser representados en Scala tanto usando una representación genérica, o con una representación específica. Este último es soportado por la herramienta de *data-binding* `schema2src`. ### Representación en ejecución ### -Los datos en XML son representados como árboles etiquetados. A partir de Scala 1.2 (versiones previas debían usar la opción -Xmarkup), te es posible crear convenientemente tales nodos etiquetados utilizando sintaxis XML. +Los datos en XML son representados como árboles etiquetados. A partir de Scala 1.2 (versiones previas debían usar la opción -Xmarkup), es posible crear convenientemente tales nodos etiquetados utilizando sintaxis XML. -Considera la siguiente documento XMl: +Considera el siguiente documento XMl: @@ -57,5 +57,6 @@ Es posible mezclar expresiones Scala y XML: ### Data Binding ### -En muchos casos se tiene un DTD para los documentos XML que se quieren procesar. En este caso se quiere crear clases especiales para esto, y algo de código para parsear y guardar el XML. Scala tiene una ingeniosa herramienta que transofrma tus DTDs en una colección de definiciones de clases en Scala que hacen todo el trabajo por ti. -La documentación y ejemplos para la herramienta `schema2src` pueden ser hallados en el libro de Burak [draft scala xml book](http://burak.emir.googlepages.com/scalaxbook.docbk.html). +En muchos casos se tiene un DTD para los documentos XML que se quieren procesar. En este caso se quieren crear clases especiales para esto, y algo de código para parsear y guardar el XML. Scala tiene una ingeniosa herramienta que transforma tus DTDs en una colección de definiciones de clases en Scala que hacen todo el trabajo. + +La documentación y ejemplos para la herramienta `schema2src` se pueden encontrar en el libro de Burak [draft scala xml book](http://burak.emir.googlepages.com/scalaxbook.docbk.html).