2017-12-14 1 views
0

このコードを実行すると 1)var b:Int = _。その端末上で正常に動作していますvar b:int = _はコンパイルエラーを返します

しかし、IDEで実行すると、コンパイルエラーが発生します。 ここに何か不足していますか?

+0

エラーは何ですか? – pamu

+0

ローカル変数を初期化する必要があります –

答えて

4

注:変数のデフォルトの初期化は、クラスまたはオブジェクト内で機能しますが、関数(ローカル変数)では機能しません。あなたは、クラス内でこれを使用するか、オブジェクト

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

object Bar { 
var i: Int = _ 
} 

// Exiting paste mode, now interpreting. 

defined object Bar 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

class Foo { 
var i: Int = _ 
} 

// Exiting paste mode, now interpreting. 

defined class Foo 

オブジェクトへの[OK]を関数の内部で

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

def foo(a: Int): Int = { 
var b: Int = _ 
a 
} 

// Exiting paste mode, now interpreting. 

<pastie>:12: error: local variables must be initialized 
     var b: Int = _ 
     ^

をデフォルト値の初期化を使用しようとしている

なぜそれがREPLで動作するのですか?

scala> var i: Int = _ 
i: Int = 0 

REPLプロンプトに直接書き込まれたものはすべて、デフォルトでオブジェクトによってラップされます。そのため、REPLではこのエラーは発生しません。

この主張を証明するために、デフォルトでREPLに書かれているものはオブジェクトによって包まれています。コンテキスト内の現在のオブジェクトを参照するthisを使用して小さな関数を書くことができます。

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

def experiment(): Unit = println(s"${this.getClass}") 
experiment() 

// Exiting paste mode, now interpreting. 

class $line13.$read$$iw$$iw$ 
experiment:()Unit 

クール!できます。コードがこのコンテナで囲まれています$line13.$read$$iw$$iw$

関連する問題