見出し画像

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の使用宣言

  • 何の理解が不足しているか

    • ライブラリクレートを作成する時の作法の理解が不足している

    • → https://doc.rust-jp.rs/book-ja/ch07-01-packages-and-crates.html

      • 型の定義を複数ファイルに分割する場合、すべてlib.rsにuse句で知らせなくてはいけない..?出自がわからないので、信頼できる情報源を探すことにしよう。そもそもこの問題、なぜエラーにされるのか不可解だ。同じディレクトリに置かれたファイルはあえて使用宣言をする必要がないほど明らかのようにみえる。

なにはともあれ、lib.rsがとても特別な存在なのは十分理解した。main.rsとlib.rsが特別なファイルで、お互い同じディレクトリに並んでいても全く別な存在だとも改めて理解。いわゆるライブラリクレートとバイナリクレートか。

しかし、シンプルにソースファイルをヒラで作成しただけで、特にクレートもパッケージもモジュールの区別もしていないのにファイル間の型参照エラーがでくわすとは、な。なんというのか、ソースツリーの見え方と距離、そしてRustの概念上の見え方と距離がかなり違う気がする。これは当たり前なのかという個人的疑問は浮かんだ。業界としてはまぁ当たり前かもしれないな。セキュリティの観点が主張されそうでもあるだろうが。

続きはまた次回!

この記事が気に入ったらサポートをしてみませんか?