2016-04-19 7 views
-1

Ich bin ein Neuling von Rust. Hier ist der Code, um die Indizes der beiden Zahlen so zu finden, dass sie sich zu einem bestimmten Ziel addieren.Fehler: nicht alle Steuerpfade geben einen Wert zurück [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]); 
} 

bekam ich einen Fehler wie unten

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 

Wie es passiert ist? Wie kann ich das Problem lösen?

Dank

+0

Sie können alle Rückwege machen einen Wert zurückgeben, in diesem Fall über das Semikolon entfernen, nachdem '[0usize, 0usize]' –

+0

Haben Sie „run' rustc --explain E0269' eine detaillierte Erklärung zu sehen“, wie vom Compiler vorgeschlagen? – Shepmaster

+0

Sie wären wahrscheinlich interessiert an [Wie man effizient nach einer HashMap sucht und einfügt?] (Http://stackoverflow.com/q/28512394/155423). – Shepmaster

Antwort

3

Sie das Semikolon nach [0usize, 0usize] entfernen (this is idiomatic) oder eine return [0usize, 0usize] hinzuzufügen.

Um Ihren Code zu verbessern, können Sie eine Option zurückgeben. Auch in diesem Fall ist es besser, ein Tupel zurückzugeben.

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); 
} 
Verwandte Themen