問題タブ [companion-object]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
7 に答える
36566 参照

oop - Scala でコンパニオン オブジェクトを使用する理由は何ですか?

クラスのコンパニオン オブジェクト (シングルトン) が必要な場合はありますか? Fooクラスを作成し、そのコンパニオン オブジェクトも作成する必要があるのはなぜでしょうか。

0 投票する
3 に答える
31384 参照

scala - Scala の apply() メソッド マジックはどのように機能しますか?

Scala ではapply、クラスまたは最上位オブジェクトで呼び出されるメソッドを定義すると、そのクラスのインスタンスにペアの括弧を追加し、apply()それらの間に適切な引数を配置するたびに、そのメソッドが呼び出されます。例えば:

つまり、基本的にobject(args)は、 の構文糖衣ですobject.apply(args)

Scala はこの変換をどのように行うのでしょうか?

ここで、Predef オブジェクトの暗黙的な型変換と同様に (種類は異なりますが)、グローバルに定義された暗黙的な変換が行われていますか? それとももっと深い魔法ですか?Scala は、多くの例外を含む多くのルールよりも、より小さなルール セットを一貫して適用することを強く支持しているように思われるためです。これは、最初は例外のように思えます。

0 投票する
4 に答える
3307 参照

scala - ケースクラスのコンパニオンオブジェクトがFunctionNを拡張するのはなぜですか?

ケースクラスを作成すると、コンパイラは、いくつかのケースクラスの機能を備えた対応するコンパニオンオブジェクトを作成します。applyプライマリコンストラクタ、、、、およびに一致するファクトリequalsメソッドhashCodeですcopy

奇妙なことに、この生成されたオブジェクトはFunctionNを拡張します。

これは、次の場合にのみ当てはまります。

  • 手動で定義されたコンパニオンオブジェクトはありません
  • パラメータリストは1つだけです
  • 型引数はありません
  • ケースクラスは抽象的ではありません。

このように約2年前に追加されたようです。最新の化身はここにあります。

誰かがこれを使用しますか、またはそれが追加された理由を知っていますか?静的フォワーダーメソッドを使用すると、生成されたバイトコードのサイズが少し大きくなり#toString()、コンパニオンオブジェクトのメソッドに表示されます。

アップデート

単一のapplyメソッドを使用して手動で作成されたオブジェクトは、自動的に次のように見なされませんFunctionN

0 投票する
2 に答える
3207 参照

scala - コンパニオン オブジェクトを含む Scala 型エイリアス [初心者向け]

型エイリアスを記述して、簡潔で適切なカプセル化された Scala コードを作成したいと考えています。値がタプルであるマップのリストであるというプロパティを持つコレクションを取得したとします。私の型は のようなものList[Map[Int, (String, String)]]、または私のアプリケーションが許可するより一般的なものを書きます。Seq[MapLike[Int, Any]]具象サブクラスがより具体的で、私のボートを浮かせる何かを要求するスーパータイプを持つことを想像できます。

次に、この長い型のエイリアスを書きたいと思います。

ConcreteClass#DataTypeそれから、私はそれを持って行けるところならどこでも喜んで使用し、それを使用します.

ここで、関数を追加するとします

そして、空のリストで外部から呼び出したい。を呼び出すことはできますfoo(List())が、基になる型を の別の型に変更したい場合はSeq、戻ってこのコードも変更する必要があります。さらに、この空のリストが として意図されていることはあまり明示的ではありませんDataType。また、コンパニオン オブジェクトには関連付けられたメソッドがないため、 、またはListを呼び出すことはできません。この長い型の重要な部分を書き出さなければならないので、空でないリストが必要な場合はさらに面倒です。DataType()DataType.empty

コードを短縮してブラックボックス化するために、Scala に自分の型 (作成者メソッドを含むコンパニオン オブジェクトを含む) を同じものとして理解させる方法はありますか? または、そもそもこれを行うべきではない理由はありますか?

0 投票する
2 に答える
2463 参照

scala - Scalaで、Javaで定義されたクラスのコンパニオンオブジェクトを定義するにはどうすればよいですか?

