web-dev-qa-db-ja.com

Scala言語では、デフォルト値に依存するのではなく、インスタンス変数を初期化する必要があるのはなぜですか?

Scala言語では、インスタンス変数を使用する前に初期化する必要があります。ただし、Scalaは変数のデフォルト値を提供しません。代わりに、次のように、デフォルト値のように機能するワイルドカードアンダースコアを使用して手動で値を設定する必要があります。

var name:String = _

私は知っています、私は知っています...クラス定義でコンストラクターを定義できます。これはパラメーターとしてインスタンス変数を取ります。したがって、Scalaは、以下に示すように初期化を強制しません。

class Person(var name:String) 

ただし、ElementTypeがFIELDまたはMETHODであるJavaアノテーションを使用する必要があるため、本文で宣言する必要があります。つまり、宣言されたインスタンス変数またはメソッドのいずれかに適用できます。私たちのクラスの本体で。

質問:Scala言語では、デフォルト値に依存するのではなく、クラスの本体で宣言されたインスタンス変数(デフォルト値_または必要なもの)を初期化する必要があるのはなぜですか?

25
Arthur Ronald

コンストラクター引数として指定すると、アノテーションをcan適用できます。また、メタアノテーションを使用して、使用しているアノテーションが適用されるターゲットを制限する必要がある場合があります http://www.scala-lang.org/api/2.10.2-RC2/を参照) index.html#scala.annotation.meta.package

ただし、「デフォルト値に依存する」という質問はやや不明確です。アンダースコアを使用した初期化は、変数の値をnullに割り当てることに対応します。他にどのようなデフォルトを考えていますか?

6
Kris Nuttycombe

宣言している次のようなコードを使用する場合は、nameを抽象化する必要があります。

class A {
  var name: String
}

あなたはすでにそれを知っていたと思います。したがって、あなたの質問はむしろ構文的な性質のものです。答えは、他の可能な抽象的な候補との一貫性です。

次のようなことをしたいとします。

class A {
   var variable: String = _ // variable has some default value (probably null)
   val value: String = _ // value cannot have any default values, since it cannot be reassigned later.
   def method: String = _ // method could return some default value (probably null)
   type theType = _ // what should the default type be? (Any perhaps?)
}

最後の3つの例はコンパイルすらしていません。ここで、次のようなことをしたいとします。

class A {
   var variable: String
   val value: String
   def method: String
   type theType
}

私の見解では、Scala sees宣言のみをほとんど理解していない人でも、宣言以外に何もないので、それらを誤解する方法はありません。別の言語から来て、デフォルト値があると一瞬想定すると、唯一の混乱が生じます。しかし、最初の例(デフォルト値を持つ例)を見るとすぐに、この混乱はなくなります。抽象メンバーを宣言できるようにするために抽象階層の一部になること。したがって、言語に慣れていない場合でも、コンパイラーから追加の支援を得ることができます。

これがあなたの質問と幸せなコーディングに答えることを願っています。

19
agilesteel

Scalaは、クラス本体の「var name:String」に問題はありません。やってみましたか?しかし、それはあなたがそれを意味したいことを意味するものではありません。それは抽象的な変数です。

abstract class A {
  var name: String
}
// some possible uses for abstract vars
trait B { type T ; var name: T }
class B1 extends B { type T = Int ; var name: Int = 5 }
// hey, no storage
class B2 extends B { type T = String ; def name = "abc" ; def name_=(x: String) = () }
4
psp