2016-10-04 4 views
0

Javaでは、クラスフィールドは、クラス内のどこからでもアクセス可能な変数として理解されています。そのような種類のインスタンスは、インスタンスの状態構造を記述します。 Javaフィールドでは、どのメソッドの外にも定義されています(これがメソッドの外にある唯一のものです)。Scalaコンストラクタにローカルの値/変数がありますか?

Scalaの "outside any any method"は主なコンストラクタです。つまり、 "outside any any method"はありません。したがって、フィールドは主コンストラクタで定義されます。したがって、コンストラクタの任意の変数/値はフィールドです。コンストラクタに与えられた引数も自動的にクラスフィールドであり、Javaのようにローカルコンストラクタ変数ではありません。

すべての権利を得た場合:Scalaコンストラクタにはローカル変数/値がありますか?

そうでない場合:なぜそのようなことは必要でないと判断されたのですか?

Clarficiation:私はコンセプトについて質問します。具体的なケースは問いません。また、私はローカル変数のようなものを得るために回避する方法について尋ねる(私は答えがあれば、それは感謝しますが)。

+2

[Scalaではコンストラクタ-ローカル変数]の可能な重複(http://stackoverflow.com/questions/10162539/constructor-local-variables-in-scala) –

+0

@AleksandarStojadinovic:あなたが他の質問を読みました?限り、私はそれが特定のケースであり、私の質問は概念について理解しています。 – Make42

+0

あなたの質問は「そのような変数はありますか?」と思っていましたが、他の質問からの答えは「いいえ」です。または私は何かを逃している? –

答えて

1

クラス本体全体が「コンストラクタ」です。

任意の変数のスコープを、中括弧で好きなように小さくすることができます。したがって、特定の目的を果たさない追加の「概念」を導入する理由はありません。オッカムのかみそり。

class Foo(bar: String) { // constructor parameter 
    val baz = "baz"; // class member 
    { 
     val bat = "bat" // "local" variable 
     println(bar + baz + bat) // all three are visible 
    } 
    println(bar + baz) // only first two are accessble 
    } 
    println (new Foo("bar").baz) // only class member can be accessed here 
+0

ローカル変数は補助コンストラクタに存在しますが、そうですか?それは構文がそれを可能にするか、またはローカル変数があるべき理由があることだけですか? – Make42

+0

@ Make42 "ローカル変数"は、中括弧の間のどこにでも存在します。この 'def this()= foo'のような補助コンストラクタを書くと、ローカル変数を持つことができません。これを 'def this()= {val foo = 1;}のように書くと、 bar()} 'それができます。 コンストラクタのタイプではなく、中カッコについてです。メインのコンストラクタにそれらを入れる - あなたもローカル変数を持つことができます。それらを入れないでください。 – Dima

+0

実際には、補助コンストラクタは常に 'def this(...)= {this(...);}の形式でなければなりません。 ...} '。しかし、あなたは 'def this()= this({val foo = 1; foo})'を書くことができます。 –

関連する問題