LoginSignup
7
3

More than 5 years have passed since last update.

C言語マンに分かるようにRustをだらだら書こうぜ。

Last updated at Posted at 2018-08-14

ニコチューバーしながらだらだら書く。いいね!が付いている記事を ちょこちょこ更新する。

誰か読んでるなら 更新しよ……☆(^~^)

C, C#言語の void main() { }

根っこは同じコンピューターなので、実行形式ファイル は実行できる。
実行形式ファイル というのは単に エントリーポイント があるソースコードのことだぜ。
エントリーポイントが無いソースコードのことを ライブラリ と言う。
Rust言語でも エントリーポイントは main() 関数。

fn main() {
}

// リターンコードを返したかったら 一手間書ける。
fn main() {
    std::process::exit(0);
}

fn は 関数(function)の定義。

とりあえず rustを使い倒すディレクトリーを どこか1個決めろ。 わたしなら

C:\Users\Takahashi\projects_rust

にする。 [Windows]+[R]キーからの cmd 打鍵でもなんでもいいので コマンドプロンプトとか開け。 そして使い倒すディレクトリーをカレントにしろだぜ。
昔は ファイル・エクスプローラーの何もないところを[Shift]+右クリックでコマンドプロンプトに行くメニューがあったんだが 今のわたしのPCは PowerShellが出てしまう。

cd C:\Users\Takahashi\projects_rust
cargo new banana-banana-banana

でライブラリ用の banana-banana-banana 作業ディレクトリ作成。 Visual Studioマンなら ソリューションとかプロジェクトとかいうやつになる。 Rustではソリューションとかプロジェクトのことを クレート(crate) と呼ぶ。木箱。特に機能はない。cargoが使いやすいディレクトリのことだ。

cargo new grape-grape-grape --bin

で実行ファイル用の作業ディレクトリ作成。 いつも後ろの --bin を付け忘れてライブラリを作ってしまう。

### ビルドをするのは これだが、ほとんど使わない。
cargo build

### クリッピーをセットアップしろだぜ。コーディングの下手くそな部分を指摘してくれる。
cargo clippy

でカレントディレクトリをビルド、

cargo run

でビルドして実行になる。

cargo run --example banana

とか書くと main.rs ではなく examples/banana.rs が実行されたりする。

ディレクトリ構成

/
|
+--- .git/
|
+--- src/
|
+--- .gitignore
|
+--- Cargo.toml

ライブラリでも 実行ファイルでも構成は同じ。
とりあえず Cargo.toml というテキストファイルを開けだぜ。

[package]
name = "lesson_app"
version = "0.1.0"
authors = ["muzudho <muzudho1@gmail.com>"]

[dependencies]

[package] と書いてあるところが 自分の情報になる。
name が何になるのかイマイチ法則性が分からん。
モジュールを呼び出すときに使うので、パッケージ名に使えそうな名前に勘で修正しろだぜ。

[dependencies] と書いてあるところが 他のライブラリ(というかクレート)を呼び出すときに書く。クレートの数だけ [dependencies]を書く。
例えば

[dependencies.kifuwarabe_shell]
git = "https://github.com/muzudho/rust_kifuwarabe_shell.git"
rev = "6deac338e5ad49992f2f7bfe94c9415bf8382a26"

と書いたりする。 git hub のURLと コミットのリビジョン番号を書いておくと
cargo build とかで勝手にダウンロードするから楽。
しかし 調子に乗ってライブラリの依存をいっぱいすると
アプリの中で使用するライブラリは すべてバージョンが合っている必要がある。
TOML書き直すの めんどう。

よその木箱を使う。

TOMLで よその木箱を [dependencies] に並べたなら、ソースファイルでは次の2行を書くだけ。

extern crate kifuwarabe_shell;
use kifuwarabe_shell::*;

extern crate は、エントリーポイント(main.rsとか)の冒頭だけに1回書けばいい。
use は、クレートの中身を使いたいファイルの冒頭に毎回書く。

こんなん、やりたいんだろ

src
|
+--- main.rs
|
+--- apple.rs
|
+--- white/
|    |
|    +--- banana.rs
|    |
|    +--- casava.rs
|
+--- black/
     |
     +--- dragonfly.rs
     |
     +--- ebifly.rs

