質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

2回答

497閲覧

二次元配列の一部の値をタプルの変数で更新したい

apo

総合スコア349

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2023/01/14 00:22

前提

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]

ご教示よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

もっと良い方法があるかもしれませんが、一例として、以下のような形だとどうでしょうか?

rust

1fn main() { 2 one_dimension(vec![2, 3, 7, 3, 5, 9, 5, 1], (4, 8)); 3 two_dimension(vec![[1, 2, 3], [4, 5, 6], [7, 8, 9]], (1, 2, 8)); 4} 5 6fn one_dimension(a: Vec<i32>, b: (usize, i32)) { 7 let k = a 8 .iter() 9 .enumerate() 10 .map(|(i, x)| if i == b.0 { b.1 } else { *x }) 11 .collect::<Vec<i32>>(); 12 13 println!("a = {:?}", a); 14 println!("k = {:?}", k); 15} 16 17fn two_dimension(a: Vec<[i32; 3]>, b: (usize, usize, i32)) { 18 let k = a 19 .iter() 20 .enumerate() 21 .map(|(i, x)| { 22 x.iter() 23 .enumerate() 24 .map(|(j, y)| if i == b.0 && j == b.1 { b.2 } else { *y }) 25 .collect::<Vec<i32>>() 26 }) 27 .collect::<Vec<Vec<i32>>>(); 28 29 println!("a = {:?}", a); 30 println!("k = {:?}", k); 31}
$ cargo run a = [2, 3, 7, 3, 5, 9, 5, 1] k = [2, 3, 7, 3, 8, 9, 5, 1] a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] k = [[1, 2, 3], [4, 5, 8], [7, 8, 9]]

投稿2023/01/14 01:32

knuser

総合スコア178

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apo

2023/01/14 02:30

ありがとうございます。あとで試してみます。
apo

2023/01/14 05:34

すごい、希望どおりの動きです。 仕組みがよくわからないのでいろいろ検証してみます。 ありがとうございます。
guest

0

当初、期待していた方法でも実現できたので下記に記します。

fn main() { let a: Vec<Vec<i32>> = vec![vec![1, 2, 3],vec![4, 5, 6],vec![7, 8, 9],vec![10, 11, 12]]; println!("a = {:?}", a); let b: (usize, usize, i32) = (1,1,8); println!("b = {:?}", b); let atai: i32 = a[b.0][b.1]; println!("atai = {:?}", atai); let cp: Vec<Vec<i32>> = (&a[..b.0]).to_vec(); println!("cp = {:?}",cp); let cb: Vec<Vec<i32>> = (&a[(b.0+1)..]).to_vec(); println!("cb = {:?}",cb); let d: Vec<i32> = (&a[b.0]).to_vec(); 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]; println!("data = {:?}", data); let d2: Vec<&i32> = dp.iter().chain(data.iter()).chain(db.iter()).collect::<Vec<&i32>>(); println!("d2 = {:?}", d2); let d22: Vec<i32> = d2.into_iter().cloned().collect(); let d222: Vec<Vec<i32>> = vec![d22]; let a2: Vec<&Vec<i32>> = cp.iter().chain(d222.iter()).chain(cb.iter()).collect(); println!("a2 = {:?}", a2); }
[apo@arch sample_proj]$ cargo run a = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]] b = (1, 1, 8) atai = 5 cp = [[1, 2, 3]] cb = [[7, 8, 9], [10, 11, 12]] d = [4, 5, 6] dp = [4] db = [6] data = [8] d2 = [4, 8, 6] a2 = [[1, 2, 3], [4, 8, 6], [7, 8, 9], [10, 11, 12]]

投稿2023/01/17 04:33

編集2023/01/17 04:35
apo

総合スコア349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問