2012-10-07 32 views
10

tengo el siguiente método:Scala: definir los parámetros por defecto en una función (val) vs utilizando un método (DEF)

scala> def method_with_default(x: String = "default") = {x + "!"} 
method_with_default: (x: String)java.lang.String 

scala> method_with_default() 
res5: java.lang.String = default! 

scala> method_with_default("value") 
res6: java.lang.String = value! 

que estoy tratando de lograr lo mismo con una val, pero me da una error de sintaxis, así:

(sin valor predeterminado, éste compila bien)

scala> val function_with_default = (x: String) => {x + "!"} 
function_with_default: String => java.lang.String = <function1> 

(pero no pude conseguir éste para compilar ...)

scala> val function_with_default = (x: String = "default") => {x + "!"} 
<console>:1: error: ')' expected but '=' found. 
     val function_with_default = (x: String = "default") => {x + "!"} 
              ^

alguna idea?

Respuesta

5

No hay forma de hacerlo. Lo mejor que puede obtener es un objeto que se extiende tanto Function1 como Function0 donde el método aplicar de Function0 llama al otro método de aplicación con el parámetro predeterminado.

val functionWithDefault = new Function1[String,String] with Function0[String] { 
    override def apply = apply("default") 
    override def apply(x:String) = x + "!" 
} 

Si necesita este tipo de funciones con mayor frecuencia, se puede factorizar el valor por defecto aplicar el método en una clase abstracta DefaultFunction1 así:

val functionWithDefault = new DefaultFunction1[String,String]("default") { 
    override def apply(x:String) = x + "!" 
} 

abstract class DefaultFunction1[-A,+B](default:A) 
       extends Function1[A,B] with Function0[B] { 
    override def apply = apply(default) 
} 
+0

Función1 con Function0 es muy inteligente, pero yo diría que es un poco apestoso Solo mi opinión aquí. Ninguna discusión fue intencionada. :) – pedrofurla

+1

BTW puede usar los azúcares para funciones: 'new (String => String) con (() => String) {override def apply = apply (" default "); anular def aplicar (x: String) = x + "!" } 'funciona. – pedrofurla

+0

Estoy de acuerdo que es un poco apestoso, pero no veo una solución que no lo sea. –

Cuestiones relacionadas