問題タブ [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.
oop - Scala でコンパニオン オブジェクトを使用する理由は何ですか?
クラスのコンパニオン オブジェクト (シングルトン) が必要な場合はありますか? Foo
クラスを作成し、そのコンパニオン オブジェクトも作成する必要があるのはなぜでしょうか。
scala - Scala の apply() メソッド マジックはどのように機能しますか?
Scala ではapply
、クラスまたは最上位オブジェクトで呼び出されるメソッドを定義すると、そのクラスのインスタンスにペアの括弧を追加し、apply()
それらの間に適切な引数を配置するたびに、そのメソッドが呼び出されます。例えば:
つまり、基本的にobject(args)
は、 の構文糖衣ですobject.apply(args)
。
Scala はこの変換をどのように行うのでしょうか?
ここで、Predef オブジェクトの暗黙的な型変換と同様に (種類は異なりますが)、グローバルに定義された暗黙的な変換が行われていますか? それとももっと深い魔法ですか?Scala は、多くの例外を含む多くのルールよりも、より小さなルール セットを一貫して適用することを強く支持しているように思われるためです。これは、最初は例外のように思えます。
scala - ケースクラスのコンパニオンオブジェクトがFunctionNを拡張するのはなぜですか?
ケースクラスを作成すると、コンパイラは、いくつかのケースクラスの機能を備えた対応するコンパニオンオブジェクトを作成します。apply
プライマリコンストラクタ、、、、およびに一致するファクトリequals
メソッドhashCode
ですcopy
。
奇妙なことに、この生成されたオブジェクトはFunctionNを拡張します。
これは、次の場合にのみ当てはまります。
- 手動で定義されたコンパニオンオブジェクトはありません
- パラメータリストは1つだけです
- 型引数はありません
- ケースクラスは抽象的ではありません。
このように約2年前に追加されたようです。最新の化身はここにあります。
誰かがこれを使用しますか、またはそれが追加された理由を知っていますか?静的フォワーダーメソッドを使用すると、生成されたバイトコードのサイズが少し大きくなり#toString()
、コンパニオンオブジェクトのメソッドに表示されます。
アップデート
単一のapply
メソッドを使用して手動で作成されたオブジェクトは、自動的に次のように見なされませんFunctionN
。
scala - コンパニオン オブジェクトを含む Scala 型エイリアス [初心者向け]
型エイリアスを記述して、簡潔で適切なカプセル化された Scala コードを作成したいと考えています。値がタプルであるマップのリストであるというプロパティを持つコレクションを取得したとします。私の型は のようなものList[Map[Int, (String, String)]]
、または私のアプリケーションが許可するより一般的なものを書きます。Seq[MapLike[Int, Any]]
具象サブクラスがより具体的で、私のボートを浮かせる何かを要求するスーパータイプを持つことを想像できます。
次に、この長い型のエイリアスを書きたいと思います。
ConcreteClass#DataType
それから、私はそれを持って行けるところならどこでも喜んで使用し、それを使用します.
ここで、関数を追加するとします
そして、空のリストで外部から呼び出したい。を呼び出すことはできますfoo(List())
が、基になる型を の別の型に変更したい場合はSeq
、戻ってこのコードも変更する必要があります。さらに、この空のリストが として意図されていることはあまり明示的ではありませんDataType
。また、コンパニオン オブジェクトには関連付けられたメソッドがないため、 、またはList
を呼び出すことはできません。この長い型の重要な部分を書き出さなければならないので、空でないリストが必要な場合はさらに面倒です。DataType()
DataType.empty
コードを短縮してブラックボックス化するために、Scala に自分の型 (作成者メソッドを含むコンパニオン オブジェクトを含む) を同じものとして理解させる方法はありますか? または、そもそもこれを行うべきではない理由はありますか?
scala - Scalaで、Javaで定義されたクラスのコンパニオンオブジェクトを定義するにはどうすればよいですか?
モデリングツールによって生成されたJavaクラスに暗黙の変換を追加したいと思います。そこで、それらをそれらのクラスのコンパニオンオブジェクトに追加して、コンパイラが自動的にそれらを検出できるようにします。ただし、コンパニオンは同じファイルで定義する必要があるため、別のファイルに追加することはできません。これについて私にできることはありますか?
もちろん、すべての暗黙的な変換を別のオブジェクトで定義してからスコープに入れることもできますが、これには追加のインポートが必要です。他の解決策はありますか?
scala - コンパニオンオブジェクトはクラスのプライベート変数にアクセスできません
ScalaREPLから来るかなり奇妙な振る舞い。
以下は問題なくコンパイルされますが:
プライベート変数は、REPLのコンパニオンオブジェクトからアクセスできないようです。
なぜそれが起こっているのですか?
scala - コンパニオン オブジェクトにエイリアス タイプを適用する
Scala コードを読みやすくしたいので、すべてのパラメーター化された型にカスタム型を追加しました。
だから私は簡単にするためにパッケージオブジェクトに持っています、
apply
しかし、今ではコンパニオンオブジェクトを単純にすることはできません。REPL から:
何をすべきか?
(念のため: 私の実際のエイリアス オブジェクトはより複雑ですSeq[Int]
)
編集:同様の質問があります-コンパニオンオブジェクトを含むScala型エイリアス[初心者]
その質問には 2 つの回答があり、どちらも機能していません。
1 つは、apply を使用してカスタム オブジェクトを定義することですが、私の場合はそれを行う方法がわかりません。さらに、少し冗長です。
もう一方 - 書き込むval IntSeq = Seq
とエラーが発生します
警告: 以前に定義された特性 Seq は、値 IntSeq のコンパニオンではありません。コンパニオンはまとめて定義する必要があります。これには :paste モードを使用することをお勧めします。
oop - コンパニオンオブジェクトを持つクラスと同じ名前のクラスとオブジェクトの違いは何ですか?
Scalaクラスの「コンパニオンオブジェクト」は、クラスと同じ完全修飾名(つまり、同じパッケージ内の同じ名前)を持つシングルトンオブジェクトと見なすことができます。static
これらは、Javaのメソッドの代わりとして、クラスのすべてのインスタンスに共通のユーティリティ関数を保持するために使用されます。
ただし、ドキュメントや質問のさまざまな場所で、コンパニオンオブジェクトを同じコンパイルユニットで定義する必要があると書かれています。たとえば、それらは同じファイルで定義する必要があります。コンパニオンオブジェクトをJavaオブジェクトに定義することはできません。REPLでは、これらは同じ入力行で定義する必要があるため、次の警告メッセージが表示されます。
これは、コンパニオンオブジェクトを持つクラスと、同じ(完全に修飾された)名前を持つクラスとオブジェクトだけを区別する必要があることを意味します。この違いは何ですか?
scala - コンパイラはScalaファクトリを無視しますか?
私はこのようにコンパニオンオブジェクトにファクトリメソッドをまとめるのにこれまでずっと費やしてきました:
しかし、私がそれを殺していると思ったとき、私はコンパイルに行きましたが、これはうまくいきませんでした:
何が起こっている!?これ作っただけ!? ヘルプ!!!
scala - Scalaでコンパニオンオブジェクトを入力する
私はクラスとそのコンパニオンオブジェクトを持っており、それらは一緒にいくつかの再利用可能な機能を持っています。コンパニオンオブジェクトの機能をトレイトにカプセル化したので、状況は次のようになります。
は再利用可能な方法なのでFoo.foo
、その特性に入れたいと思います。
bar
しかし、型チェッカーに、クラスのメソッドではありませんがFoo
、コンパニオンオブジェクトからインポートされるため、スコープ内にあることを伝える方法を見つける必要があります。クラスのコンパニオンオブジェクトを入力できるようなものが必要だと思います。
そのようなものはありますか?