前提
Rustでミュータブル変数を使わずに、二次元配列の一部の値をタプルの変数で更新したいと思っています。
一次元配列の更新まではできたのですが、一次元配列の更新ができません。
実現したいこと
・二次元配列の一部の値をタプルの変数で更新したい
・ミュータブル変数(mut)は使わない
発生している問題・エラーメッセージ
エラーメッセージ
[apo@arch sample_proj]$ cargo build Compiling sample_proj v0.1.0 (/home/apo/Documents/project/make/rust/20230113_2/sample_proj) error[E0271]: type mismatch resolving `<std::slice::Iter<'_, &i32> as IntoIterator>::Item == &[i32; 3]` --> src/main.rs:33:40 | 33 | let a2: Vec<&[i32; 3]> = cp.iter().chain(d2.iter()).chain(cb.iter()).collect::<Vec<_>>(); | ^^^^^ expected array `[i32; 3]`, found `&i32` | = note: expected reference `&[i32; 3]` found reference `&&i32` note: required by a bound in `std::iter::Iterator::chain` error[E0599]: the method `chain` exists for struct `std::iter::Chain<std::slice::Iter<'_, [i32; 3]>, std::slice::Iter<'_, &i32>>`, but its trait bounds were not satisfied --> src/main.rs:33:57 | 33 | let a2: Vec<&[i32; 3]> = cp.iter().chain(d2.iter()).chain(cb.iter()).collect::<Vec<_>>(); | ^^^^^ method cannot be called on `std::iter::Chain<std::slice::Iter<'_, [i32; 3]>, std::slice::Iter<'_, &i32>>` due to unsatisfied trait bounds | = note: the following trait bounds were not satisfied: `<std::slice::Iter<'_, &i32> as Iterator>::Item = &[i32; 3]` which is required by `std::iter::Chain<std::slice::Iter<'_, [i32; 3]>, std::slice::Iter<'_, &i32>>: Iterator` `std::iter::Chain<std::slice::Iter<'_, [i32; 3]>, std::slice::Iter<'_, &i32>>: Iterator` which is required by `&mut std::iter::Chain<std::slice::Iter<'_, [i32; 3]>, std::slice::Iter<'_, &i32>>: Iterator` Some errors have detailed explanations: E0271, E0599. For more information about an error, try `rustc --explain E0271`. error: could not compile `sample_proj` due to 2 previous errors
該当のソースコード
変数a([[1,2,3],[4,5,6],[7,8,9]])をタプルb(1,2.8)で変更したい。
具体的にはa[1][2]の値を5から8に変更したい。
fn main() { let a: Vec<[i32; 3]> = vec![[1,2,3],[4,5,6],[7,8,9]]; println!("a = {:?}", a); let b = (1,2,8); // a[1][2]の値を8に変更したい println!("b = {:?}", b); let atai = a[b.0][b.1]; println!("atai = {:?}", atai); let cp: Vec<[i32; 3]> = (&a[..b.0]).to_vec(); println!("cp = {:?}",cp); let cb: Vec<[i32; 3]> = (&a[(b.0+1)..]).to_vec(); println!("cb = {:?}",cb); let d = &a[b.0]; println!("d = {:?}", d); let dp: Vec<i32> = (&d[..b.1]).to_vec(); println!("dp = {:?}", dp); let db: Vec<i32> = (&d[(b.1+1)..]).to_vec(); println!("db = {:?}", db); let data: Vec<i32> = vec![(b.2)].to_vec(); println!("data = {:?}", data); let d2: Vec<&i32> = dp.iter().chain(data.iter()).chain(db.iter()).collect::<Vec<_>>(); println!("d2 = {:?}", d2); let a2: Vec<&[i32; 3]> = cp.iter().chain(d2.iter()).chain(cb.iter()).collect::<Vec<_>>(); println!("a2 = {:?}", a2); }
試したこと
d2.try_into().unwrap()
で型変換を試してみましたがうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
Rustバージョン
rustc 1.58.0 (02072b482 2022-01-11)
一次元配列は下記コードで実現できました。
fn main() { let a:Vec<i32> = vec![2,3,7,3,5,9,5,1]; println!("a = {:?}", a); let b = (4,8); let a1 = &a[..b.0]; let a2 = &a[(b.0+1)..]; let b2 = [b.1]; let k = a1.iter().chain(b2.iter()).chain(a2.iter()).collect::<Vec<_>>(); println!("k = {:?}", k); }
結果
[apo@arch sample_proj]$ cargo run a = [2, 3, 7, 3, 5, 9, 5, 1] k = [2, 3, 7, 3, 8, 9, 5, 1]
ご教示よろしくお願いします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/01/14 02:30
2023/01/14 05:34