1. ホーム
  2. scala

[解決済み] Scalaのオブジェクトとクラスの違い

2022-03-14 09:04:28

質問

インターネット上のScalaチュートリアルを見ていて、いくつかの例で、オブジェクトが例の最初に宣言されていることに気づきました。

とはどのような違いがあるのでしょうか? classobject をScalaで使うのですか?

どのように解決するのですか?

tl;dr

  • class C は、JavaやC++と同じようにクラスを定義します。
  • object O を作成します。 シングルトン オブジェクト O これは、あるクラスのインスタンスに関連付けられない静的メンバを保持するために使用されます。
  • object O extends T は、オブジェクトを O のインスタンスです。 trait T を渡すことができます。 O は、どこでも T が期待されます。
  • がある場合は class C であれば object C コンパニオンオブジェクト のクラス C コンパニオンオブジェクトは ではなく のインスタンスが自動的に作成されます。 C .

については、Scala のドキュメントも参照してください。 オブジェクト クラス .

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

多くの場合 object メソッドや値/変数を保持し、クラスのインスタンスを作成することなく使用できるようにします。 この使い方は static のメンバーである。

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 {
  ...
}

この宣言では,まず,無名の(アクセスできない)クラスを宣言し,そのクラスは BC という名前のこのクラスのインスタンスを作成します。 A .

これはつまり A 型のオブジェクトを期待する関数に渡すことができます。 B または C または B with C .

の追加機能 object

また、Scalaにはオブジェクトの特殊な機能がいくつか存在します。 この辺は 公式ドキュメント .

  • def apply(...) は、通常のメソッド名なしの構文である A(...)
  • def unapply(...) カスタムパターンマッチングを作成することができます。 エクストラクタ
  • を解決するとき、そのオブジェクトは特別な役割を担います。 暗黙のパラメータ