2012-10-07 17 views
10

Ich habe die folgende Methode definieren:scala: Standardparameter in einer Funktion (val) vs mit einer Methode (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! 

Ich versuche, das gleiche mit einem val zu erreichen, aber ich bekomme eine Syntaxfehler, wie folgt aus:

(ohne Standardwert, dieser kompiliert ok)

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

(aber ich konnte nicht dieses zu kompilieren ...)

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

eine Idee?

Antwort

5

Es gibt keine Möglichkeit, dies zu tun. Das Beste, was Sie erhalten können, ist ein Objekt, das sowohl Function1 als auch Function0 erweitert, wobei die Methode apply von Function0 die andere Methode apply mit dem Standardparameter aufruft.

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

Wenn Sie öfter solche Funktionen benötigen, können Sie die Standard-Methode apply in eine abstrakte Klasse DefaultFunction1 wie dieser Faktor aus:

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

Function1 mit Function0 sehr clever ist, aber ich würde sagen, es ist ein bisschen stinkend. Nur meine Meinung hier. Keine Diskussion beabsichtigt. :) – pedrofurla

+1

BTW Sie können den Zucker für Funktionen verwenden: 'new (String => String) mit (() => String) {override def apply = apply (" default "); überschreiben def anwenden (x: String) = x + "!" } 'funktioniert. – pedrofurla

+0

Ich stimme zu, es ist ein bisschen stinkend, aber ich sehe keine Lösung, die nicht ist. –

Verwandte Themen