問題タブ [traits]
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 - 一般的な特性の暗黙の変換
私はデータ構造を実装しており、ユーザーがそれをラップする適切なキータイプを提供する限り、キーとして任意のタイプを使用できるようにしたいと考えています。このキータイプには特徴があります。アイデアは、ベースからキータイプへの暗黙の変換を行い、逆に(事実上)ベースタイプのみを使用することです。特性は次のようになります。
コールサイトコードは次のようになります。
計画では、タイプの値は、順序付けされたものK
に暗黙的に変換されるKey[K]
か、順序付けが暗黙的にKey[K]
使用される必要があるため、すべてがうまくいくはずです。もちろん、base2key
特性自体に暗黙的に実装する方法はありません。または、暗黙的に渡されたクラスマニフェストを使用している可能性がありますか?これを考慮した参考文献は見つかりませんでした。
Key[T]
拡張する型には暗黙の変換が伴うことをどういうわけか静的に主張することは可能T => Key[T]
ですか?悲しいことに、コンパニオンオブジェクトは抽象的なメソッドを持つことができません。
これがうまくいくと仮定すると、企業全体が実現可能ですか、それとも、述べられているユースケースには複数の連鎖された暗黙の変換が必要ですか?(私が読んだように、Chainingは起こりません。)
補遺:上記の定義では、を使用してNode(key : K, ...)
(下のK <% Key[K]
)シーケンスを並べ替えることができますが、を使用することはできsortWith(_.key <= _.key)
ませんsortBy(_.key)
。したがって、明らかに、からK
への変換Key[K]
は、私がどこにも宣言したことがない場合でも、暗黙的に発生Ordering
しますが、暗黙的に使用できるものはありませんKey[K]
。ここで何が起こっているのですか?
java - ScalaでisAssignableFromを型パラメーターで使用することは可能ですか?
私はJerseyを使用してScalaでJAX-RSサービスを実装しています。Jsonプロバイダーの一般的な特性が必要であり、要求されたクラスがプロバイダーによってサポートされているかどうかを知る必要があります。Javaでは、型消去のため、実行時に型パラメーターのクラスを知ることはできません。しかし、scalaで行うことは可能ですか?
このコードは機能しません:
なにか提案を?Javaでの最良の方法は、ScalaでもAのクラスを返す保護された抽象メソッドを持つことです。
scala - トレイトの基本クラス コンストラクター パラメーター
いくつかのコンストラクターパラメーターを持つ基本クラスがあります。
クラスはどんどん大きくなり、一部のサブクラスのみが特別な動作を必要とするため、それをトレイトにリファクタリングしたいと考えています。ただし、まだcontext
特性にアクセスする必要があります。私はこれを試しました:
しかし、scala コンパイラーは言う: not found: value context . どうすれば解決できますか?
c++ - トレイトとトレイトをテンプレート パラメーターとして渡す
単純にいくつかの既存の特性構造体を使用するのではなく、テンプレート パラメーターとして特性を渡すことが実用的なのはいつですか?
typedef basic_ofstream< char, char_traits<char> >
対。
typedef basic_ofstream< char >
?
いくつかの共通点 (特性) を持ちたいタイル クラスがいくつかあるので、やtile_traits
など、タイルに関するすべての基本情報を含めるように設計しました。int_type
flag_type
そのような特性を設計することは特性ブロブと見なされますか?
scala - Scala: トレイトとプライベート フィールドの混合
それは大した問題ではありませんが、むしろそれが可能であることに興奮しています! 私がこの小さな例を書いたのは、反対のことを証明するためだけでした。コンパイル エラーか、値のいずれか (111 か 222 か、よくわかりませんでした) が予想されました。
v
get がオーバーライドされないのはなぜですか? もちろん、これはv
s がプライベートである場合にのみ機能しますが、それでも機能します。
java - Javaで特性を提供するためのライブラリまたは言語拡張?
トレイト(Smalltalkでは「トレイト」、Perlでは「ロール」)を紹介しました。慣れ親しんだ言語で、早く実験したいと思います。特性をサポートするJavaのライブラリまたは拡張機能はありますか?
AspectJとQi4Jはどちらもミックスインをサポートしていると聞きましたが、ミックスインは特性とは異なることも読みました。では、これらのライブラリの1つを特性に使用することもできますか?
または、Javaと完全な下位互換性のあるScalaはどうでしょうか?それは特性をサポートしていますか?
他に何か提案はありますか?
scala - Scala のトレイトが実際にはトレイトではないのはなぜですか?
最近誰かが、Scala のトレイトは「真の」トレイトではなく、実際にはただの mixin であると言いました。残念ながら、その理由を聞く機会がありませんでした。彼が何を意味したか分かる人はいますか?
編集: 「特性」の定義として、特性を紹介する Nathanel Schärli の論文とコンセプト ペーパーを参照してきました。ほとんどの mixin や多重継承の実装に欠けていると思われる重要な機能の 1 つは、メソッドをインポートするときにメソッドの名前を変更して衝突やあいまいさを回避する機能です。Scalaはそれを行うことができますか?
scala - Why does the Scala API have two strategies for organizing types?
I've noticed that the Scala standard library uses two different strategies for organizing classes, traits, and singleton objects.
Using packages whose members are them imported. This is, for example, how you get access to
scala.collection.mutable.ListBuffer
. This technique is familiar coming from Java, Python, etc.Using type members of traits. This is, for example, how you get access to the
Parser
type. You first need to mix inscala.util.parsing.combinator.Parsers
. This technique is not familiar coming from Java, Python, etc, and isn't much used in third-party libraries.
I guess one advantage of (2) is that it organizes both methods and types, but in light of Scala 2.8's package objects the same can be done using (1). Why have both these strategies? When should each be used?
scala - トレイトのサブクラスを指定できないのはなぜですか?
を書くと、のサブクラスであるクラスにtrait T extends A
のみトレイトを置くことができるようになると思いました。では、なぜ私はそれを着ることができますか?これはあなたがそれを混ぜるときだけですか?クラスを宣言するときにこれが不可能なのはなぜですか?T
A
B
scala - トレイトを使用して Scala でゲーム コンポーネント システムを構築できますか?
特性を使用してゲーム オブジェクトを構築することが意味的に正しいかどうか疑問に思っています。私はこれを関係がある(オブジェクトにはコンポーネントがある) と見なしますが、コンポーネントはオブジェクトを構成するものと見なします。
例えば。あなたはゲームオブジェクトを持っています。GameObject は、それ自体ではほとんど何もしませんが、ゲームオブジェクトに混ぜると、追加のプロパティが与えられます。コンポーネントは、HealthComponent (ヘルスを持っている)、PhysicsComponent (物理をシミュレートする)、ClickableComponent (クリック可能) のいずれかです。
すべてのプロパティとメソッドが元のオブジェクトに追加されplayer.getHP
、player.getHealthComponent.getHP
. 一方で、特性を使用するネーミングとセマンティクスは奇妙だと思います。trait HealthComponent extends GameObject
- これは意味がありません。AHealthComponent
は GameObject に属していますが、によって暗示されたis aextend
関係を満たしていません。特性は通常、親クラスの特殊化されたバージョンとして扱われると仮定して正しいですか? もしそうなら、どのように私は上記のオブジェクトのような名前を付けますか?