¿Cuál es la diferencia entre el patrón constructor y el patrón de enlace variable en la expresión de coincidencia SCALA? -- scala campo con pattern-matching campo con case-class camp Relacionados El problema

What is difference between Constructor pattern and variable binding pattern in scala match expression?


1
vote

problema

Español

En Scala, estoy tratando de entender la coincidencia de patrones, sin embargo, la mayoría de los patrones son explicativos, pero el patrón constructor y el patrón de unión variable se ven confusos para mí. Intenté seguir el ejemplo de la programación Scala, 2ed

  #main {     position: absolute;     width:100%;     top: 0px;     left: 0px;     overflow: hidden; }  .splash {      height: 100vh;      width: 100vw;     float: left;  }  #p1 {     position: absolute;     left: 0px;     top: 0px;      background: black;     background-image: url(img/bgic-fd.png);     background-size: cover; }  #p2 {     background: black; }  #p3 {     z-index: 500;     background: green; } #ting {      position: absolute;     top:25vh;      height: 150vh; }  #arrow {     fill: #fec44a; }  #welcomediv {     position: absolute;     left: 50vw;     top: 150px;     margin-left: -15vw;     z-index: 50;     width: 30vw; }  #welcomediv img {     width: 100%; } 4  

Quiero saber cuándo usar el patrón constructor

  #main {     position: absolute;     width:100%;     top: 0px;     left: 0px;     overflow: hidden; }  .splash {      height: 100vh;      width: 100vw;     float: left;  }  #p1 {     position: absolute;     left: 0px;     top: 0px;      background: black;     background-image: url(img/bgic-fd.png);     background-size: cover; }  #p2 {     background: black; }  #p3 {     z-index: 500;     background: green; } #ting {      position: absolute;     top:25vh;      height: 150vh; }  #arrow {     fill: #fec44a; }  #welcomediv {     position: absolute;     left: 50vw;     top: 150px;     margin-left: -15vw;     z-index: 50;     width: 30vw; }  #welcomediv img {     width: 100%; } 5  

y cuándo usar el patrón de unión variable

  #main {     position: absolute;     width:100%;     top: 0px;     left: 0px;     overflow: hidden; }  .splash {      height: 100vh;      width: 100vw;     float: left;  }  #p1 {     position: absolute;     left: 0px;     top: 0px;      background: black;     background-image: url(img/bgic-fd.png);     background-size: cover; }  #p2 {     background: black; }  #p3 {     z-index: 500;     background: green; } #ting {      position: absolute;     top:25vh;      height: 150vh; }  #arrow {     fill: #fec44a; }  #welcomediv {     position: absolute;     left: 50vw;     top: 150px;     margin-left: -15vw;     z-index: 50;     width: 30vw; }  #welcomediv img {     width: 100%; } 6  

¡Siempre estoy confundido mientras se trata de la coincidencia de patrones?

Original en ingles

In Scala I am trying to understand pattern matching ,however most of the patterns are self explanatory but constructor pattern and variable binding pattern looks confusing to me . I tried following example from Programming Scala ,2ed

case class Address(street: String, city: String, country: String) case class Person(name: String, age: Int, address: Address)   object ScalaCaseDemoMain extends App{      val alice   = Person("Alice",   25, Address("1 Scala Lane", "Chicago", "USA"))     val bob     = Person("Bob",     29, Address("2 Java Ave.",  "Miami",   "USA"))     val charlie = Person("Charlie", 32, Address("3 Python Ct.", "Boston",  "USA"))      for (person <- Seq(alice, bob, charlie)) {     person match {         case p @ Person("Alice", 25, address) => println(s"Hi Alice! $p")         case p @ Person("Bob", 29, a @ Address(street, city, country)) =>         println(s"Hi ${p.name}! age ${p.age}, in ${a.city}")         case p @ Person(name, age, _) =>       println(s"Who are you, $age year-old person named $name? $p")   } }      } 

I want to know when to use constructor pattern

case Person("Alice", 25, address) => //some action here 

and when to use variable binding pattern

case p @ Person("Alice", 25, address) //some action here 

I am always confused while It comes to pattern matching ?

        

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Constructor vs Extractor

El patrón que llame constructor se encuentra en la mayoría de los casos, se llama Extractor o Deconstructor . Es como un constructor invertido, ya que puede ver con el método que llama unapply .

Si se produciría en el lado derecho o fuera del pattern match , sería como se señaló en un Constructor .

