Stdin::lock(&self)の役割

Stdinの問題

標準入力ストリーム処理を行うためのハンドル。 各ハンドルはグローバルバッファを共有参照する。

そのため1バイト読み込むごとに排他制御が作用し、遅くなる。

Note: ハンドル (handle)

ストリームとは流れを意味する。 stdinは、この流れを制御するハンドルと考えられる。

Stdin::lock(&self)の役割

StdinLock<'_>インスタンスを生成し、共有参照しているグローバルバッファーをロックする。 これによってバッファリングして読み出す事ができる。

pub fn lock(&self) -> StdinLock<'_>ⓘ
use std::io::{self, Read};

fn main() -> io::Result<()> {
    let mut buffer = String::new();
    let stdin = io::stdin();  // Stdinを生成する
    let mut handle = stdin.lock(); // StdinLock<'_>を生成する
    
    handle.read_to_string(&mut buffer)?; // 排他制御しない
}

BufReadトレイト

行毎の読み込みや、特定のbyte[u8]までの読み込みなどが行える。

  • lines
  • read_line
  • read_until
  • split

実装されている型

  • StdinLock<'_>
  • BufReader<R> where R: Read
  • &'_ [u8]