2017-04-25 12 views
1

シンプルなコードを書くことでスカラーを学び始めます。スカラーのメソッド内で関数を呼び出すと、予期しない結果が発生する

私は以下のコードの動作について少し混乱しています。 )(testFunsを呼び出し、出力は以下のようである場合、

INCRが

ADDが私の理解当たり

、機能を起動起動

class BasicUsage { 
    private val incr = (x: Int) => 
    { 
     println("incr invoked") 
     x + 1 
    } 
    private val add = (x: Int, y: Int) => 
    { 
     println("add invoked") 
     if (x == 0 || y == 0) { 
     0 
     } else { 
     x + y 
     } 
    } 

    def testFuns(): Unit = 
    println(add(1,2)) 
    println(incr(5)) 

} 

最初にadd()を呼び出すと、incr()を呼び出す必要があります。

上記のコードで間違いはありますか? 関数とメソッドの使い方を誤解していますか?

おかげで非常に多く、

答えて

4

あなたのtestFuns方法で中括弧が欠落している:

def testFuns(): Unit = 
    println(add(1,2)) 
    println(incr(5)) 

これはtestFuns()は一つだけ最初の文が含まれていることを意味しますのprintln(追加(1,2) )。 2番目のステートメントはclassに属し、一度BasicUsageがインスタンス化されます。修正するには:

def testFuns(): Unit = { 
    println(add(1,2)) 
    println(incr(5)) 
} 
+0

はい、そうです。私の問題は解決しました。 私はスカラの使用法をPythonと混合しました。 – Jared

+0

通常、中括弧はオプションです。なぜならコンパイラは関数の返り値を推測することができるからです。しかし、コンパイラは 'Unit'型を探して' println(add(1,2)) 'をすぐに取得し、関数。 あなたが書いたものは、 'def testFuns():Unit = println(add(1,2));と同じです。 println(incr(5)) ' – nonconvergent

+1

"コンパイラは関数がどこで返されるのかを推測できるのでコンパイラはユニット型のハンティングをしてすぐに「いいえ、これは完全に間違っています。この部分は型が考慮されるずっと前に起こります。中括弧なしでは、関数の本体として1つの式しか使用されません(実際には中カッコで囲まれています;一連の式を1つの式にするためのScala構文です)。 –

関連する問題