治療薬の開発を専門とするバイオエンジニアリング企業で働いています。
チームは、まれな種類のがんに対する標的療法を開発するという新しいプロジェクトを任されたばかりです。
話はとても複雑ですが、基本的な考え方はこうです。人の体では、特定のタンパク質が作られすぎてしまうことがあります。 それによって、さまざまな問題が引き起こされます。
しかし、ごく特定の分子(マイクロRNAと呼ばれます)を作ることができれば、そのタンパク質が作られるのを防げます。
この技術はRNA Interferenceと呼ばれています。
ここでの課題は、与えられたDNA配列のRNA相補体を求めることです。
DNA鎖もRNA鎖も、ヌクレオチドが並んだ配列です。
DNAに含まれる4つのヌクレオチドは、アデニン(A)、シトシン(C)、グアニン(G)、チミン(T)です。
RNAに含まれる4つのヌクレオチドは、アデニン(A)、シトシン(C)、グアニン(G)、ウラシル(U)です。
DNA鎖が与えられたとき、転写されたRNA鎖は、それぞれのヌクレオチドをその相補体に置き換えることで作られます。
G -> C
C -> G
T -> A
A -> U
入力と出力がどのような構造になっているか見てみたいときは、テストスイートの例を参照してみてください。
構造体のフィールドをプライベートにし、OptionやResultを返す公開されたnew関数(ここではDNA::newとRNA::new)を使うことで、DNAの内部表現が正しいことを保証できます。有効なDNA文字列には必ず有効なRNA文字列が対応するので、into_rnaからResultやOptionを返す必要はありません。
これが、テストで目にする型シグネチャの理由です。
DNA::new()とRNA::new()の戻り値の型は、どちらもResult<Self, usize>です。ここでエラー型のusizeは、最初の無効な文字のインデックス(utf8バイトではなく、文字単位のインデックス)を表します。