複雑すぎて理解不能なので簡単にまとめてみた。
概要
Rust言語にて、外部ファイルに定義したモジュールをインポートする方法をまとめる。
まとめ
- 親子関係の定義
子モジュール/mod.rs
というディレクトリとファイルで、子モジュールを外部ファイル化する- 親ファイルの最上位スコープで
mod 子モジュール;
と書くことで、親子関係と可視性(pub
)を定義する
- 参照(親子)
- 2-1. 外部クレート:
pub use 外部クレート名::pubな要素名;
- 2-2. 自クレート:
crate::pubな要素名;
- 2-3. 自モジュール:
self::要素名;
- 2-4. 親モジュール:
super::要素名;
- 2-5. 子モジュール:
子モジュール名::pubな要素名;
- 参照(親子以外)
- どこから
use crate::my_mod;
use super::brother;
use self::child;
- 何を(すべて)
use self::child::*;
- 何という名前で(
C
)use self::child as C;
- 公開もしたい(
pub
)pub use crate::my_mod;
参考
超むずい。正確な理解は後回しにしよう。入門者だし。でも非常にありがたい情報。感謝。
言語仕様
- Rust2015
- Rust2018
バージョンによって違いがある。
::
でなくcrate::
で絶対パス指定するようになったextern prelude
という外部クレートがスコープに入る機能が追加されたextern crate クレート名;
は使わない- 外部クレート: main.rsでは
use 外部クレート名;
とすればOK - 自クレート:
crate::lib.rsに定義されたpubな要素名
とすればOK
- 外部クレート: main.rsでは
所感
以下のドキュメントで学習していたが、バージョン差異があるなんて聞いてないぞ……。Rust2015のインポートで説明されているっぽい。
- https://doc.rust-jp.rs/book/second-edition/ch07-01-mod-and-the-filesystem.html
- https://doc.rust-jp.rs/book/second-edition/ch07-02-controlling-visibility-with-pub.html
ネットでググっても2015の説明しかなかったりする記事もあって情報が錯綜している感。Pythonを学習していたときもこうだったな……。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rustを学んでみたい(プログラミング言語)
- Rustの環境構築
- RustでHelloWorld
- Rustの和訳ドキュメント
- Cargoでプロジェクト作成・ビルド・実行
- クレートとは?
- Rustで関数を使ってみる
- Rustでモジュールを使ってみる
- Rustで乱数を生成する(rand)
- Rustで標準入力する(std::io::stdin().read_line())
- RustでMatch判定する(match)
- Rustでprintとread_lineを1行にする方法
- Rustで数当てゲーム
- クレート名にドット.が使えない
- Rustの変数と可変性(let, mut) error[E0384]: cannot assign twice to immutable variable
x
- Rustのimmutable束縛とconst定数の違い
- RustのREPL、evcxrのインストールに失敗した
- Rustでコンパイルするときの変数未使用warningを消す
- Rustの変数(再代入、再宣言(シャドーイング))
- Rustのシャドーイングについて
- イミュータブルについて(副作用)
- Rustの定数(const)
- Rustのデータ型(数値)
- Rustのデータ型(論理)
- Rustのデータ型(文字)
- Rustのデータ型(タプル)
- Rustのデータ型(配列)
- Rustの関数
- Rustのif式
- Rustのくりかえし文(loop)
- Rustのくりかえし文(while)
- Rustのくりかえし文(for)
- Rustの所有権(ムーブ)
- Rustの所有権(関数)
- Rustの所有権(スライス)
- Rustの構造体(定義とインスタンス化)
- Rustの構造体(プログラム例)
- Rustの構造体(メソッド)
- Rustの列挙型(enum)
- Rustの列挙型(enum)
- Rustの列挙型(enum)
- Rustのmatch(制御フロー演算子)
- RustでNULLを扱う(Option, Some, None)
- NULL参照は10億ドルの失敗だった
- Rustの列挙型に独自表示を実装する(E0277 対策 std::fmt::Display 実装)
- RustのIfLet(matchの糖衣構文)
- Rustのプロジェクト構造
- Rustのcargoでライブラリ&テスト(単体、結合)
- Rustのモジュール(mod)
- Rustのモジュール(pub)
- Rustのmod参照方法(
mod 子モジュール名;
,use 要素名;
,extern crate クレート名;
,super
)