Scalaにおけるオブジェクトとクラスの違い 質問する

Scalaにおけるオブジェクトとクラスの違い 質問する

私はインターネットで Scala のチュートリアルをいくつか読んでいるのですが、いくつかの例では例の冒頭でオブジェクトが宣言されていることに気付きました。

Scala のclassとの違いは何ですか?object

ベストアンサー1

要約

  • class CJava や C++ と同様にクラスを定義します。
  • object O作成するシングルトンオブジェクトをO何らかの匿名クラスのインスタンスとして使用します。何らかのクラスのインスタンスに関連付けられていない静的メンバーを保持するために使用できます。
  • object O extends TオブジェクトOを のインスタンスにしますtrait T。その後はどこにでも を渡すことができますOが、 がT期待されます。
  • が存在する場合class Cobject CコンパニオンオブジェクトクラスのC; コンパニオン オブジェクトは自動的に のインスタンスになるわけではないCことに注意してください。

Scalaのドキュメントも参照してください。物体そしてクラス

object静的メンバーのホストとして

ほとんどの場合、object最初に何らかのクラスのインスタンスを作成しなくても使用できるメソッドと値/変数を保持するために が必要になります。この使用法は、staticJava の メンバー と密接に関連しています。

object A {
  def twice(i: Int): Int = 2*i
}

その後、 を使用して上記のメソッドを呼び出すことができますA.twice(2)

twice何らかのクラスのメンバーである場合はA、まずインスタンスを作成する必要があります。

class A() {
  def twice(i: Int): Int = 2 * i
}

val a = new A()
a.twice(2)

twiceインスタンス固有のデータを必要としないため、これがいかに冗長であるかがわかります。

object特別な名前付きインスタンスとして

自体をクラスまたは特性の特別なインスタンスとして使用することもできますobject。これを行う場合、オブジェクトはtraitサブクラスのインスタンスになるために、何かを拡張する必要があります。

次のコードを考えてみましょう。

object A extends B with C {
  ...
}

Bこの宣言では、まずと の両方を拡張する匿名 (アクセス不可能) クラスを宣言しC、 という名前のこのクラスの単一のインスタンスをインスタンス化しますA

これは、または、または のA型のオブジェクトを期待する関数に渡すことができることを意味します。BCB with C

追加機能object

Scalaにはオブジェクト特有の機能もいくつかあります。公式文書

  • def apply(...)通常のメソッド名なし構文を有効にするA(...)
  • def unapply(...)カスタムパターンマッチングを作成できる抽出器
  • 同じ名前のクラスを伴う場合、オブジェクトは解決時に特別な役割を担う。暗黙のパラメータ

おすすめ記事