Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

パッケージ化

私たちは今まで様々な関数を実装してきました。これらのたくさんの機能をまとめ、整ったフレームワークにするために、複数のファイルに分割しましょう。

ライブラリクレートの作成

私たちが開発するフレームワークを外部から読み込むライブラリクレートとして実装します。cargo new - lib で作成しましょう。今回はフレームワークの名前からstucrs とします。

次にこのようなディレクトリ構成にします。

alt text
※ 一部ファイルを省略しています。


今まで実装してきたmain.rs ファイルはtestフォルダ の中にありますが、それとは別にstucrs ライブラリのためをクレートを先ほどの説明で用意します。その後、stucrsの中のsrcfunctionsフォルダ、core.rsファイルを入れます。また、functionsフォルダに math.rs, matrix.rs, mod.rs ファイルを入れます。

ではこれらの追加したフォルダ、ファイルについて説明します。functions フォルダは今まで実装してきたFunction構造体である関数を入れるところであり、たくさんの種類があるため、種類ごとに関数を分けて保存します。今のところ、math.rs, matrix.rs を用意していますが、今後も関数を実装していくにつれ、新たなファイルが必要になるため、追加していきます。mod.rs は追加していったファイル(math.rs, matrix.rs)などを管理するためのファイルです。
core.rs ファイルはフレームワークの核となる機能を保存します。具体的にはVariable、RcVariable,Functionトレイト などです。なお、四則演算の関数はFunction構造体ですが、基本的な関数なので、core.rs に入れます。

core.rsのファイルは現在のリポジトリではcore_new.rs という名前になっています。

また、lib.rs にはRcVariable にオーバーロードするコードを移します。

lib.rs の中身

use core_new::RcVariable;
use core_new::{add, div, mul, neg, sub};
use std::ops::{Add, Div, Mul, Neg, Sub};

//演算子のオーバーロード

impl Add for RcVariable {
    type Output = RcVariable;
    fn add(self, rhs: RcVariable) -> Self::Output {
        // add_op関数はRc<RefCell<Variable>>を扱う
        let add_y = add(&[self.clone(), rhs.clone()]);
        add_y
    }
}

impl Mul for RcVariable {
    type Output = RcVariable;
    fn mul(self, rhs: RcVariable) -> Self::Output {
        let mul_y = mul(&[self.clone(), rhs.clone()]);
        mul_y
    }
}

impl Sub for RcVariable {
    type Output = RcVariable;
    fn sub(self, rhs: RcVariable) -> Self::Output {
        let sub_y = sub(&[self.clone(), rhs.clone()]);
        sub_y
    }
}

impl Div for RcVariable {
    type Output = RcVariable;
    fn div(self, rhs: RcVariable) -> Self::Output {
        let div_y = div(&[self.clone(), rhs.clone()]);
        div_y
    }
}

impl Neg for RcVariable {
    type Output = RcVariable;
    fn neg(self) -> Self::Output {
        let neg_y = neg(&[self.clone()]);
        neg_y
    }
}


pub mod core;
pub mod functions;  
           // <- 今後新しいファイルができたらここに追加

mod.rs の中身

pub mod math;
pub mod matrix; 
          // <- 今後新しいファイルができたらここに追加

基本的には今まで実装してきた関数のコードをそのままファイルに貼り付けるだけですが、一つだけ変更しなければならない点があります。

pubをつける

今まで実装して関数を外部クレートとして読み込むようになるため、一部の関数を外からアクセスできるようpub を付けます。これはユーザーがライブラリのあらゆる関数にアクセスできるのを防ぐために、外からアクセスできるものを設定するためのものです。

色々説明してきましたが、移行の仕方は実際のコードを見るのが一番手っ取り早いです。ここからリポジトリのstucrsを見てどう移すか、またどの関数にpubを付けるのかを確認してください。