2011-09-01 14 views

Respuesta

7

¿Qué pasa con esto?

def m(a: A) = a match { 
    case b: B => print("B") 
    case c: C => print("C") 
} 

Solo estoy preguntando porque no solicitó más funciones que esta.

EDITAR

Esto podría ayudar:

object Dog { 
    def apply(name: String)(size: Int) = new Dog(name)(size) 
    def unapply(dog: Dog) = Some(dog.name, dog.size) 
} 
class Dog(val name: String)(var size: Int) 

Ahora puede crear perros ya sea como esto:

new Dog("Snoopy")(10) 

o como esto:

Dog("Snoopy")(10) 

Pero cuando el patrón coincide en perros, el patrón del constructor es no al curry.

Dog("Snoopy")(10) match { 
    case Dog(a, b) => // do sth with a or b 
} 
+0

Su primer ejemplo funcionaría, pero no podría acceder a B.a y B.b en la declaración de caso sin hacer una fea edición de tipos. Además, en su edición, no estoy seguro de entender por qué el patrón del constructor no está cursado. ¿Es porque no aplica? –

+0

Para ser sincero, no tengo idea de por qué funciona. Me tropecé con el ensayo y error. Ciertamente se menciona en alguna parte en la especificación de Scala. Es posible que desee buscarlo si es relevante en su caso. – agilesteel

+1

Sí, el patrón que utiliza en una declaración de caso es el que proporciona el resultado de la función de no aplicación. Nunca puede ser curry. La sección correspondiente en la especificación scala es §8.1.8 – Nicolas

2

Puede utilizar una clase de caso normal y simplemente definir un método de fábrica con más de una lista de parámetros.

+0

Puede ser que podamos agregar que el método de fábrica no se puede caleear 'apply' si se declara en el objeto complementario (ya que tendrá el mismo borrado que e uno declarado gracias a la clase de caso). – Nicolas

11

Si nos fijamos en la firma de la función de cancelar la aplicación creada para la clase B, se verá que es: unapply(x$0: Q): Option[Int]. Por lo tanto, la función de no aplicación funciona con el primer rango de parámetros de las clases de casos.

Se confirma por la especificación Scala (§5.3.2):

Los parámetros formales en la sección de parámetros primera fi de una clase caso son llamados elementos; ellos son tratados especialmente. Primero, el valor de tal parámetro se puede extraer como un campo de un patrón de constructor.

Afirma claramente que solo la primera sección de parámetros está disponible a través del extractor.

varias soluciones:

  • uncurry sus parámetros
  • utilizar un patrón de coincidencia con el protector si desea probar los 2 valores: case [email protected](3) if x.b == "bazinga" => ...
  • utilizar una clase normal y definir su propio objeto acompañante con su propio aplicar/desaplicar
Cuestiones relacionadas