2017-09-20 9 views
0

=を使用していても、次の両方の関数定義はコンパイルされません。どうして?この動作の利点はありますか?なぜScalaでdefで省略可能なのですか

デフ1

def doWork(index:Int) = { 
     sleep((math.random*1000).toLong); 
     index; 
    } 

DEF 2

def doWork(index:Int) { 
     sleep((math.random*1000).toLong); 
     index; 
    } 
+1

[Scastie](https://scastie.scala-lang.org/)でいくつかのテストを行ってください。あなたのdef 2(プロシージャ構文)はDottyコンパイラでは現在サポートされておらず、Scala 3にも残っていません。 – jwvh

答えて

1

=符号を含めない

おかげでprocedureを宣言します。プロシージャはUnitを返します。つまり、値を返しません。 Scala言語仕様(上のリンクから)で説明されているように:

プロシージャ定義は、結果の型と等号が省略された関数定義です。その定義式はブロックでなければなりません。たとえば、def f(ps) {stats}def f(ps): Unit = {stats}に相当します。あなたの第2のケースで

、戻り値は単にUnitを返すプロシージャにIntを返す関数を有効に抑制します。そうすることが、コンパイラはこれを使用すると、怪しい何かが起こっていることを知らせる必要があります

warning: a pure expression does nothing in a statement position 

への警告と同様のを発行する必要があり、すなわち、通常は値を返すブロックにつながるステートメントがあります(index;であなたのケース)、それは未使用になります。

2

デフ1には、使用したいものです。

DEF 2は、プロシージャ構文(落胆)と呼ばれ、実際にこれを意味している。

def doWork(index:Int): Unit = { 
    sleep((math.random*1000).toLong) 
    index 
} 

(それは何も返さないので)だから、それはあなたが望むものを、今はおそらくです。

1

defで"="を使用しないと、定義した関数がユニットを返すことを意味します。

第2の関数では、"="を使用しません。つまり、定義された関数はユニットを返しますが、関数はindexを返します。 これは、単位を期待して警告をスローし、値を破棄する理由です。

+0

いいえ、それはエラーではなく警告を出します。 –

+0

はい、回答を編集しました。 –

関連する問題