2016-04-19 3 views
-1

私はRustの初心者です。ここでは、2つの数字のインデックスを特定して特定のターゲットに追加するコードを示します。エラー:すべての制御パスが値を返すわけではありません。[E0269]

use std::collections::HashMap; 

fn two_sum(nums: &[i32], target: i32) -> [usize;2] { 
    let mut map: HashMap<i32, usize> = HashMap::new(); 

    for i in 0..nums.len() { 
     let want = target - nums[i]; 
     match map.get(&nums[i]) { 
      Some(&seen) => return [seen, i], 
      _ => map.insert(want, i), 
      }; 
    } 

    [0usize, 0usize]; 
} 

fn main() { 
    let nums = [1,3,7,4]; 
    let res = two_sum(&nums, 10); 
    println! ("{},{}", res[0], res[1]); 
} 

私は

が起こったのか
src/bin/2sum.rs:3:1: 15:2 error: not all control paths return a value [E0269] 
src/bin/2sum.rs:3 fn two_sum(nums: &[i32], target: i32) -> [usize;2] { 
src/bin/2sum.rs:4  let mut map: HashMap<i32, usize> = HashMap::new(); 
src/bin/2sum.rs:5 
src/bin/2sum.rs:6  for i in 0..nums.len() { 
src/bin/2sum.rs:7   let want = target - nums[i]; 
src/bin/2sum.rs:8   match map.get(&nums[i]) { 
       ... 
src/bin/2sum.rs:3:1: 15:2 help: run `rustc --explain E0269` to see a detailed  explanation 
error: aborting due to previous error 

以下のようなエラーが発生しましたか?どうすれば問題を解決できますか?

おかげ

+0

あなたは ' –

+0

はあなたに「rustc --explain E0269'詳細な説明を参照するために'実行」でした[0usize、0usize] 'の後にセミコロンを削除経由して、すべてのリターンパスは、この場合には、値を返すことができますコンパイラによって提案された? – Shepmaster

+0

おそらく、[HashMapを効率的に検索して挿入する方法](http://stackoverflow.com/q/28512394/155423)に興味があります。 – Shepmaster

答えて

3

あなたは[0usize, 0usize]this is idiomatic)の後にセミコロンを削除するか、return [0usize, 0usize]を追加することができます。

コードを改善するには、Optionを返すことができます。また、この場合、タプルを返すほうがよいでしょう。

use std::collections::HashMap; 

fn two_sum(nums: &[i32], target: i32) -> Option<(usize, usize)> { 
    let mut map: HashMap<i32, usize> = HashMap::new(); 

    for i in 0..nums.len() { 
     let want = target - nums[i]; 
     match map.get(&nums[i]) { 
      Some(&seen) => return Some((seen, i)), 
      _ => map.insert(want, i), 
     }; 
    } 

    None 
} 

fn main() { 
    let nums = [1, 3, 7, 4]; 
    let res = two_sum(&nums, 10); 
    println!("{:?}", res); 
}