Respuesta

@ Se usa solo en pattern matching para enlazar la entidad deconstruida a una variable. Su propósito es suministrar la opción de capturar toda la expresión y aún así poder usar valores extraídos en pasos posteriores.

Así que siempre habría una manera de organizar el código de una manera que no necesitaría usar @ , pero podría ayudar a la legibilidad mucho.

Ejemplo

Un ejemplo de uso para @ es: Desea enviar un correo a todas las personas llamadas "Alice" que son mayores que "21", pero la dirección no es un criterio de selección importante .

  case p @ Person("Alice", age, _) if age > 21 => storePersonForMailing(p)   

Aquí, la coincidencia del patrón muestra claramente su intención al hacer hincapié en los valores que utiliza para la selección y, a medida que necesita la dirección más adelante para enviar el correo, no sería una buena idea de soltarlo.

 

Constructor vs Extractor

The pattern you call constructor is in most cases called an Extractor or Deconstructor. It is like a reversed constructor as you can see by the method it calls unapply.

If it would occur on the right hand side or outside the pattern match it would be as you noted a Constructor.

Answer

@ only is used in pattern matching to bind the deconstructed entity to a variable. It's purpose is to supplies the option to catch the whole expression and still be able to use extracted values in later steps.

So there would always be a way to arrange the code in a way that you would not need to use @ but it could help readability a lot.

Example

An usage example for @ is: You want to send a mail to all Persons named "Alice" which are older than "21" but the address is no important selection criterium.

case p @ Person("Alice", age, _) if age > 21 => storePersonForMailing(p) 

Here the pattern match shows clearly your intention by stressing the values you use for the selection and as you need the address later for sending the mail it would be no good idea to drop it.

 
 
 
 

Relacionados problema

3  Clase de casos serializando con mezcla de rasgos usando JSON4S  ( Serializing case class with trait mixin using json4s ) 
Tengo una clase de caso Game No tengo problemas para serializar / deserializar usando > JSON4S . case class Game(name: String,publisher: String,website: ...

3  Scala inmutabilidad en almacenamiento persistente con screyl  ( Scala immutability in persistent storage with squeryl ) 
Entonces, como estoy leyendo la jugar para Scala libro, vine A través de algo extraño que se explicó en el libro. Este es el fragmento relevante: Hay alg...

6  ¿Es posible usar Scalap de un script SCALA?  ( Is it possible to use scalap from a scala script ) 
Estoy usando scalap Para leer los nombres de campo de algunas clases de casos (como se discutió en esta pregunta ). Tanto las clases de casos como el códig...

1  ¿Puedo usar tipos abstractos en la coincidencia de clases de casos?  ( Can i use abstract types in matching of case classes ) 
O, en otras palabras: ¿Puedo verificar con coincidir si los elementos en una tupla son de la misma clase de caso, a pesar de tener valores diferentes en sus c...

8  Cambiar nombre y anular el método igual en caso de clase  ( Rename and override equals method in case class ) 
Quiero definir un rasgo llamado Ext que cambia el método equals61 existente en equalsByAttributes y define un nuevo equals Método al mismo tiempo. Se ...

2  Herencia del producto en las clases de casos  ( Product inheritance in case classes ) 
Tengo algunas clases de casos que extienden una superclase común y me gustaría acceder a los campos de la superclase utilizando el método productElement5 (h...

0  Serialización de clase de caso en chispa  ( Case class serialization in spark ) 
en una aplicación de chispa (Spark 2.1) Estoy tratando de enviar una clase de casos como parámetro de entrada de una función que está destinada a ejecutarse e...

4  Cómo compartir el comportamiento en las clases de casos en Scala  ( How to share behavior over case classes in scala ) 
Implementar mi modelo de dominio en Scala usando clases de casos que tengo abstract class Entity { val _id: Option[BSONObjectID] val version: Optio...

2  Convertir clases de casos anidados a mapas anidados en Scala  ( Convert nested case classes to nested maps in scala ) 
Tengo dos clases de casos anidados: case class InnerClass(param1: String, param2: String) case class OuterClass(myInt: Int, myInner: InnerClass) val x = Ou...

1  SCALA - Aplique Normas de insuficiencia  ( Scala apply unapply rules ) 
Me pregunto si hay una regla o más bien una "mejor práctica" en Scala para anular la aplicación / insuficiencia. Estoy interesado en particular si es una buen...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos