1

たとえば、この関数を書くと:

def function1() : Unit = {            
 aVar = myList.map { ( s :Something ) => (s.id, s.name) } toList
 function2()
}

def function2() : Unit = {
   //bla
}

コンパイラは、 expected but foundfunction2と言って呼び出すと不平を言います。必要なものがどこから来たのかわかりません。IntUnitInt

さて、function1次のように書くと、コンパイルして、期待どおりに動作します。

def function1() : Unit = {            
     aVar = myList.map { ( s :Something ) => (s.id, s.name) } toList
     var x = function2()
}

どうして!!!!????に割り当てるだけで動作function2var変わりますか?? まずfunction2、返すように定義されていUnitます...

次に、さらに複雑になります。次の 2 つのfunction1定義のいずれも完全に機能します。

def function1() : Unit = {            
         aVar = myList.map { ( s :Something ) => (s.id, s.name) }.toList
         function2()
    }

def function1() : Unit = {            
         aVar = (myList.map { ( s :Something ) => (s.id, s.name) } toList)
         function2()
    }

ドットの代わりにスペースを入れると危険な場合があるように見えますが、その理由はわかりません。

4

1 に答える 1

4

.scalaの代わりにスペースを使用する場合は、次のように 1 つのパラメーター関数で使用することをお勧めします。

myObject itsFunction param

したがって、 myMap と入力するtoListと、コンパイラは引き続きパラメーターを待機し、次のコード行から取得しますが、入力myMap.toListすると何も待機せず、 function2 を独立した命令と見なします。function2の結果をに代入する場合もまったく同じですvar。コンパイラはvar宣言を確認するとすぐに、前のステートメントが閉じられていることを認識し、パラメーターを必要としなくなります。

toListここで、コンパイラーが必要としないパラメーターは何なのか疑問に思うはずです。実際には、 a をtoList返し、メソッドListList持っていapplyます...そして、それこそまさにコンパイラーが待っているものです:Listの apply メソッドのパラメーターです。

たぶん、この REPL セッションはあなたを助けるでしょう:

scala> Map(1 -> 2) toList 0
res0: (Int, Int) = (1,2)
于 2012-05-31T06:20:18.920 に答える