問題タブ [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.
c++ - テンプレートパラメータに基づいてさまざまな関数のセットを使用します(C ++特性?)
T
sin、cosなどの演算子を定義したい型のスカラーの配列を保持するクラスをC ++で定義しました。sin
このクラスのオブジェクトに適用される意味を定義するには、適用される意味を知る必要がありますsin
。単一のスカラー型T
。これはT
、クラス内で適切な数学ライブラリ(スカラー型に対応)を使用する必要があることを意味します。現在のコードは次のとおりです。
現在、適切な数学ライブラリを公開し(namespace std;を使用)::sin(a)
、クラスのsin関数内で使用するコードがありますMyType
。これは機能しますが、大きなハックのようです。
T
C ++特性を使用して、インスタンス固有の情報( is double
、when T
isBigNum
などの場合に使用する数学関数のセットなど)を格納できることがわかります。
私はこのようなことをしたいです:(これはコンパイルされないことは知っていますが、これが私がやりたいことを伝えてくれることを願っています)
次に、MyTypeクラスを次のように再定義します。
そしてtraits::math::sin
、私の友達機能で使用します。T
数学関数を含む正しい名前空間(によってパラメーター化された)を取得する方法はありますか?
c++ - 整数特性 (is_integer、is_integral)
整数に関する 2 つの特性が必要です。
最初のものは
std::is_integral
(またはboost::is_integral
) のようになりますが、ユーザー定義型 (たとえば、 anint
をラップするクラスなど) で使用できますint_wrapper
: 型が整数のように動作し、その表現が標準の整数型のようである場合 (たとえばsizeof(T) * CHAR_BITS == std::numeric_limits<T>::digits
、T
が符号なしの場合) はtrue ですが、整数型の定義は、これらの型のリストで構成されるという点で非常に厳密です。したがって、禁止されていない場合、特殊std::is_integral
化は難しいようです(明示的に述べられていないと思いますis_integral
が):「プライマリ」タイプの特性です(20.7.4.1、注3:タイプTに対して正確に1つのプライマリタイプの特性が真です。私の場合int_wrapper
はすでにis_class
等しいです真に)。この特性を に特化した場合、どのようなリスクがありますint_wrapper
か? 私のニーズに合った特性クラス (Boost など) を知っていますか?必要な 2 番目の特性は、整数セマンティクス (ビット算術演算、ビット操作など) を持つ型用です。たとえば、
mpz_class
from GMP はこの特性を満たします。std::numeric_limits<T>::is_integer
この特性に適していますか?が整数のように動作するnumeric_limits<T>::is_integer == true
場合は特殊化して設定しても問題ないことと、 (C++ 標準では)「整数」と「整数」という用語は同義語であることの両方を読みました (この場合、常に を持っている必要があります) 。T
numeric_limits<T>::is_integer == is_integral<T>::value
結論として、正確なニーズに合わせて独自の特性を定義するのと、標準の特性を拡張してみるのとではどちらがよいでしょうか?
scala - valフィールドを持つScalaの不変オブジェクトと特性
不変オブジェクトのみを使用してドメインモデルを構築したいと思います。しかし、valフィールドでトレイトを使用し、いくつかの機能をトレイトに移動したいと思います。次の例を見てください。
残念ながら、そのようなコードは機能しません-トレイトVersionableのコピー方法は不明です。
すべての特性とクラスに対してコピーメソッドが生成されると便利だと思います。このようなメソッドは、オブジェクトの浅いコピーを作成し、メソッドに渡された引数に従って指定されたフィールドが変更された元のオブジェクトと同じタイプを使用してそれを返す必要があります。
したがって、次の例では:
customer.changeName("McDonnald")
オブジェクトインスタンスを返す必要がありますCustomer(version = 0, name = "McDonnald")
と
customer.incrementVersion
オブジェクトインスタンスも返す必要がありますCustomer(version = 1, name = "Scot")
私の知る限り、Scalaにはそのような機能が現在ないため、クラスコンストラクターをトレイトフィールドで汚染せずに不変のクラスとトレイトを使用することはできません。私の例では、versionという名前のパラメーターをCustomerクラスに導入したくありません。これは、バージョン処理の機能をVersionableトレイトにカプセル化する必要があるためです。
ケースクラスのコピーメソッドの機能と、デフォルトのパラメータを使用してクラスに独自のコピーメソッドを作成する機能は知っていますが、このようなコピーメソッドを特性で使用することはできないため、この機能では問題は解決しないと思います。既存の機能のもう1つの欠点は、copyメソッドを使用する親クラスが、実際にコピーされるオブジェクトのクラスではなく、親クラスを返すことです。
私の質問:
1)上記の例をエレガントな方法で処理する方法を知っていますか。私はScalaを初めて使用するので、すでに良い解決策があるかもしれません。私の意見では、エレガントなソリューションには次の機能が必要です。
リフレクションを使用しないでください
シリアル化を使用しないでください
高速である必要があります
コンパイル時に検証可能である必要があります
2)上記の例のコピーメソッドのコードを生成するコンパイラプラグインを作成することについてどう思いますか?コンパイラプラグインを使用してそれを行うことは可能ですか?それを行うための例やヒントはありますか?
scala - 組み込みコレクションの拡張、組み込みメソッドの問題
私は Scala の初心者なので、これがばかげた質問であれば許してください。
追加のメソッドを含む拡張 Map タイプを作成したいとします。これを行う方法はいくつかあります。1つ目は構成です:
もう1つは継承によるものです。
最後に、「特性」ルートも検討しました。
内部のものを常に参照する必要があるため、構成は少し厄介です。継承はかなり自然ですが、私にはしわがあります (詳細は後ほど)。Traits はこれを行うための非常にエレガントな方法のように思えます。「with」構造を使用するのは非常に便利ですが、私にとっては問題もあります。
私が遭遇しているしわは、++のようなメソッドにあります。彼らは新しい地図を返します。したがって、上記の「私の方法」がマップに何かを追加したいとしましょう(単なる例です。マップには既にこれがあることがわかっています)。
戻り値の型が Path[V] ではないため、これはエラーを生成します。これで、新しいインスタンスで "with" を使用して Path[V] トレイトを追加できることがわかりました。しかし、ここで新しいマップの構築を制御することはできません。Path[V] トレイトを追加する方法はありますか? 事前入力された新しい不変マップを作成し、「with Path[V]」でタグ付けすることを考えましたが、事前入力されたマップを作成するために使用できるコンストラクターはありません。
継承を使用して同様の問題が発生するのではないかと思います (確認はしていませんが)。マップに新しいエントリを追加する新しいメソッドを追加することはできますが、必要な "Path[V]" を取得できません。合成アプローチは、ここに行く唯一の方法のようです。
これが明確であることを願っています。コメント?
perl - トレイトの一部としてロードされたメソッド修飾子を注文できますか?
これは前の質問へのフォローアップです。修飾子を含む複数のプラグイン/特性がaround
ある場合、特定の実行順序を保証することは可能ですか (どれが実際にロードされるかがわからないため)? それとも、私が書いたコードとドキュメントでのみそれを制御できますか?
例: それぞれに を持つ 3 つのロールがありaround
、それぞれをオプションで特性としてロードできますが、複数のロールをロードする場合、正しく連携するには特定の順序でロードする必要があります。たとえば、Trait ABC をこの順序でロードすると正常に動作しますが、Trait BAC のようにロードすると、不安定な動作が発生します。
ユーザー (プログラマー) が間違った順序でロードするのを防ぐ方法はありますか?
generics - サンプルインスタンスなしでジェネリックインスタンスを生成する方法はscalaにありますか?
私は次のように一般的なファクトリを作成して遊んでいました:
T は実行時まで定義されていないため、「new T()」はコンパイルされません。クラスのインスタンスを何らかのメソッドに渡すことで機能させることができることを知っています(つまり、 createInstance(classOf[Date]) )
超単純なファクトリを作成できるように、「new T()」を置き換えることができるイントロスペクション マジックがあるかどうかを尋ねています。
scala - ケースクラスと特性
専用の電卓を作りたい。私はそれcase class
が操作のための良い考えだと思います:
これで、入力の解析に match-case を使用できるようになりました。たぶん、私も使用する必要がありますtraits
(つまり:trait Distributivity
などtrait Commutativity
)、それは可能ですか? それは良い考えですか?
c++ - 型から int へのマッピング
type -> int
コンパイル時に認識され、2 つのプログラム間で等しいマップが必要な 2 つの C++ プログラムがあります。さらに、マップが 1 対 1 であることをコンパイル時に自動的に確認したいと考えています。どのように解決しますか?(c++0x 拡張が許可されます)。最初の部分は簡単です:
プログラム間。val
(2 番目の部分は、プログラムのどこかで 2 つの異なる型に対して誤って同じものを定義したくないことを意味します。)
scala - ケースクラスでコンストラクターを使用できますか?
Stuff
私は、トレイトを拡張することによって実行時に匿名のサブクラスを作成できるようにしたいケースクラス(名前を付けましょう)を持っています(それを呼び出しますMarker
)。これは、私がやろうとしていることを示す REPL セッションのスニペットです。
a
を使用してインスタンス化する方法に注意してくださいStuff.apply()
。一方、b
の場合は、ケース クラスのコンストラクターを呼び出しています。
私の質問は、コンストラクタコーシャを使用してケースクラスをインスタンス化していますか? ==
、.equals()
、、 などのケース クラスによって提供される通常の利便性はすべて機能するため、そのように思われます.hashCode()
。私がやっていることをBad Thing (TM)としてブランド化する何かが欠けていますか?
scala - Scala の初期化動作
次のコードを見てください。
MyClass
との場合で初期化順序が異なるのはなぜMyClass2
ですか? のコンストラクタは次のMyClass
ようになります
MyClass2
willのコンストラクタは
MyClass2
初期化の順序は、コンストラクターと同じようにする必要があると思います。どちらの場合も同じです。