トレイト制約
ジェネリクスを用いるとき、あるトレイトのメソッドを呼び出せるように、型がそのトレイトを実装していることを要求したいことがよくあります。(脚注:本教材では“Trait bounds“を「トレイト制約」と翻訳しましたが、Rustの日本語翻訳コミュニティでは「トレイト境界」と呼ぶ流派もあり、どちらの翻訳を採用するかについては議論がなされています。)
そうしたことはT: Trait
や impl Trait
を用いて行えます:
fn duplicate<T: Clone>(a: T) -> (T, T) { (a.clone(), a.clone()) } // struct NotClonable; fn main() { let foo = String::from("foo"); let pair = duplicate(foo); println!("{pair:?}"); }
This slide should take about 10 minutes.
-
Try making a
NonClonable
and passing it toduplicate
. -
When multiple traits are necessary, use
+
to join them. -
where
節の使い方を示しましょう。受講生はコードを読んでいるときに、このwhere
節に遭遇します。fn duplicate<T>(a: T) -> (T, T) where T: Clone, { (a.clone(), a.clone()) }
- たくさんのパラメタがある場合に、
where
節は関数のシグネチャを整理整頓してくれます。 where
節には更に強力な機能があります。- 誰かに聞かれた場合で良いですが、その機能というのは、“:” の左側には
Option<T>
のように任意の型を表現できるというものです。
- 誰かに聞かれた場合で良いですが、その機能というのは、“:” の左側には
- たくさんのパラメタがある場合に、
-
Note that Rust does not (yet) support specialization. For example, given the original
duplicate
, it is invalid to add a specializedduplicate(a: u32)
.