2017-12-15 35 views
0

デフォルト変数を使用するメソッドを定義しました。 この変数の値の有無にかかわらずメソッドを呼び出すと、すべてが正常に機能します。スカラ関数変数:デフォルト値を使用する(関数定義または変数定義で定義する)

しかし、メソッドを関数変数に割り当てると、パラメータなしで呼び出すことはできません。

def main(args: Array[String]) : Unit = { 
    doStuff(5) 
    doStuff() 
    val f : (Int => Unit) = doStuff 
    f(5) 
    f() //compiler error: not enough arguments for method apply: (v1: Int)Unit in trait Function1. Unspecified value parameter v1. 
    } 

    def doStuff(x : Int = 5) : Unit = { 
    println(x) 
    } 

しかし、私はより多くのcoplex例えばこれを必要になります。

この例では、動作を示しています。関数のデフォルト値を使用するために関数変数を取得できますか?doStuff?関数変数に別の型を使用する必要がありますか?

また、関数変数fに別のデフォルト変数を定義することはできますか?

+0

は '、それは完全に異なるものである方法です。 'f'は関数です。メソッドと関数の違いの1つは、メソッドがデフォルト値でオプションのパラメータを持つことができ、関数ではできないことです。 –

+0

@JörgWMittagok、それで私が望むものを達成することはできませんか?関数の "デフォルト値"はいくつかのチュートリアルで言及されているので、用語はもっと多くの人々を混乱させると思います。私はそれを受け入れることができるようにあなたのコメントを答えとして使用しますか? –

答えて

0

匿名関数を定義するf関数では、渡すInt引数のデフォルト値はどこにありますか?何が起こるかは、コンパイラがあなたに適用メソッドを提供し、この適用メソッドが引数としてデフォルト以外のIntを取っていることです。

はおそらく、あなたのよう無名関数を拡張することができます:

val func1 = new Function1[Int, Unit] { 
    def apply(x: Int = 5) = println(x) 
    } 

しかし、たとえそれが機能1の形質について適用されませんデフォルト値としてコンパイル障害になります!ここで

0

は、あなたが望むものはおそらくです:doStuff`は関数ではありません

val f = new Function1[Int, Unit] { 
    def apply(x: Int) = doStuff(x) 
    def apply() = doStuff() 
    }