ytakano/rust_zero

p75: 「構造体のフィールドを借用しコンパイルエラーとなる例」について

mosmos21 opened this issue · 5 comments

素晴らしい書籍の執筆ありがとうございます。
書籍を読み進めるにあたり、誤植の発見とサンプルコードについての挙動の疑問がありましたので質問させてください。

誤植について

該当コード

for elm in xy.x.iter() {
    y.push(*elm * *elm);
}

以下が正しいかと思われます。ご確認お願いします。

for elm in xy.x.iter() {
    xy.y.push(*elm * *elm);
}

コンパイルエラーについて

サンプルコードをコンパイルしてみたところエラーが出ませんでした。(playgroundのリンク)
rustのバージョンアップにより挙動が変わっている可能性が考えられますので、ご確認お願います。

ありがとうございます!
たしかに、ここの説明はおかしい気がします。
少し考えます。

以下のようなコードを想定していました。もう少し良い例がないか、考えます。

#[derive(Debug)]
struct XY {
    x: Vec<i32>,
    y: Vec<i32>,
}

fn main() {
    let mut xy = XY {
        x: vec![1, 2, 3],
        y: Vec::new(),
    };
    
    xy.update(&xy.x); // コンパイルエラー
    
    println!("{:?}", xy);
}

impl XY {
    fn update(&mut self, x: &[i32]) {
        for elm in x.iter() {
            self.y.push(*elm * *elm);
        }
    }
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a4467e3c859349c72a0f80aa101c9f0c

こちら正誤表に記載させて頂きました。
ありがとうございます。

もう少し良い例を思いついたので、正誤表をアップデートしました。
ご指摘ありがとうございます。

正誤表

ハマりがちなポイントなので大変参考になりました。
この例のエラーが分配束縛などでどのように解消できるか、修正結果も正誤表に追加していただけないでしょうか。