Rustで依存関係を追加する

Hello,World!の次のチュートリアルであるRustアプリケーションへ依存関係の追加を行います。

 

Rustで依存関係を追加する

Rustアプリケーションへ依存関係を追加します。 Rustのパッケージレジストリであるcrates.ioには、さまざまな種類のライブラリがあるようです。また Rustでは、パッケージのことを「crates」と呼ばれているようです。

Crate(クレート)とは

crates(クレートkrāt)は木箱(Google翻訳)。crateだと木枠という意味らしいです(Google翻訳)。Rustにおけるパッケージのことで、パッケージとは、なにかの機能をもったプログラムの集まりのことです。

では、Hello,World!で作成したプロジェクトを変更していきましょう。

チュートリアルに習い、「ferris-says」というcreateを呼び出してみます。

ferris-says」のとは、フェリスというカニのキャラクターが話してくれるAAを表示するcrateです。ちなみにフェリスはRUSTの非公式マスコットらしいです。

非公式マスコットってふなっしーを思い出しました笑

Ferris

rustaceanというページで画像やGIFがのっています。

https://rustacean.net/

また、sourceがGitHubで公開されています。

https://github.com/mgattozzi/ferris-says

Cargo.tomlへ依存関係を追加する

「Cargo.toml」とは、Rustアプリケーションのマニフェストファイルで、メタデータや依存関係を保存(定義)します。

「Cargo.toml」を開いて、「dependencies」(依存関係)へ下記を追加します。

[dependencies]
ferris-says = "0.1.1"

上記は依存関係にcrateの「ferris-says」バージョン”0.1.1″を追加したという意味です。

 

実際の編集した画像(VSCODE)

続いて、プログラム本体である、「main.rs」を編集します。

 

main.rsを編集して依存関係を追加したcrate(クレート)を利用する

「src」フォルダ直下にある「main.rs」の内容をすべて消して下記を入力します。

main.rs

保存したら実行してみます。

 

Cargo RUNで依存性を追加したRustアプリケーションを実行する

では、実行してみましょう。

コマンドプロンプトを開いて、プロジェクトルート(今回の例だとhello-rust直下)から「cargo run」を実行します。

下記の結果が表示されます。

非公式マスコットのフェリスのAAが表示されました。

実際に実行した画像

crateの「ferris-says」の機能を利用して、フェリスのAAが表示されました。

依存性を追加してRustアプリケーションへ機能を追加、利用することができました!!!

 

コードの解説

 

use ferris_says::say;
use std::io::{stdout, BufWriter};

use で利用する下記2つのcrateを指定します。

・「ferris_says」の「say」・・・フェリスのAAを表示する機能
・「std」の「io」の「{stdout, BufWriter}」・・・コンソールに表示する機能

 

次にmain関数内の処理です。

    let stdout = stdout();
    let out = b"Hello fellow Rustaceans!";
    let width = 24;

「stdout」には、コンソールにメッセージを表示する機能を設定します。

「out」には、メッセージを文字列で設定します。

「width」には、メッセージ表示幅を数値で設定します。

全ての行の先頭にある「let」とは、変数を定義しています。
※正確には「let」は束縛を導入するらしいです、このあたりは別途別の投稿にまとめようと思います

    let mut writer = BufWriter::new(stdout.lock());
    say(out, width, &mut writer).unwrap();

「let mut」で変更可能な変数を定義します。

1行目で「writer」にコンソールに文字を書き出す機能を設定します。

2行目でフェリスcrateのsay関数を呼び出します。

out:メッセージ、width:メッセージの幅のサイズ、writer:書き込み機能を渡しています。

「&mut」は、元の変数(ここではwriter)の参照および編集権限を渡しています。(値渡しのようなイメージですが、こちらも別の投稿にまとめようと思います)

最後の「unwrap()」は、say関数からの返された型(Result<>)から中身をとりだしています。

試しに「unwrap()」を削ってビルドすると下記のワーニングが表示されます。

C:\workspace\hello-rust>cargo build
   Compiling hello-rust v0.1.0 (C:\workspace\hello-rust)
warning: unused `std::result::Result` that must be used
  --> src\main.rs:10:5
   |
10 |     say(out, width, &mut writer);
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: #[warn(unused_must_use)] on by default
   = note: this `Result` may be an `Err` variant, which should be handled

    Finished dev [unoptimized + debuginfo] target(s) in 1.00s