『ゼロから学ぶRust』を読む
メモリの内部的な構造についての言及や実装の概念図など非常に嘘が無い説明を心がけているという印象
逆に、ある程度メモリ、ポインタなどの概念を事前に理解しておく必要があるかも。
C, C++などをやったことのない初学者が一番初めに手をつけるには難しいかも。
取り扱う範囲、取り扱わない範囲を明確にしていているため非常に丁寧。
「Rustでは、 println!など、連続するアルファベットの後ろに「!」が付いている呼び出しがマクロの呼び出しとなる。マクロは、ある種のパターンを簡潔に記述するために用いられる。図 2. 8は、マクロの概念図を表したものである。我々が書くコードはマクロを含むソースコードであるが、 Rustコンパイラは、マクロ呼び出しを解釈して対応するソースコードに展開し、マクロを含まないソースコードに変換してから、実行バイナリを出力する。 自分で独自のマクロを定義することもできるが、本書では割愛させてもらう。」(2.2.7 マクロ)
コラムが非常に面白い
途中に挟まるTipsもおしゃれで面白い
2.2.5 パターンマッチ
if let構文はよく使うから覚えておく。
「パターンマッチと類似の式として、 if letと while letがある。 if letは「あるパターンにマッチした場合にのみ、何らかの処理を実行する」という記述ができ、 while letは「あるパターンにマッチし続ける限り、何らかの処理を繰り返し実行する」という記述ができる。 if letと while letは、以下のように書ける。 なお、 if letには elseが書ける。」
—『ゼロから学ぶRust システムプログラミングの基礎から線形型システムまで (KS情報科学専門書)』高野祐輝著
code: .rs
if let Some(n) = maybe_fail(){
println!("{n}");
};
while let Some(n) = maybe_fail(){
println!("{n}");
}
4.4 トレイト制約
ジェネリクスやトレイトを用いる際、ある型引数がある性質を持つという制約を設けたい場合がある。トレイト制約(trait bound)を用いると、型引数が特定のトレイトを実装していることを要求できる。 高野祐輝. ゼロから学ぶRust システムプログラミングの基礎から線形型システムまで (KS情報科学専門書) (p.159). 講談社. Kindle 版.
code:.rs
use std:ops::Mul;
fn square<T>(x:T) -> T
where
T: Mul<OUtput = T> + Copy,
{x * x}
whereキーワード以降に記述している部分。
型引数Tがstd::ops::Mul Traitと Copy Traitを実装していないといけない。
serdeのDeserializerを書くときとかにも使用した覚えがある。その時はDeserialiseをトレイト制約として含める必要があった。 4.5 動的ディスパッチ
複数の異なるエラーが関数の中で買える場合に使用する
code:.rs
struct ErrorA; // Display, Errorのimplは割愛
struct ErrorB; // Display, Errorのimplは割愛
fn error_a() ->Result<(), ErrorA>{
Err(ErrorA)
}
fn error_b() -> Result<(), ErrorB>{
Err(ErrorB)
}
fn error_ab() -> Result<(), Box<dyn std::error::Error>>{
error_a()?
error_b()?
Ok(())
}
4.6 スーパートレイト
ある機能を実現するためには、別の機能が必要であるという要件を記述する方法。
例)HouseはLocationとPersonというトレイトを実装しなければならない
code:.rs
trait Location {
fn address(&self) -> &str;
}
trait Person{
fn name(&self) -> &str;
}
trait House: Location + Person {}
fn print_house_info(house: &dyn House){
println!("owner: {}", house.name());
println!("address: {}", house.address());
}
trait House: Location + Person がHouseトレイトの定義で、LocationとPersonをHouse トレイトのスーパートレイトという。
スーパートレイトを持つトレイトの実装例
code:.rs
struct MyHouse{
address: String,
owner: String,
}
impl Location for MyHouse{
fn address(&self) -> &str{
&self.address
}
}
impl Person for MyHouse{
fn name(&self) -> &str{
&self.owner
}
}
impl House for MyHouse{}
fn main() {
let my_house = MyHouse{
address: "123 Main St".to_string(),
owner: "John Doe".to_string(),
};
print_house_info(&my_house);
}
4.5 存在型
使い処がいまいちわからないSSS.Leopom.icon
第5章 モジュール・ドキュメント・テスト
5.1 クレートとパッケージ
main.rs はバイナリクレートの、lib.rs はライブラリクレートのクレートルート(crate root)と呼ばれる特殊なファイルで、このファイルを頂点として、その下に複数の依存ファイル(モジュール)が木構造でぶら下がっている(図5.1左)。
高野祐輝. ゼロから学ぶRust システムプログラミングの基礎から線形型システムまで (KS情報科学専門書) (p.179). 講談社. Kindle 版.
lib.rsを意識したことがないが、こんなのファイルにあったか?SSS.Leopom.icon
6 正規表現
6.1 オートマトン