問題タブ [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.
scala - コンパニオン オブジェクトを使用する場合のメソッド名修飾
私はちょうどScalaを学んでいます。コンパニオン オブジェクトを作成し (以下のコード スニペットを参照)、演算子 , ^
(複雑な活用を表す) を定義します。関連するクラス内のコンパニオン オブジェクト名で修飾する必要があります。私は、コンパニオンのメソッドに無条件にアクセスできるべきだという印象を受けました。私が何か間違ったことをしたかどうか誰かに教えてもらえますか?
注: ここでは別のクラス Q が使用されていますが、ここには記載されていません。
scala - scala: コンパニオン オブジェクトが元のクラスの定義を隠しないようにします
これは例を示したほうがわかりやすいと思います。
次のように、代替コンストラクターを提供するために使用される Condition コンパニオン オブジェクトを含む Condition ケース クラスがあるとします。
別のものからインポートすると、次の警告が表示されます (最終的にエラーになります)。
変数の型を宣言するときに条件型にアクセスし、そのメソッドの 1 つを実行するときにコンパニオン オブジェクトにアクセスしたい
これを達成し、この警告を回避する方法はありますか (もちろん、コンパニオン オブジェクトの名前を変更する以外に)?
scala - コンパニオンオブジェクトと通常のオブジェクトについて話す方法は?
私は初めてScalaを教えていますが、生徒たちはコンパニオンオブジェクトに含まれる意図的な「しゃれ」が非常に混乱していることに気づいています。次の例を考えてみましょう。
「スタックオブジェクト」や「スタックオブジェクト」、特に「スタックオブジェクト」などの動詞句を使用すると、混乱が生じます。私の生徒は、私がシングルトンオブジェクトStackを意味するのか、Stackクラスのオブジェクトを意味するのかを理解するのに苦労しています。
初心者が理解しやすいように言葉で表現する別の方法を探しています。私は常にStackクラスのオブジェクトを「Stackinstances」または「instancesofStack」と呼ぶことを考えてきましたが、OOにこれらのオブジェクトを呼び出せないように教えようとすると、おかしなことに思えます。シングルトンオブジェクトスタックについて話すときは、常に「シングルトンオブジェクト」または「コンパニオンオブジェクト」というフレーズを使用しようとしていますが、Scalaの構文は、「オブジェクト」という単語のみを使用しているため、そこではうまくいきません。
この場合、Stackの代わりにシングルトンオブジェクトStackFactoryの名前を変更できますが、これは自分のクラスのオプションにすぎず、Scalaにすでに組み込まれている1,000個のコンパニオンオブジェクトのオプションではありません。
編集:
申し訳ありませんが、私の質問では十分に明確ではありませんでした。主な混乱は、コンパニオンオブジェクトを参照する場合には発生しません。その場合、何人かの人が指摘しているように、「コンパニオンオブジェクト」などのフレーズに使用するのは簡単です。代わりに、通常のインスタンスを参照するときに主な混乱が発生します。次に、「スタックオブジェクト」(スタックインスタンスを意味する)または「スタックオブジェクト」(この特定のインスタンスを意味する)と言うと、一部の学生は、私がコンパニオンオブジェクトを意味していると思います。コンパニオンまたはシングルトンという単語。
また、「オブジェクト」という単語は、コンパニオンオブジェクトとともにのみプログラムテキストに表示されるため、混乱がどこから来ているのかを完全によく理解できます。
scala - Scalaでは定義の順序が重要ですか?
暗黙的なものを探すとき、Scala コンパイラーは、特に関連するクラスのさまざまな部分のコンパニオン オブジェクトを調べます。ただし、コンパニオン オブジェクトの前に定義されている場合、クラス自体で暗黙的な変換が使用されている場合、このルックアップの実行に失敗するようです。私が調理できた最小限の例は次のとおりです。
これはコンパイルに失敗しますcould not find implicit value for parameter c: Counter[Bar]
- 私は Scala 2.9.1 を使用しています。
興味深いこと (rjsvaljean によって提案された) は、順序を逆にすると、つまりobject Bar
前に定義すると、すべてが正常にコンパイルされることcase class Bar
です。
これはコンパイラのバグですか? または、Scala のスコープ ルールについて何か不足していますか?
また、この問題は暗黙の解決でのみ発生することにも言及する必要があります。オブジェクトを明示的に渡すとBarCounter
、すべてが正常にコンパイルされます。
java - Scala コンパニオン オブジェクトが 2 つのクラス (Java コンパイラと .NET コンパイラの両方) にコンパイルされるのはなぜですか?
このコードは Java バイト コードにコンパイルされます。逆コンパイルすると、同等の Java コードは次のようになります。
これは 2 つのクラスにコンパイルされます。Scala.net コンパイラを使用すると、MSIL コードにコンパイルされます。同等の C# コードは次のようになります。
また、2 つのクラスにコンパイルされます。
Scala コンパイラ (Java 用と .NET 用) がこれを行うのはなぜですか? 静的ルール メソッドで println メソッドを呼び出すだけではないのはなぜですか。
scala - コンパニオンのカリー化されたケース クラス コンストラクター
ケース クラスを定義するとき、デフォルトのコンパニオン オブジェクトにはcurried
、ケース クラス コンストラクターのカリー化されたバージョンを取得するための優れたメソッドがあります。
ただし、明示的なコンパニオン オブジェクトを定義するとすぐに、このメソッドは表示されなくなります。
次のように戻すことができます:
ただし、明示的なコンパニオンを定義すると消える理由を知りたいです (たとえば、 とは対照的にapply
)?
(スカラ 2.9.2)
class - Scala: 子クラスからコンパニオン オブジェクトを参照する
次の Scala クラスのレイアウトを考えています。私はアイテムを表す基本的な特性を持っています - 名前、重量を照会し、次のようなメソッドを呼び出すことによっていくつかのオブジェクト固有のことを行うことができる不変オブジェクトであるべきもののインターフェースですequip
:
ケースクラスを手動で作成して実装を作成できますItem
が、ある種の「辞書」ベースのアイテムが必要です-つまり、静的マップは型IDから値へのマッピングを保持しname
、weight
メソッドは格納された型で辞書を照会するだけですID:
ここまでは順調ですね。Weapon(1)
「ショート ソード」のアイテム オブジェクトを参照するために使用できます。Armor
ただし、まったく同じ実装を使用するname
がweight
、完全に異なるequip
他の抽象メソッド実装を使用するなどの他の項目タイプにも同じ基本原則が適用されます。次に例を示します。
にかなり似てWeapon
いますね。共通のパターン (つまり、コンパニオン オブジェクト ディクショナリと共通のtyp
値でのルックアップの実装) を次のように除外したいと思います。
しかしWeapon.NameDict
、親クラスから子のコンパニオン オブジェクト ( など) を参照するには???.NameDict(typ)
どうすればよいですか? そのような問題に対するより良い、より Scala 風のアプローチはありますか?
scala - Scala: コンパニオン オブジェクトの生成
特定のクラスのすべてのサブクラスのコンパニオン オブジェクトを自動的に生成する方法はありますか?
たとえば、サブクラスであるべき場所class Component[T]
を持つ があります。例: .val companion: CompType[T]
T
class Transform extends Component[Transform]
各サブクラスのコンパニオン オブジェクトを生成する方法はありますか?
編集:
これらすべての最終目標は、エンティティ システムです。各コンパニオン オブジェクトには、コンポーネントの配列からその特定のタイプのコンポーネントを検索するために使用できる一意の整数 (継承された特性から取得する) があります。たとえば、Transform コンポーネントをエンティティに追加する場合は、次のように呼び出します。
新しいTransform
オブジェクトは、Transform コンパニオン オブジェクトによって提供されるインデックスで、エンティティを表すコンポーネントの配列に配置されます。しかし、コンパニオン オブジェクトは、継承したトレイトからインデックスを取得するため、名前を除いて、タイプアウトされた違いはありません。したがって、それらを生成するのが良い理由です。
最初から具体的でなくてすみません。それでも混乱する場合は、私がこれを完全に間違った方法で行っている可能性があります。そう思うなら遠慮なく言ってください。
scala - 基本クラスで静的変数をscala利用可能な手段に置き換える方法
必要なもの:
それは明らかにうまくいきません。私が試したこと
また、コンパイラは、関数およびChild1
について何もしないという点でエラーを出します。sin
cos
子孫に継承される基本クラスで静的メンバーを定義するにはどうすればよいですか?