2012-10-07 44 views
10

我有以下方法:阶:定义一个函数(VAL)默认参数VS采用的方法(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! 

我试图实现与VAL相同的,但我得到一个语法错误,如:

(没有默认值,这个编译OK)

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

(但我无法得到这个编译...)

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

有什么想法?

回答

5

没有办法做到这一点。您可以获得的最好的对象是扩展了Function1Function0的对象,其中Function0的应用方法使用默认参数调用其他应用方法。

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

如果你需要这样的功能更多的时候,你可以将默认的应用方法引入一个抽象类DefaultFunction1这样的:

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

功能1与Function0是很聪明,但我会说这是有点臭。只有我的意见在这里。没有讨论的意图。 :) – pedrofurla

+1

顺便说一句,你可以使用糖的函数:'new(String => String)(()=> String){override def apply = apply(“default”);重写def apply(x:String)= x +“!” '工作。 – pedrofurla

+0

我同意这有点臭,但我没有看到没有的解决方案。 –

相关问题