Rust学習 - ブロックチェーンを作りながら基本を学ぶ#1
今日も学習していく。基本を学んでる間、猫さんの画像でいきましょう。にゃーんってやつです。黙々と頑張る。
このマガジンの構成は「本題」「本題+α」の2段構成で進めます。
本題は今日の頑張り、そして、本題+αが命綱。しばらくはこの構成でいく
※一言でまとめると、「基本構文についてわからないことがたくさん出てきた。もう少し学習が必要」という内容。
本題
さぁ、やっていこう。とりあえずRustインストール
インストールは Get Startedを参照。
https://www.rust-lang.org/ja/learn/get-started
git clone git@github.com:Eigo-Mt-Fuji/blockchain-rust.git
Javaと比較してRust構文を紹介してくれる。英語やん。しんどい助かる。
実際に書いていく。この流れで開発環境を整えます。
Rust向けのVSCode Extension。「rust-analyzer」だけ導入。
コード補完、型補完、型識別子などの定義ジャンプ、シンタックスハイライトに頼る。よろしくおねがいします。
Visual Studio Codeのこと、ヴィスコって呼ぶというのはホント?強いエンジニアはそう呼ぶって聞く。
基本を理解していく。
「関数」「構造体」「プリミティブ型」、「予約語」の確認
日本語の公式リファレンスに関連付けながら、丁寧に見ていく。
関数
fn
impl
(型の)関連関数とメソッドの定義 https://doc.rust-jp.rs/rust-by-example-ja/fn/methods.html
new
コンストラクタに相当。構造体の実態を生成するメソッドのデファクトスタンダード。予約語ではなさそう
構造体
struct
構造体
Rustでは構造体=structは、カスタム型という分類の中に属するらしい
構造体定義にも種類がある。3種類。
タプル、クラシック、ユニット
クラシックがいわゆるC言語とかの構造体と同じ。基本はコレ
「タプル」もC++やPythonなどでもおなじみの、いくつかの属性の組。Rustではタプルをstructキーワードで表現する仕様。タプル化したときは個別の属性には名前がつかない。組となるそれぞれの属性が構造体の名前から十分自明である場合はつかってよさそう
ユニットはなぞ。属性を全く持たない構造体。ジェネリック型を扱う場合に有効らしい。今後調査。
このサイトで構造体型の説明が確認できる
プリミティブ型(基本データ型)
今日主に扱ったのは2つ。
符号なし整数
ビット数ごとにu8,u16,u32,u64,u128という定義済みのデータ型が存在
任意のデータ型を定義できる
配列(primitive array)
固定長配列 https://doc.rust-lang.org/std/primitive.array.html
[要素の型;配列の長さ(要素数)]
具体例:要素の型「u8 ※unsigned integer 8bit」、「要素数が16」の固定長配列
[u8;16]
文字列は?
Rustには、言語の核として1種類だけ文字列型が存在する。
文字列スライスの「str」
通常「&str」という形でソースに登場する。「&str」は、文字列スライス「str」の借用。
「String」がRustにおける基本データ型としての文字列型、というわけではないらしい。String型は、標準ライブラリ(std)の中にコレクション型として定義されている。String型がコレクションというのは、つまり「文字=char」のコレクション(=集合)。
「文字列スライス」という概念について。以下のリンク先に図解がある。
文字列スライス「&str」は「String型」の一部。
以下のコードでは「someSliceOfMyStr」は「myStr」の文字列スライスと言える模様。
ちなみに &myStr はmyStrへの参照という意味であるらしい。
let myStr = String::from("hello");
let someSliceOfMyStr = &myStr[0..2];
わからないことがたくさん出てきた。履修が必要。
借用とは?
参照とは?参照ではないとすると何?
スライスとは?
文字列スライスが言語の核とのことだが、一方で標準ライブラリの「String型」の一部を指すというのはどういうこと?
どっちが先?
そもそも単に文字列ではなく、「文字列スライス」という表現で定義づけた理由は?
予約語
https://doc.rust-jp.rs/book-ja/appendix-01-keywords.html
今日使ったのはこちら
pub
公開性
構造体フィールド、implブロック、モジュールで公開性について言及
privateとかはない。pubをつけなければ非公開扱いになる模様
可視性の概念は理解しておく必要がある。モジュール内の関数の場合、モジュールの外から呼び出せるのはpub修飾子がつけられている関数だけとのこと。
struct
構造体
impl
関係関数、メソッド
fn
関数
for
impl Xxx for Yyy
impl for 構文は特定の型に対してtraitの実装を定義することを意味する
forは、イテレータを使用した繰り返し処理の構文でも使う
「高階ライフタイム」という見慣れないワード
ライフタイムはRustのコンパイラが借用に問題が無いことを確認するための仕組み。変数が生成されてから破棄されるまでがライフタイム。スコープとは違うので注意。おそらく変数が破棄されるまでには、借用の概念も含めて考えると必ずしも1つの変数のスコープがライフタイムと一致するとは限らないのだと理解した
https://doc.rust-jp.rs/rust-by-example-ja/scope/lifetime.html
スコーピングの規則の章に詳しい説明がある。これは精読するひつようがありそう
本題+α
今日は、何作ろうか考えていました。並行して考えているテーマです。
ここではRust学習をしていく心つもりなので、「自分は、どんなRust学習をしていけば、幸せになれるだろうか」と考えました。
結論だけ書きますが、
↓ように考え、そのように学習を仕向けて行こうと思います。
とりあえず基本は大事やろ。文法基礎。
実践という点では、WebのAPI開発と、WebAssemblyのビルドができればよいと思う。
既出のエコシステムの動向に追いつかねば。つまり、技術スタック、ライブラリの使い方、開発環境は調査して実践しなければわからない。
ちなみに、今は情報系の学生はRustを学んで卒業してくるらしい。大学のシラバスを参考に学ぶべし。
https://ytakano.hatenablog.com/entry/2020/12/23/204528
いずれにしても、とりあえず基本から、です。
焦らず、継続。またあした頑張ります!
では!
この記事が気に入ったらサポートをしてみませんか?