This commit is contained in:
Pablo 2019-06-06 16:14:06 +02:00
parent 3b7b38ec34
commit a2c6510c23

View File

@ -442,101 +442,102 @@ object Perro {
// A menudo tienen pocos métodos, y los métodos raramente tienen efectos secundarios. // A menudo tienen pocos métodos, y los métodos raramente tienen efectos secundarios.
case class Persona(nombre: String, telefono: String) case class Persona(nombre: String, telefono: String)
// Create a new instance. Note cases classes don't need "new" // Para crear instancia nuevas, observa que las case clases no necesitan "new"
val george = Persona("George", "1234") val george = Persona("George", "1234")
val kate = Persona("Kate", "4567") val kate = Persona("Kate", "4567")
// With case classes, you get a few perks for free, like getters: // Con las case clases tienes unas pocas ventajas, como el acceso a los campos:
george.phoneNumber // => "1234" george.telefono // => "1234"
// Per field equality (no need to override .equals) // Para la igualdad de campos no necesitas sobreescribir el método equals
Person("George", "1234") == Person("Kate", "1236") // => false Persona("George", "1234") == Persona("Kate", "1236") // => false
// Easy way to copy // Manera fácil de copiar
// otherGeorge == Person("George", "9876") // otroGeorge == Persona("George", "9876")
val otherGeorge = george.copy(phoneNumber = "9876") val otroGeorge = george.copy(telefono = "9876")
// And many others. Case classes also get pattern matching for free, see below. // Y muchas otras. Las case clases también tienen comparación de patrones, que veremos más abajo.
// Traits // Traits
// Similar to Java interfaces, traits define an object type and method // De manera similar a las interfaces Java, los traits definen un tipo de objeto y métodos.
// signatures. Scala allows partial implementation of those methods. // Scala permite la implementación parcial de dichos métodos.
// Constructor parameters are not allowed. Traits can inherit from other // No se permiten parámetros de constructor. Los traits pueden heredar de otros traits o
// traits or classes without parameters. // clases sin parámetros.
trait Dog { trait Perro {
def breed: String def raza: String
def color: String def color: String
def bark: Boolean = true def ladra: Boolean = true
def bite: Boolean def muerde: Boolean
} }
class SaintBernard extends Dog { class SanBernardo extends Perro {
val breed = "Saint Bernard" val raza = "San Bernardo"
val color = "brown" val color = "marrón"
def bite = false def muerde = false
} }
scala> b scala> b
res0: SaintBernard = SaintBernard@3e57cd70 res0: SanBernardo = SanBernardo@3e57cd70
scala> b.breed scala> b.raza
res1: String = Saint Bernard res1: String = San Bernardo
scala> b.bark scala> b.ladra
res2: Boolean = true res2: Boolean = true
scala> b.bite scala> b.muerde
res3: Boolean = false res3: Boolean = false
// A trait can also be used as Mixin. The class "extends" the first trait, // Un trait tambien puede ser usado mezclado con otros traits.
// but the keyword "with" can add additional traits. // La clase extiende el primer trait, pero la palabra "with"
// puede añadir traits adicionales.
trait Bark { trait Ladra {
def bark: String = "Woof" def ladra: String = "Guau"
} }
trait Dog { trait Perro {
def breed: String def raza: String
def color: String def color: String
} }
class SaintBernard extends Dog with Bark { class SanBernardo extends Perro with Ladra {
val breed = "Saint Bernard" val raza = "San Bernardo"
val color = "brown" val color = "marrón"
} }
scala> val b = new SaintBernard scala> val b = new SanBernardo
b: SaintBernard = SaintBernard@7b69c6ba b: SanBernardo = SanBernardo@7b69c6ba
scala> b.bark scala> b.ladra
res0: String = Woof res0: String = Guau
///////////////////////////////////////////////// /////////////////////////////////////////////////
// 6. Pattern Matching // 6. Comparación de patrones
///////////////////////////////////////////////// /////////////////////////////////////////////////
// Pattern matching is a powerful and commonly used feature in Scala. Here's how // La comparación de patrones es una poderosa función de Scala.
// you pattern match a case class. NB: Unlike other languages, Scala cases do // Ahora veremos como comparar patrones en una case clase.
// not need breaks, fall-through does not happen. // Nota: A diferencia de otros lenguajes, Scala "cases" no necesitan
// "break", porque no ejecuta los "case" posteriores.
def matchPerson(person: Person): String = person match { def comparaPersona(persona: Persona): String = persona match {
// Then you specify the patterns: // Aqui especificas los patrones:
case Person("George", number) => "We found George! His number is " + number case Persona("George", telefono) => "Hemos encontrado a George! Su número es " + telefono
case Person("Kate", number) => "We found Kate! Her number is " + number case Persona("Kate", telefono) => "Hemos encontrado a Kate! Su número es " + telefono
case Person(name, number) => "We matched someone : " + name + ", phone : " + number case Persona(nombre, telefono) => "Hemos encontrado alguien : " + nombre + ", teléfono : " + telefono
} }
// Regular expressions are also built in. // Las expresiones regulares también están incorporadas.
// Create a regex with the `r` method on a string: // Creas una expresión regular con el método `r` en una cadena:
val email = "(.*)@(.*)".r val email = "(.*)@(.*)".r
// Pattern matching might look familiar to the switch statements in the C family // La comparación de patrones puede parecerse al bloque switch en la familia de lenguajes de C,
// of languages, but this is much more powerful. In Scala, you can match much // pero aquí es mucho más poderosa. En Scala, puedes hacer más comparaciones:
// more: def comparaTodo(obj: Any): String = obj match {
def matchEverything(obj: Any): String = obj match { // Puedes comparar valores:
// You can match values: case "Hola mundo" => "Tengo la cadena Hola mundo"
case "Hello world" => "Got the string Hello world"
// You can match by type: // Puedes comparar tipos:
case x: Double => "Got a Double: " + x case x: Double => "Tengo un double: " + x
// You can specify conditions: // Puedes especificar condiciones:
case x: Int if x > 10000 => "Got a pretty big number!" case x: Int if x > 10000 => "Tengo un número muy grande!"
// You can match case classes as before: // You can match case classes as before:
case Person(name, number) => s"Got contact info for $name!" case Person(name, number) => s"Got contact info for $name!"