ニコチューバーしながらだらだら書く。いいね!が付いている記事を ちょこちょこ更新する。
誰か読んでるなら 更新しよ……☆(^~^)
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