RustのModule
structの各メンバは、同一module内からは、pub/pri関係なくアクセス可能
特別扱いされるファイル名
↓は2019年のときのメモなので全体的に理解が終わっている
module
関数、構造体、トレイト、implブロックなどの要素の集合のこと
moduleの中にmoduleも入る
プロジェクト内のコード構造化のための機構
main.rsとlib.rsという'ファイル名'は特別
使い方としては、lib.rsにライブラリをまとめて、main.rsで使う
main.rsで一つ、lib.rsを含んだそれ以外で一つ、と別々のクレート(木箱)に入っている感じ(?)
main.rsの中にはmain()という関数が必要
main.rsとlib.rsがある時、main.rsから見える別のファイルはlib.rsだけ?
見たければlib.rsの中の記述を
code:rs
pub mod module_a // main.rsからも見えるようにpubを付ける
mod句ってmoduleに名前をつける時と、moduleを読み込む時、両方で使うのか???mrsekut.icon
わかりにくくね??
名前をつけて、公開する時
code:rs
pub mod foo {
pub fn hello() {
println!("hello");
}
}
読み込む時
code:rs
mod foo;
exportする側
デフォルトではプライベート
pub句を付けることでパブリックになる
code: rust
// myという名称のモジュール
mod my {
// pubを用いてパブリックに変更
pub fn function() {
println!("called my::function()");
}
// モジュールはネストすることができる。
pub mod nested {
pub fn function() {
println!("called my::nested::function()");
}
}
}
構造体の場合、自身に加えフィールドにもpublic,privateを設定できる
importする側
moduleを読み込む時のmod
コンパイラはmod A;を見つけると
以下の両方をチェックする
A.rs
A/mod.rs
両方共ある、両方共ない場合、Errorになる
プロジェクト内のコードのどこからでも絶対パスで参照できる
絶対パス
::std::memのように::から始めると絶対パスを表す
この書き方は基本しない
use std::memのようにuseを使うと自動的に絶対パスになる
create::で始まるパスも絶対パス
code:rust
fn main() {
// モジュールによって、同名の関数を区別することができる。
my::function();
// パブリックな要素ならば、たとえネストしたものでも、
// モジュールの外からアクセスすることができる。
my::nested::function();
}
複数import
code:rs
use std::io::{stdin, BufRead, BufReader};
全import
code:rs
use std::io::prelude::*;
相対パス
superまたはselfを使う
use self::module_a
selfはディレクトリの.
現在のmodule
use super::module_a
superはディレクトリの..
superは親moduleのエイリアス
謎
以下の構成の時にエラーが出るのはなぜ?
わざわざディレクトリを分けないといけない?
code:tree
| Cargo.toml
|
\---src
| main.rs
| lexer.rs
| parser.rs
code:rs
// parser.
mod lexer; // help: name the file either parser/lexer.rs or parser/lexer/mod.rs inside the directory "src"
...
参考