11章トレイトとジェネリクス

コンピュータ科学者は、ケース1、ケース2、ケース3のように分けて、均一でない構造にして扱う傾向がある。一方、数学者はシステム全体を統合する唯一の原理を求める傾向がある。

−Donald Knuth†1

[†1] 訳注:米国のコンピュータ科学者。アルゴリズム解析の父とも称せられる。1974年にチューリング賞を受賞している。組版システムTeXの作者としても知られる。

プログラミングにおける最大の発見は、さまざまな型の値を処理するコードが書けるということだ。まだ書かれていない型の値を処理することすらできる。2つの例を示す。

  • Vec<T>はジェネリックなベクタだ。任意の型に対してベクタを作ることができる。Vecを書いたプログラマが考えもしなかった、ユーザが定義した型に対しても機能する。
  • FileTcpStreamを始めとするさまざまな型に、.write()メソッドが実装されている。このような型を仮にwriter型と呼ぼう。プログラム中では、writer型を参照として保持し、それにデータを送ることができる。実際の型を気にする必要はない。後から誰かが新しいwriter型を追加した場合でも、プログラムはその型を既にサポートしていることになる。

もちろん、この機能はRustが新たに導入したものではない。この機能は多相性もしくはポリモルフィズム(polymorphism)と呼ばれ、新たなプログラム言語技術として1970年代に盛んに研究された。現在では、この機能は事実上ほぼすべての言語で提供されている。Rustは2つの関連する機能で多相性をサポートする。トレイトとジェネリクスだ。多くのプログラマにとって、これらの概念はなじみ深いものだと思うが、Rustでは、Haskellの型クラスにヒントを得た新たなアプローチが取られている。 ...

Get プログラミングRust 第2版 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.