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

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

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

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

Q&A

解決済

3回答

12348閲覧

Rust で usize 型を u32 型にする

Yhaya

総合スコア439

Rust

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

0グッド

0クリップ

投稿2019/09/29 12:38

編集2019/09/29 13:18

質問内容

Rust でベクトルを走査して、条件を満たすインデックスを得るということをしたいと思っています。

rust

1fn my_func(nums: Vec<i32>, target: i32) -> Vec<i32> { 2 for i in 0..(nums.len() - 1) { 3 for j in i..nums.len() { 4 if nums[i] + nums[j] == target { 5 return vec![i, j]; 6 } 7 } 8 } 9}

しかし、i, jはusize型なので返り値の型がエラーになります。これはネット上の問題として解いているので返り値の型は出題側に決められていて変えることができません。なので何とかしてusize -> i32 にキャストしたいのですが方法がわかりません。

Rust 自体が初心者なのでこの考え方自体があっているかどうかも知りたいです。よろしくお願いします。

(追記) エラーメッセージ

bash

1error[E0308]: mismatched types 2 --> src/main.rs:5:29 3 | 45 | return vec![i, j]; 5 | ^ expected i32, found usize 6 7error[E0308]: mismatched types 8 --> src/main.rs:2:5 9 | 101 | fn my_func(nums: Vec<i32>, target: i32) -> Vec<i32> { 11 | -------- expected `std::vec::Vec<i32>` because of return type 122 | / for i in 0..(nums.len() - 1) { 133 | | for j in i..nums.len() { 144 | | if nums[i] + nums[j] == target { 155 | | return vec![i, j]; 16... | 178 | | 189 | | } 19 | |_____^ expected struct `std::vec::Vec`, found () 20 | 21 = note: expected type `std::vec::Vec<i32>` 22 found type `()` 23 24error: aborting due to 2 previous errors 25 26For more information about this error, try `rustc --explain E0308`.

試したこと: as で usize -> i32 へ変換する

rust

1let ans1 = i as i32; 2let ans2 = j as i32; 3 4return vec![ans1, ans2];

をif文の中に入れたところ次のようなエラーが出ました。

bash

1error[E0308]: mismatched types 2 --> src/main.rs:2:5 3 | 41 | fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> { 5 | -------- expected `std::vec::Vec<i32>` because of return type 62 | / for i in 0..(nums.len() - 1) { 73 | | for j in i..nums.len() { 84 | | if nums[i] + nums[j] == target { 95 | | let ans1 = i as i32; 10... | 1110 | | 1211 | | } 13 | |_____^ expected struct `std::vec::Vec`, found () 14 | 15 = note: expected type `std::vec::Vec<i32>` 16 found type `()` 17 18error: aborting due to previous error 19For more information about this error, try `rustc --explain E0308`.

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

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

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

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

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

meg_

2019/09/29 12:49

質問のコードを実行すると、どのようなエラーが出るのでしょうか?
guest

回答3

0

ベストアンサー

エラーの原因は2つです。


  1. returnで返すvec!の型が宣言と異なる

これは質問者様もすでにご存知のようですので、型の変換についてだけ書きます。

Rustではasを使うことで特定の型同士の変換を行うことができます。
(asで何を変換できるかの詳細はReferenceに書かれています)

asを使って5行目の型を合わせると以下のようになります。

rust

1return vec![i as i32, j as i32];

今回は要素が2個しかないので個々にasを付けましたが、もし個数が多いようならイテレータを用いて以下のようにもできます。

rust

1return vec![i, j].into_iter().map(|n| n as i32).collect();

  1. for文を抜けた後に返り値がない

引数の特性によりfor文の中で必ず関数が返るなら、for文の後に戻り値を書く必要はないのですがコンパイラにはそれはわかりません。
もしfor文を通り過ぎることがないと確信できるならば、8行目にunreachable!()を書き足すことで、コンパイラにそこに到達することはないと伝えることができます。
(unreachable!()に到達してしまった場合はpanicします)


以上の点を解消したコードは以下のようになります。

rust

1fn my_func(nums: Vec<i32>, target: i32) -> Vec<i32> { 2 for i in 0..(nums.len() - 1) { 3 for j in i..nums.len() { 4 if nums[i] + nums[j] == target { 5 return vec![i as i32, j as i32]; 6 } 7 } 8 } 9 unreachable!() 10}

投稿2019/09/29 13:18

equal-l2

総合スコア172

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

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

0

戻り値を返さないコードパスがあるのが問題です。二重for文の中のif文の条件を一度も満たさなかった場合を考えてください。

投稿2019/09/29 13:19

yumetodo

総合スコア5850

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

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

0

Rust Documentation 型間のキャスト

let x: i32 = 5;
let y = x as i64;

上記例が載っていました。

投稿2019/09/29 13:03

編集2019/09/29 13:09
meg_

総合スコア10577

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

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

Yhaya

2019/09/29 13:09

as で変換することはすでに試しましたがエラーが出ます
meg_

2019/09/29 13:11

既に試したこととその結果については質問欄へ追記いただくとより良い回答が得られるかと思います。
Yhaya

2019/09/29 13:14

そうですね、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問