rustのトレイトは、Javaのインターフェースやswiftのプロトコルに相当します。
ジェネリクスは多くの言語にあるので、馴染みがあるでしょう。
rustのジェネリクスやはその他の言語のジェネリクスに絶対にない特徴を持ちます。
swiftのジェネリクスは、複数の型を同じ関数形式として扱いたいときに使います。
rustのジェネリクスは、複数の型を同じ関数形式として扱いたいときにももちろん使いますが、
それ以外に、複数の所有権形式を同じ関数形式として扱いたいときに使います。
これについて解説してある参考書がほとんどないので、メモしておきます。
べき乗を行う関数を考えます。
何乗かを指定する値に移動と借用のどちらも渡したい場合は、トレイトをジェネリクスにする必要があります。
ここでは、BigIntに対しては借用、i64に対しては移動にしたい場合を考えます。
以下のようになります。
pub trait Power<T> { fn power(&self, n: T) -> Self; } impl Power<i64> for BigInt { fn power(&self, n: i64) -> Self { let n = BigInt::from(n); self.power(&n) } } impl<'a> Power<&'a BigInt> for BigInt { fn power(&self, n: &BigInt) -> Self { let mut t = BigInt::from(1); for _i in num_iter::range(BigInt::from(0), n.clone()) { t *= self; } t } }
- 作者: Jim Blandy,Jason Orendorff,中田秀基
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/08/10
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る