トレイト制約
ジェネリクスを用いるとき、あるトレイトのメソッドを呼び出せるように、型がそのトレイトを実装していることを要求したいことがよくあります。(脚注:本教材では"Trait bounds"を「トレイト制約」と翻訳しましたが、Rustの日本語翻訳コミュニティでは「トレイト境界」と呼ぶ流派もあり、どちらの翻訳を採用するかについては議論がなされています。)
You can do this with T: Trait
:
fn duplicate<T: Clone>(a: T) -> (T, T) { (a.clone(), a.clone()) } // struct NotCloneable; fn main() { let foo = String::from("foo"); let pair = duplicate(foo); println!("{pair:?}"); }
This slide should take about 8 minutes.
-
Try making a
NonCloneable
and passing it toduplicate
. -
複数のトレイトが必要な場合は、
+
を使って結合します。 -
where
節の使い方を示しましょう。受講生はコードを読んでいるときに、このwhere
節に遭遇します。fn duplicate<T>(a: T) -> (T, T) where T: Clone, { (a.clone(), a.clone()) }
- たくさんのパラメタがある場合に、
where
節は関数のシグネチャを整理整頓してくれます。 where
節には更に強力な機能があります。- 誰かに聞かれた場合で良いですが、その機能というのは、":" の左側には
Option<T>
のように任意の型を表現できるというものです。
- 誰かに聞かれた場合で良いですが、その機能というのは、":" の左側には
- たくさんのパラメタがある場合に、
-
なお、Rust はまだ特化(specialization)をサポートしていません。たとえば、元の
duplicate
がある場合は、特化されたduplicate(a: u32)
を追加することはできません。