Rust学習 - ブロックチェーンを作りながら基本を学ぶ#2
今日も暑い。暑いので画像は空の写真にしておいた。今日はブロックチェーンを作りながら基本を学ぶ2度めのチャレンジだった。以下の記事の再チャレンジ。文法を学習したことによってどれだけ改善されたか。
本題
まず、動いたプログラムのコードを置いておこう。
$ cargo run
Compiling blockchain-in-rust v0.1.0 (/Users/e_fujikawa/Documents/git/blockchain-rust)
Finished dev [unoptimized + debuginfo] target(s) in 0.42s
Running `target/debug/blockchain`
Blockchain rust Block
構文を理解しながらブロックを表現する構造体を定義して、実行することができた。この調子で、ブロックチェーンを作りながら学ぶシリーズをやっていく。
現場からは以上
本題+α
ついでなので、プログラムを変えてみる。
上記のプログラムはたしかに動作した。
その後、以下のコミットでBlockHash型を「block_hash.rs」という別なファイルに移動したところ、「no in the root」というエラーになり実行できなくなった。
どうすれば動くようにできるか、そしてなぜエラーになったのか、という問題。
実行して出てきたエラーは以下の内容。
$ cargo run
Compiling blockchain-in-rust v0.1.0 (/Users/e_fujikawa/Documents/git/blockchain-rust)
error[E0412]: cannot find type `BlockHash` in this scope
--> src/block.rs:8:15
|
8 | pub hash: BlockHash,
| ^^^^^^^^^ not found in this scope
error[E0412]: cannot find type `BlockHash` in this scope
--> src/block.rs:9:26
|
9 | pub prev_block_hash: BlockHash,
| ^^^^^^^^^ not found in this scope
error[E0412]: cannot find type `BlockHash` in this scope
--> src/block.rs:15:59
|
15 | pub fn new(index: u32,timestamp: u64,prev_block_hash: BlockHash, nonce: u64,payload: String) -> Self {
| ^^^^^^^^^ not found in this scope
For more information about this error, try `rustc --explain E0412`.
lib.rsに定義していたときはエラーにならなかったのに、ファイルを分けた途端に別なスコープに変わってしまう..?
結論としては以下のように修正することで解消した。
この修正は、「lib.rs」ファイルに以下の2ステップを追記している。
mod block_hash;
pub use crate::block_hash::BlockHash;
これは何を意味するか
block_hash.rsファイルで定義されたBlockHashの使用宣言
個別ファイルに定義した型を使用するためには、同じライブラリクレートの中でもuse句をつかった明示的な宣言が必要(しかもlib.rsに記述が必要)
ちなみに、同じ文をBlockHashを直接使用するblock.rsファイル内に書いてみた。crate,self,use,modなど駆使していくつかやったがダメだった https://github.com/Eigo-Mt-Fuji/blockchain-rust/commit/787739a3ffb26cecb4e4c1bc05fba7a1ca4fe298
何の理解が不足しているか
ライブラリクレートを作成する時の作法の理解が不足している
→ https://doc.rust-jp.rs/book-ja/ch07-01-packages-and-crates.html
型の定義を複数ファイルに分割する場合、すべてlib.rsにuse句で知らせなくてはいけない..?出自がわからないので、信頼できる情報源を探すことにしよう。そもそもこの問題、なぜエラーにされるのか不可解だ。同じディレクトリに置かれたファイルはあえて使用宣言をする必要がないほど明らかのようにみえる。
なにはともあれ、lib.rsがとても特別な存在なのは十分理解した。main.rsとlib.rsが特別なファイルで、お互い同じディレクトリに並んでいても全く別な存在だとも改めて理解。いわゆるライブラリクレートとバイナリクレートか。
しかし、シンプルにソースファイルをヒラで作成しただけで、特にクレートもパッケージもモジュールの区別もしていないのにファイル間の型参照エラーがでくわすとは、な。なんというのか、ソースツリーの見え方と距離、そしてRustの概念上の見え方と距離がかなり違う気がする。これは当たり前なのかという個人的疑問は浮かんだ。業界としてはまぁ当たり前かもしれないな。セキュリティの観点が主張されそうでもあるだろうが。
続きはまた次回!
この記事が気に入ったらサポートをしてみませんか?