はじめに
今日はMM初フルコンボ記念日😆 nikkieです。
『Rustの練習帳』、はじめました。
鹿児島への道中読んでいて、このたび写経に着手です。
目次
『Rustの練習帳』
副題は「コマンドラインツールの作成を通してRustを学ぶ」
私はPythonを愛してやみません。
特にコマンドラインツールを数々書いてきました。
好きな標準モジュール(の1つ)はargparseで、このブログにいくつも記事があります1。
なので「コマンドラインツールの作成を通して」というのは私にはしっくりきます。
著者はRustとLinuxコマンドについて豊富な知識を持っているようです2。
そこからの逆算もあると思うのですが、この本は一歩一歩進みます。
その一例としてプロジェクトの導入を取り上げます。
前提:nikkieのRustのレベル感
もう全然わかんないよ!!
所有権って何!?
完全に理解した感がまったくありません \(^o^)/オワタ
そんな状態でも過去独力で作ったのがこちら。
所有権を理解できていないですが、日付計算はできました
Pythonの開発環境でRustの存在感が増しており(Ryeやuv)、これらのコマンドの実装を読んでいたという特殊な境遇にあります。
Rustをもっと読めるように、さらには書けるように、なりたい...!
Rustのプロジェクト
書籍ではプロジェクトですが、Cargoのドキュメントからパッケージと同義語と理解しました。
https://doc.rust-lang.org/cargo/appendix/glossary.html#project
Another name for a package.
ここで書いているのは要はcargo new
のことなのですが、
Rust初学者の目線からすると、ここに至るまでの導入がうまかったと感じています。
初手cargo new
はこれまでにも出会ってきましたが、『Rustの練習帳』は小さいステップを重ねて進んでいきました。
3段階でプロジェクト導入
1. どこでもいいからhello.rs
を作る
『Rustの練習帳』がまずやったのは、hello.rs
を作ることでした。
なお、開発環境の構築はまえがきで案内されています。
% rustc --version rustc 1.78.0 (9b00956e5 2024-04-29)
% cat hello.rs fn main() { println!("Hello, world!"); } % rustc hello.rs % ./hello Hello, world!
「Hello, World!」と出力する関数を書き、実行ファイル(バイナリ)にコンパイル!
実行できました。
Rustのプログラムを動かせちゃったぜ〜✌️🐑
この流れは、Pythonのチュートリアルを思い起こさせます。
スクリプト(例:fizzbuzz.py
)を書いて、インタプリタ(python
)で実行!
https://pycamp.pycon.jp/textbook/2_intro.html#fizzbuzz
2. srcディレクトリを導入
一度Rustのプログラムを動かした後で、ディレクトリ構成が導入されます
. ├── hello └── src └── hello.rs
% mkdir src % mv hello.rs src/ % rustc src/hello.rs $ ./hello Hello, world!
すでに動いているプログラムがあるので、ディレクトリに配置するだけで済みました。
なるほど、src
の下に置くんですね〜
ちなみにPythonはディレクトリ配置が 自 由 です。
src-layoutとflat-layoutのように呼ばれ3、OSSのライブラリでは前者が多くなったそうです。
3. cargo new
「Cargoを使うとより簡単だよ」と案内されます。
ディレクトリを一度削除してからcargo new hello
!
以下のように生成されました。
. # helloディレクトリ(cdしてきた) ├── Cargo.toml └── src └── main.rs
% cat src/main.rs fn main() { println!("Hello, world!"); }
そして、cargo run
を使えばrustc
を叩かなくてよくなると教わりました。
% cargo run --quiet Hello, world!
終わりに
めちゃめちゃ小さな点ですが、『Rustの練習帳』がcargo new
まで一歩一歩導入していて初学者視点ではよかったと書いてきました。
言語の導入って初めて知ること一度にたくさんドーン!でおまじないが残っちゃうケースもあると思うんですが、練習帳の導入は一通り理解できた感があってよかったです。
cargo
コマンドが便利なことも体験したので、使い倒していくぞ!
写経の状態
ここまで経験して、Ryeがsrc-layoutを強制する背景は見えた気がします4。
RustのCargoではそれが唯一絶対のルールですから。
- コマンドラインツールカテゴリをどうぞ!↩
- Pythonについて私から補完しておきました ↩
- pytestのドキュメントなどで見かけます https://docs.pytest.org/en/stable/explanation/goodpractices.html#choosing-an-import-mode↩
- なお私としては、ある言語に対して他の言語の文化を絶対のものとして持ち込むのは受け容れがたいです。その言語を使いこなすために、「郷に入っては郷に従え」が有効だと思うので(このトピックはどこかで記事を書くかも)↩