で、エロ画像フォルダのように整理したい気持ちは分かる。
- mod.rs
- pub mod
- use
使いこなすことでできる。ここで、
- crate は (git hub とかからダウンロードしてくる) 他の木箱
- mod はローカルのディレクトリ、ファイル、ファイルの中のmodスコープ。要は物理的にも論理的にも住所。名前空間。
- use はプログラムに出てくる関数名とか構造体名

と、 違い を覚えておけだぜ。もう忘れることはできない。

|
+--- main.rs
|
+--- banana.rs

例えば main.rs から、 main.rs の隣の banana.rs の中の何かを使いたいときは、

mod banana;
use banana::*;

とか書く。 mod が分からん。分かる。

mod は、エントリーポイント(main.rsとか)の冒頭だけに1回書けばいい。
ローカルPCの中のファイルパスを通している気分になれだぜ。

/// サンプルコード main.rs
mod banana;
use banana::*;

fn main() {
    println!("1 + 2 = {}", add(1,2));
}
/// サンプルコード banana.rs

/// 足すだけ☆(^~^)
/// 
/// # Arguments
/// 
/// * `value0` - 左項。
/// * `value1` - 右項。
/// 
/// # Returns
/// 左項+右項。
pub fn add(value0: i32, value1: i32) -> i32 {
    value0 + value1
}

banana.rs から main.rs の関数呼ぶにはどうすればいいの?

もちろんできる。 use *; を使う。

/// サンプルコード main.rs
mod banana;
use banana::*;

fn main() {
    println!("1 + 2 = {}", add(1, 2));
    println!("11 - 7 = {}", sub_sub(11, 7));
}

/// 引くだけ☆(^~^)
/// 
/// # Arguments
/// 
/// * `value0` - 左項。
/// * `value1` - 右項。
/// 
/// # Returns
/// 左項-右項。
pub fn sub(value0: i32, value1: i32) -> i32 {
    value0 - value1
}
/// サンプルコード banana.rs
use *;

/// 足すだけ☆(^~^)
/// 
/// # Arguments
/// 
/// * `value0` - 左項。
/// * `value1` - 右項。
/// 
/// # Returns
/// 左項+右項。
pub fn add(value0: i32, value1: i32) -> i32 {
    value0 + value1
}

/// 引くだけ☆(^~^)
/// 
/// # Arguments
/// 
/// * `value0` - 左項。
/// * `value1` - 右項。
/// 
/// # Returns
/// 左項-右項。
pub fn sub_sub(value0: i32, value1: i32) -> i32 {
    sub(value0, value1)
}

なんで use main::*; ではないのか。 use *; とか 想像外のところにある気がする。
全部 使えてしまえそうな気さえするが、とりあえず mainの中身を見に行くように動いている気がする。

Rustの2018年のドキュメント のどこに載ってるのかも分からん。

ディレクトリーで分けたら。

src
|
+--- main.rs
|
+--- white/
     |
     +--- banana.rs
     |
     +--- casava.rs

こうしたいんだろ。足りてない。

src
|
+--- main.rs
|
+--- white/
     |
     +--- banana.rs
     |
     +--- casava.rs
     |
     +--- mod.rs

mod.rs が要る。何それ?

/// mod.rs の中身。

pub mod banana;
pub mod casava;

こんな mod.rs を、各ディレクトリーに入れる。何をやっているのかというと、
公開するファイルを並べていると思えだぜ。

white/banana.rs を使いたいときは、

use white::banana::*;

と書けだぜ。 white はディレクトリ名じゃないのか、というところだが、 mod.rs ファイルを置いているディレクトリは 名前空間になる感じ。

他には、

use banana;

とファイル名を決め打ちして、

    banana::add(1, 2)

と書けば、名前が突合しても 区別することができる。
ぜったい banana.add(1, 2) と間違えて書くだろ。 C++マンは :: でネームスペースを区切っていると分かるかもしれないが、 C#マンは . で名前を区切るのに慣れている。

誰が読んでるか知らないが。

Rust言語の話しはこっちにも書いている。
https://qiita.com/muzudho1/items/7d35c3e24db317ebdf08

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3