use宣言の実験まとめ
導入
use std::io::{self, Write}; がなぜ必要かを、
実際にコンパイルエラーを見ながら理解するためのメモです。
実験の目的
use std::io::{self, Write};がなぜ必要かを体験的に理解するselfとWriteそれぞれの役割を確認する
正解コード(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つを同時に行っています。
self→std::ioをioとして使えるようにするWrite→std::io::Writeトレイトを使えるようにする
3) self が無いとどうなる?
self を外すと、io::stdin() や io::stdout() が使えません。
そのため 「io が見つからない」エラーになります。
4) Write が無いとどうなる?
Write は flush() を使うためのトレイトです。
Write を外すと、
io::stdout().flush()が 見つからないと言われます。
5) 結論
io::stdin() と io::stdout().flush() の両方を使うためには、
self と Write の両方が必要です。
だから最終的な正解はこれ:
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()を提供するトレイトが不足
まとめ
selfはio::を使うために必要Writeはflush()を使うために必要- 両方必要なので最終的には以下に戻す
use std::io::{self, Write};