モデリングツールによって生成されたJavaクラスに暗黙の変換を追加したいと思います。そこで、それらをそれらのクラスのコンパニオンオブジェクトに追加して、コンパイラが自動的にそれらを検出できるようにします。ただし、コンパニオンは同じファイルで定義する必要があるため、別のファイルに追加することはできません。これについて私にできることはありますか?

もちろん、すべての暗黙的な変換を別のオブジェクトで定義してからスコープに入れることもできますが、これには追加のインポートが必要です。他の解決策はありますか?

0 投票する
2 に答える
3517 参照

scala - コンパニオンオブジェクトはクラスのプライベート変数にアクセスできません

ScalaREPLから来るかなり奇妙な振る舞い。

以下は問題なくコンパイルされますが:

プライベート変数は、REPLのコンパニオンオブジェクトからアクセスできないようです。

なぜそれが起こっているのですか?

0 投票する
1 に答える
853 参照

scala - コンパニオン オブジェクトにエイリアス タイプを適用する

Scala コードを読みやすくしたいので、すべてのパラメーター化された型にカスタム型を追加しました。

だから私は簡単にするためにパッケージオブジェクトに持っています、

applyしかし、今ではコンパニオンオブジェクトを単純にすることはできません。REPL から:

何をすべきか?

(念のため: 私の実際のエイリアス オブジェクトはより複雑ですSeq[Int])

編集:同様の質問があります-コンパニオンオブジェクトを含むScala型エイリアス[初心者]

その質問には 2 つの回答があり、どちらも機能していません。

1 つは、apply を使用してカスタム オブジェクトを定義することですが、私の場合はそれを行う方法がわかりません。さらに、少し冗長です。

もう一方 - 書き込むval IntSeq = Seqとエラーが発生します

警告: 以前に定義された特性 Seq は、値 IntSeq のコンパニオンではありません。コンパニオンはまとめて定義する必要があります。これには :paste モードを使用することをお勧めします。

0 投票する
1 に答える
3879 参照

oop - コンパニオンオブジェクトを持つクラスと同じ名前のクラスとオブジェクトの違いは何ですか?

Scalaクラスの「コンパニオンオブジェクト」は、クラスと同じ完全修飾名(つまり、同じパッケージ内の同じ名前)を持つシングルトンオブジェクトと見なすことができます。staticこれらは、Javaのメソッドの代わりとして、クラスのすべてのインスタンスに共通のユーティリティ関数を保持するために使用されます。

ただし、ドキュメントや質問のさまざまな場所で、コンパニオンオブジェクトを同じコンパイルユニットで定義する必要があると書かれています。たとえば、それらは同じファイルで定義する必要があります。コンパニオンオブジェクトをJavaオブジェクトに定義することはできませんREPLでは、これらは同じ入力行で定義する必要があるため、次の警告メッセージが表示されます。

これは、コンパニオンオブジェクトを持つクラスと、同じ(完全に修飾された)名前を持つクラスとオブジェクトだけを区別する必要があることを意味します。この違いは何ですか?

0 投票する
1 に答える
89 参照

scala - コンパイラはScalaファクトリを無視しますか?

私はこのようにコンパニオンオブジェクトにファクトリメソッドをまとめるのにこれまでずっと費やしてきました:

しかし、私がそれを殺していると思ったとき、私はコンパイルに行きましたが、これはうまくいきませんでした:

何が起こっている!?これ作っただけ!? ヘルプ!!!

0 投票する
2 に答える
1198 参照

scala - Scalaでコンパニオンオブジェクトを入力する

私はクラスとそのコンパニオンオブジェクトを持っており、それらは一緒にいくつかの再利用可能な機能を持っています。コンパニオンオブジェクトの機能をトレイトにカプセル化したので、状況は次のようになります。

は再利用可能な方法なのでFoo.foo、その特性に入れたいと思います。

barしかし、型チェッカーに、クラスのメソッドではありませんがFoo、コンパニオンオブジェクトからインポートされるため、スコープ内にあることを伝える方法を見つける必要があります。クラスのコンパニオンオブジェクトを入力できるようなものが必要だと思います。

そのようなものはありますか?