13

私は次の方法を持っています:

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 で同じことを達成しようとしていますが、次のような構文エラーが発生します。

(デフォルト値なしで、これは問題なくコンパイルされます)

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 + "!"}
                                              ^

何か案が?

4

1 に答える 1

7

これを行う方法はありません。あなたが得ることができる最高のものは、両方を拡張するオブジェクトでFunction1ありFunction0、適用メソッドがFunction0デフォルトパラメータで他の適用メソッドを呼び出す場所です。

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

このような関数がより頻繁に必要な場合は、デフォルトの apply メソッドを次の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)
}
于 2012-10-07T18:16:07.813 に答える