クレートとモジュールについて調べる

クレート

  • パッケージのことをクレートと呼ぶ
  • libクレートとbinクレートがある > libクレートならばlib.rsが、binクレートならばmain.rsがルートにあたるファイルです
    • src/lib.rsとsrc/main.rsを一緒に置くこともできる
      • その場合、主要な機能はlib.rs側で書くのが良いっぽい

モジュール

  • mod でモジュールが作れる
    • ネスト可能
    • サブモジュールは:: で参照できる
    • mod some_modulesome_module.rssome_module/mod.rs を参照する
  • Intellijでおもむろにmod some_module と書くと、勝手にsome_module.rs を作ってくれる
    • some_module_name/mod.rs は作れなさそう
  • extern crate some_modulesome_module を利用することを宣言する
  • like-this のように-(ダッシュ)が含まれるクレート名の場合、ダッシュがアンダースコアへ変換されるため extern crate like_thisと書く必要がある
  • module内のメソッドは、デフォルトでは外部に公開されない
    • pub をつけると公開される
    • structpub をつけてもメンバは公開されないので、個別にpubをつける必要がある
  • use some_module などのようにクレート名/モジュール名/メソッド名を指定すると、記述を省略できる
    • これをimportと呼ぶ
    • メソッド名をimportすると名前被りまくって死ぬのでやらない
    • use phrases::english::{greetings, farewells}; のようにまとめて書くこともできる
  • some_cratesome_module 内のsome_sub_modulesome_func を持っている場合を考える
    • 通常だとsome_crate::some_module::some_sub_module::some_func と書く必要がある
    • src/some_module/mod.rspub use self::some_module::some_sub_module::some_func と書いておくと、some_crate::some_module::some_func で呼べるようになる
    • pub use self::greetings::* のようにワイルドカードも使える
  • self とは
    • use はクレートのルートから絶対パスで表す
    • self はカレントディレクトリのパスを表す(相対パスの. )
    • super は一つ上のパスを表す(相対パスの.. )
  • メソッドの呼び出しは相対パス
    • ::some_funcのように 書くと絶対パス
  • extern crate … as …use … as … で、任意の名前でクレートのメソッドを参照できる
    • jsのimport as 的な感じ?
  • 同一パス下にある複数のモジュール/メソッドへのuseは{} で一度に書くことができる

Refer

Others

  • Intellijでmain関数を書くと左側に三角マークが出てクリックすると実行できた
    • 昨日は表示されなかったような。。。
    • Debugもあるけど、裏では何が走るんだろう

TODO