第90回(最終回)です。前回はこちら。
[第90回の様子]
2023/08/30に第90回を開催した。唐突だけどRust By Example日本語版を完走したので、これでRust dojoはおしまい!
内容としてはRust By Example 日本語版23. 互換性と24. 周辺情報に取り組んだ。
参加者は自分を入れて6人。最初は10人ちょっといたメンバーが入れ替わり立ち替わりしてなんとかここまでやってこれた。1回でも参加してくれた同僚の皆様に感謝。
[学んだこと]
- 23. 互換性
- 可能な限り前方互換性を保っているが例外もある
- 23.1. 生識別子
- 新しいキーワードが導入された場合に、古いエディションのRustを利用したライブラリで、新しいキーワードと同じ名前の関数が使われているとエラーになる
- 2018年エディションではtryというキーワードが追加された
// 2015年エディションでコンパイルされたfooクレート extern crate foo; fn main() { foo::try(); } // 2018年エディションでは以下のコンパイルエラー error: expected identifier, found keyword `try` --> src/main.rs:4:4 | 4 | foo::try(); | ^^^ expected identifier, found keyword
- 生識別子(
r#
)を利用して以下のように回避できる
extern crate foo; fn main() { foo::r#try(); }
- 24. 周辺情報
- 24.1. ドキュメンテーション
- ドキュメントはcargo docコマンドでビルドできる
- cargo testコマンドでドキュメンテーションテストも実行される
- ドキュメンテーションテスト単体で実行する場合はcargo test --doc
- Pythonにもdoctestという似たような仕組みがある
- 内部的にはrustcコマンドとrustdocコマンドを実行している
- rustdocでは
///
をドキュメンテーションコメントとしている - マークダウンを利用可能
#![crate_name = "doc"] // これは通常のコメント /// これはドキュメンテーションコメント pub struct Person { /// ジュリエットがどんなに名前というものを嫌っていようと、 /// 人物には名前が必要です。 name: String, } impl Person { /// 与えられた名前を持つpersonを返します。 /// /// # Arguments /// /// * `name` - `person`の名前を表す文字列のスライス /// /// # Examples /// /// ``` /// // バッククォートによってRustのコードをコメント中に挟むこと /// // もできます。`rustdoc`に--testを渡せば、テストも行えます! /// use doc::Person; /// let person = Person::new("name"); /// ``` pub fn new(name: &str) -> Person { Person { name: name.to_string(), } } }
- cargoを使わずrustc、rustdocコマンドをそれぞれ実行する場合は以下のようになる
# コードをライブラリとしてビルド $ rustc doc.rs --crate-type lib # rustdocでライブラリを指定してテスト $ rustdoc --test --extern doc="libdoc.rlib" doc.rs
- #[doc]アトリビュートに以下の値を指定できる
- inline:別のドキュメントに埋め込める
- no_inline:別のドキュメントに埋め込むのを阻止
- hidden:ドキュメンテーションに含めない
// futures-rsライブラリでの利用例 #[doc(hidden)] pub use self::async_await::*;
- 24.2. プレイグラウンド
-
Rust PlaygroundではWebブラウザでRustを実験できる
-
mdbookと組み合わせてコードを実行可能にできる
- Rust公式ドキュメントで「実行」ボタンがついているものはRust Playgroundで実験ができる
[まとめ]
モブプログラミングスタイルでRust dojoを開催した。