2012-05-12 19 views
6

Tengo una clase de caso que tiene algunos parámetros para su constructor, y defino un objeto de clase acompañante que define un constructor alternativo que toma un conjunto diferente de argumentos, de este modo:Error aparentemente espurio "no toma argumentos" con constructor de clase de caso

case class MyClass (c: Char, mc: List[MyClass]) 

object MyClass { 
    def apply(c: Char, mc: MyClass): MyClass = { 
    MyClass(c, List(mc)) 
    } 
} 

Quiero usar el constructor original de la clase caso en un foldRight:

object SomeStuff { 
    def problem (s: String) { 
    assert(!s.isEmpty) 

    val zero = MyClass('a', Nil) 

    val mc2 = "Pillsy Pillsy Pillsy" foldRight(zero) { 
     MyClass(_, List(_)) 
    } 
    } 
} 

Cuando hago esto, me sale un mensaje de error del compilador: "MiClase no toma parámetros ". Si hago un comentario en la sección val mc2 = ..., este problema desaparece, pero MyClass está tomando claramente los parámetros en la definición de zero. Siento que debo estar perdiendo algo realmente básico, pero no tengo idea de qué se trata. He intentado un par de soluciones, como definir un método de ayuda o un valor de función para usar como el segundo argumento de foldRight, pero nada de eso ayuda, lo cual no es demasiado sorprendente ya que básicamente estoy hurgando aleatoriamente.

Respuesta

5

En primer lugar, foldRight toma dos argumentos, por lo que no puede utilizar la notación de operador (en su forma actual), pero se puede:

("foo" foldRight zero) { ... } 

o, alternativamente,

("foo" :\ zero) { ... } 

En segundo lugar, { MyClass(_, List(_)) } desagregará en

{ x => MyClass(x, y => List(y)) } 

entonces, usted debe nombrar un rguments y utilizar new palabra clave para asegurar que se llama al constructor en lugar de apply método:

"Pillsy Pillsy Pillsy".foldRight(zero) { (c, mc) => 
    new MyClass(c, List(mc)) 
} 

o utilizar suplementario método apply si quieres ir con guiones:

"Pillsy Pillsy Pillsy".foldRight(zero) { MyClass(_, _) } 
Cuestiones relacionadas