2017-02-22 7 views
1

ジェネリックパラメータを、選択された数少ないタイプの1つに制限することは、それらのタイプを正確に定義する特性を考えずに可能ですか?例えばタイプの小さなセットに属する汎用パラメータの指定

impl<T> Data<T> where T == u32 || T == u64 

は、時にはそれは、すべての形質がしたいタイプを取得するためにwhereに追加するかを把握することが面倒だし、時には一つは、それが原因のセマンティクスの構文意味があるタイプの場合でも、許可したくないでしょう。

あなたがサポートしたいタイプのためのマーカーの形質を使用することができ
+0

*時にはそれはあなたがしたい*の種類を取得する場所に追加するものをすべての特性を把握するために退屈だ - 時にはそれがです明示的にコードを取得するのが面倒その依存関係を警告し、どこかの任意の型がメソッドの名前を変更しようとすると、不思議に失敗することはありません。私はそれが**良いことと考えています**。錆は行かない。形質のメンバーシップを自動的に推論することは、良いことではありません。なぜなら、機能の*シグネチャ*が、特性によって推論される契約を構成する唯一のものではないからです。コードで表現することができない側面があります。そのため、人間が形質を適用する必要があります。 – Shepmaster

+0

私は同意します。私の特定のユースケースは、その時代のものではありません。ハイレベルのユースケースが理論上必要とするもの(すなわち、外部クレートを使用しない整数の数値特性)よりも、フードの下でより深く見なければならないためです。 '1 .n'は特性を必要とします。' a + b + c'をサポートできる 'std :: ops :: Add'の型シグネチャが深くなり、' Zero'の特性は実現しません安定している。 FWIW私は「行く」という感情を分かち合う。 – divbyzero

答えて

2

:あなたは、いくつかのimpl秒間この特性を使用する必要があり、あなたがすることができます、他の形質の境界が必要な場合は、Pavel Strakhov mentionedとして

trait DataSupported {} 

impl DataSupported for u64 {} 
impl DataSupported for u32 {} 

impl<T> Data<T> where T: DataSupported {} 

ちょうど簡潔なあなたimpl秒を保つであろう、代わりにあなたのマーカー形質の境界として、これらの特性を作る:

trait DataSupported: Num + Debug {} 
+0

実際には、コンパイラはこれらの型で実装されている共通の特性セットを推測しないので、個々のバウンドを個別に指定する必要があります。 – divbyzero

+1

'trait DataSupported:Display + Debug {}'あなたが必要とする特性。それらの特性を 'impl'sにリストする必要はありません。 –

+0

@PavelStrakhovありがとう、私はそれで私の答えを更新します。 –

関連する問題