ytakano/rust_zero

第7章のp184のparse_cmdの実行例について

Closed this issue · 1 comments

第1刷の誤植の報告です。

p184でparse_cmdの例に触れている下記の文章ですが、

"echo hello | less"を引数としてparse_cmdを呼び出すと、vec![("echo", vec!["hello"]), ("less", vec![])]というベクタが返される。

この通りに実装するとZeroShは期待通りには動かなかったです。
この入力のときはvec![("echo", vec!["echo", "hello"]), ("less", vec!["less"])]というベクタを返すように実装すると、期待通りに動きました。

GitHub 上のソースコードのparse_cmdの実装と、parse_cmdに対するドキュメントに書かれている例は修正されていました。

/// コマンドをパースし、実行ファイルと引数にわける。
/// また、パイプの場合は複数のコマンドにわけてVecに保存。
///
/// # 例1
///
/// 入力"echo abc def"に対して、`Ok(vec![("echo", vec!["echo", "abc", "def"])])`
/// を返す。
///
/// # 例2
///
/// 入力"echo abc | less"に対して、`Ok(vec![("echo", vec!["echo", "abc"]), ("less", vec!["less"])])`
/// を返す。
fn parse_cmd(line: &str) -> CmdResult {
let cmds = parse_pipe(line);
if cmds.is_empty() {
return Err("空のコマンド".into());
}
let mut result = Vec::new();
for cmd in cmds {
let (filename, args) = parse_cmd_one(cmd)?;
result.push((filename, args));
}
Ok(result)
}

ありがとうございます!

正誤表に追記させて頂きました。
https://github.com/ytakano/rust_zero/blob/master/errata.md