問題タブ [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 が見つけられないのはなぜですか?
以下のソースコードを参照してください。すべてのソース コードは同じパッケージで定義されます。1 つのソース ファイル内ですべてのコードを定義するとShowMain.scala
コンパイル エラーが発生しますが、 およびが で定義されているobject ShowMain
場合、コンパイル エラーは発生しません。ShowMain.scala
trait Show
object Show
Show.scala
私の質問: これの原因は何ですか? 私が違反した言語規則は何ですか?
コード例:
コンパイル エラー:
(を含む行の ScalaIDE/Scala 2.11.2 output("hello")
)
scala - Java からインポートされたクラスのコンパニオン オブジェクトを作成する
いくつかのインポートされた Java 型のコンパニオン オブジェクトを作成して、それらを割り当てるために new を使用する必要がないようにしたいと考えています。タイプ Vector3f は、jMonkeyEngine の com.jme3.math からインポートされます。
私が試したのは:
これをコンパイルすると、エラーが発生します。
エラー:(8, 21) が見つかりません: type Vector3f def apply() = new Vector3f()
を追加するimport com.jme3.math.Vector3f
と、おそらく私が見ているものを説明する警告が表示されます。
警告:(3, 22) インポートされた `Vector3f' はパッケージ math のオブジェクト Vector3f の定義により永久に隠されています
Java からインポートされた com.jme3.math.Vector3f またはその他の型のコンパニオン オブジェクトを作成するにはどうすればよいですか?
scala - コンパニオン オブジェクトにメソッドが存在することを保証し、それを参照するにはどうすればよいですか?
Listable
がケース クラスのコンパニオン オブジェクトに混在することを意図しているこの例を考えてみましょう。したがって、 を呼び出すには、 が定義されたを拡張Writer.grid
するコンパニオン オブジェクトが必要です。(たとえば、任意のリストをCSV 形式に変換するとします。)A
Listable[A]
implicit Writer[A]
Listable
そして、ここに素朴な実装があります:
これはコンパイルされますが、listable: A
実際にはオブジェクトTest
を参照し、ケースではクラスを参照しているA
ため、機能しません。w: Writer[A]
Test
Writer.grid(Test)
の署名を捨てListable
て要求することで、この問題をある程度回避できます。implicit List[A]
grid
しかし、私は次のことを好みます:
- 予期しない結果を生成する可能性があるような暗黙的な関数は必要ありません。
list
他の場所でも使用されるため、wrap に特別なタイプを使用しないでください。grid
メソッドの定義を の外部に保持しますListable
。
これを機能させるために の署名を作り直すことは可能Writer.grid
ですか? (またはその他の構造変更)
scala - Scala でコンパニオン オブジェクト内でクラスを宣言できますか?
プライベートな不変クラス コンストラクターと、補助コンストラクターが最初のステートメントとして相互に呼び出さなければならないという制約と戦っている間、スコープ内のクラスから他に何もないため、インスタンス化にコンパニオン オブジェクトを使用するように制約されているようです。コンパニオン オブジェクトはメイン コンストラクターにアクセスする必要があります。そのオブジェクトを含むスコープを対象とするプライベート キーワードが必要です。
さて、私の脳は名前生成に弱いので、次のようにクラスをコンパニオン オブジェクト自体の中に配置することで、そのコンパニオン オブジェクトとクラスの両方を囲む名前空間の必要性を救おうとしています。
問題は、Group
ofprivate[Group]
がオブジェクトを参照するのではなく、クラスを参照することです (余計なものになっています)。
そのコンストラクターをコンパニオン オブジェクト レベルで使用できるようにタグ付けするにはどうすればよいですか?
PS:そのコンパニオンオブジェクトはすでに私に頭痛の種を与えておりcomplexCompute
、いくつかのコンストラクターの実装が必要になる可能性のあるクラスをエンスコープすることさえ望んでいたでしょう...
編集:わかりました。タグを追加しているときに、コンパニオン オブジェクトがクラスのスコープに対してなんらかの権限を持っている可能性があることを知らせるニューロンにぶつかりました。プライベート パーツにアクセスできるため、専用の囲みスコープなしでオブジェクトとクラスを並べて配置できます。object Main {object Main {object Main...
ただし、このようなボクシング ケースのスコーピングを処理する可能性のある方法についての回答と、コンパニオン オブジェクトを使用せずにクラスにコンストラクターのみを含める手法についての発言の可能性の両方について、質問を維持します。
scala - トレイトは、コンパイル時または実行時にコンパニオン オブジェクトによって継承されることを保証できますか?
私は、初期化が本質的にスレッドセーフではないという特性を持っていますが、定義により初期化がスレッドセーフ であるコンパニオンオブジェクトのベースとして使用することを厳密に意図しています。
特性が常にコンパニオン オブジェクトによって拡張されることを (コンパイル時または実行時に) 保証する方法はありますか? トレイトには、コンパニオン オブジェクトの初期化中にのみ呼び出されるメソッドがあり、検証のサイトになる可能性があります。