use宣言の実験まとめ

導入

use std::io::{self, Write};なぜ必要かを、
実際にコンパイルエラーを見ながら理解するためのメモです。

実験の目的

  • use std::io::{self, Write}; がなぜ必要かを体験的に理解する
  • selfWrite それぞれの役割を確認する

正解コード(use宣言)

use std::io::{self, Write};

概念整理(あとから見ても分かる版)

1) use は「長い名前を短く使う」宣言

Rustでは標準ライブラリの機能を使うとき、

std::io::stdin()
std::io::stdout()

のように フルパスを書く必要があります。

use を書くと、

io::stdin()
io::stdout()

のように 短く書けるようになります。


2) {self, Write} は「2つ同時に持ってくる」書き方

use std::io::{self, Write};

は以下の2つを同時に行っています。

  • selfstd::ioio として使えるようにする
  • Writestd::io::Write トレイトを使えるようにする

3) self が無いとどうなる?

self を外すと、io::stdin()io::stdout() が使えません。
そのため 「io が見つからない」エラーになります。


4) Write が無いとどうなる?

Writeflush() を使うためのトレイトです。
Write を外すと、

io::stdout().flush()

見つからないと言われます。


5) 結論

io::stdin()io::stdout().flush() の両方を使うためには、
selfWrite の両方が必要です。

だから最終的な正解はこれ:

use std::io::{self, Write};

実験①: Write を消す

変更内容

use std::io::{self};

結果(ビルドエラー)

error[E0599]: no method named `flush` found for struct `Stdout`

理由

  • flush()Write トレイトのメソッド
  • Write を import していないためメソッドが見えない

実験②: self を消す

変更内容

use std::io::{Write};

結果(ビルドエラー)

error[E0433]: failed to resolve: use of unresolved module or unlinked crate `io`

理由

  • io モジュール自体がスコープに無い
  • io::stdin() / io::stdout() が使えなくなる

実験③: use std::io; だけにする

変更内容

use std::io;

結果(ビルドエラー)

error[E0599]: no method named `flush` found for struct `Stdout`

理由

  • io は使えるが Write がスコープに無い
  • flush() を提供するトレイトが不足

まとめ

  • selfio:: を使うために必要
  • Writeflush() を使うために必要
  • 両方必要なので最終的には以下に戻す
use std::io::{self, Write};