いや、書くな。 (どうせ見当違いなので。) 0727デフォルトの名無しさん2020/06/08(月) 15:03:12.27ID:LDYBA2kC>>725 #[derive(Debug)] struct TAaa { x: Box<i32>, y: i32 } fn main() { let mut vec:Vec<TAaa> = Vec::new(); vec.push( TAaa { x : Box::new(333), y : 444 } ); let x = vec[0].x; // error[E0507]: cannot move out of index of `std::vec::Vec<TAaa>` println!("{:#?}", x); } ↑のように vec をHeapに確保した場合、エラーになる。 ところが、stackに確保した場合はエラーにならない。 実験済み。 0728デフォルトの名無しさん2020/06/08(月) 15:04:31.00ID:LDYBA2kC>>726 海外のサイトでも、RustはC/C++から単純移行ができ無い事が問題とされている。 FortranからCへは単純移行が出来たからCが普及したと書いてあった。 0729デフォルトの名無しさん2020/06/08(月) 15:16:36.76ID:LDYBA2kC>>726 後付ではない。 C++で、pChild、pNextと言えば、当然そういう構造体になる。 0730デフォルトの名無しさん2020/06/08(月) 15:47:14.20ID:KAmnJXdU>>727 型・寿命・所有権の条件が同じならヒープかスタックかというのは関係ない。 お前が結果的に違う条件で書いるだけ。
>>728 知らんがな。 同じように書けるんなら新しい言語を導入する意味ないだろ。 制約が厳しい替わりに問題点が検出されやすいのが Rust の利点なんだから、 その利点が要らんなら別に Rust を使わんでいいよ。 0731デフォルトの名無しさん2020/06/08(月) 16:43:05.54ID:LDYBA2kC>>730 >型・寿命・所有権の条件が同じならヒープかスタックかというのは関係ない。 >お前が結果的に違う条件で書いるだけ。 1.実験してみたところ、>>727でBoxをRcに変えてもエラーのままだった。 2.単純にTAaaをスタックに確保した場合、正常にコンパイルされた。 3.TAaaを以下のようにHeapに確保した場合も、正常にコンパイルされた: fn main() { let bbb = Box::new( TAaa { x : Box::new(333), y : 444 } ); println!( "bbb = {:#?}", bbb ); println!( "bbb.x = {:#?}", bbb.x ); println!( "let x = bbb.x;" ); let x = bbb.x; println!( "x = {:#?}", x ); } つまり、Vec<TAaa>の場合にだけエラーになる。 0732デフォルトの名無しさん2020/06/08(月) 16:57:23.12ID:KAmnJXdU>>731 ついでに言えば >>727 のエラーが出る行を
let ref x = vec[0].x;
とか
let x = vec.swap_remove(0);
とか
let x = vec[0].x.clone();
とかすることでもコンパイルは通る。 0733デフォルトの名無しさん2020/06/08(月) 17:21:28.18ID:LDYBA2kC>>732 >let x = vec.swap_remove(0); let x = vec.swap_remove(0).x のことかな? 0734デフォルトの名無しさん2020/06/08(月) 17:33:12.05ID:7lLHeGo6 rustじゃ書けないおじさんのコードを添削する流れ、何度目だ 0735デフォルトの名無しさん2020/06/08(月) 18:00:02.94ID:ZyH0cWN6 std::mem::take 0736デフォルトの名無しさん2020/06/08(月) 18:06:13.25ID:KAmnJXdU>>733 おっと、せやな。 .x が無くてもコンパイルは通ってしまうからミスったわ。 0737デフォルトの名無しさん2020/06/08(月) 18:15:14.24ID:OI3JiiYN ID真っ赤、お顔も真っ赤w 0738デフォルトの名無しさん2020/06/08(月) 18:20:45.97ID:KAmnJXdU>>734 ワイも初心者ではあるんよ。 The book (第二版の日本語訳の無料で読めるやつ) を読み終わって、試しに 500 行くらいのコードを書いてみたって程度。 本を読んでいる間はコードを書いてない。 手を動かすと理解しやすいという人も多いけど、 感覚でやってしまいがちで書いてある理屈をしっかり把握するのが疎かになる気がするから。
で、 The book を読めばこの程度には理解できるので理解できてないやつは単にアホという証明でもあるし、 逆に返答に詰るようなら俺がまだ入門級のことが理解できてない (どこが理解できていないか) ことがわかるので 練習の題材としてちょうどいいわという気持ちで相手してた。 0739デフォルトの名無しさん2020/06/08(月) 18:37:00.38ID:LDYBA2kC>>738 では、>>732 で >let ref x = vec[0].x; の borrow が合法かどうか、どうやってコンパイラが静的に解析しているか アルゴリズムを説明してみてください。 0740デフォルトの名無しさん2020/06/08(月) 21:16:08.81ID:KAmnJXdU>>739 let ref というのは直接的には The book に出てこないと思うけど、 let もパターンマッチだということはタプルの項目で示されている。 たとえば let a = &1; と書いたら a には 1 の参照が入るし、 let &a = &1; と書いたら a は (参照を経由する) 値になる。