我如何 return 一个结构或任何比原语更复杂的东西?

How do I return a struct or anything more complicated than a primitive?

我一直在研究 Rust,我对函数 return 类型有点困惑。作为实验,我正在编写一个 IRC 日志解析器。我熟悉原始类型,并且具有 return 的功能。 return处理多条数据时更复杂的类型呢?

/* Log line example from log.txt */
/* [17:35] <@botname> name1 [460/702] has challenged name2 [224/739] and taken them in combat! */

#[derive(Show)]
struct Challenger {
  challenger: String,
  defender: String
}


fn main() {
  let path = Path::new("log.txt");
  let mut file = BufferedReader::new(File::open(&path));
  for line in file.lines() {
      let mut unwrapped_line = line.unwrap();
      let mut chal = challenges3(unwrapped_line);
      println!("Challenger: {}", chal.challenger);
      println!("Defender: {}", chal.defender);
  }
}

fn challenges3(text: String)-> Challenger {
  let s: String = text;
  let split: Vec<&str> = s.as_slice().split(' ').collect();
  if(split[4] == "has" && split[5] == "challenged") {
    let mychallenger = Challenger { challenger: split[2].to_string(), defender: split[6].to_string()};
    return mychallenger;
  }
}

我意识到这段代码不是很地道,我正在熟悉这门语言。

我收到此代码的错误:

"mismatched types: expected `Challenger`, found `()` (expected struct Challenger, found ())"

我怎样才能 return 一个 Struct 或 HashMap? return多字段数据有更好的方法吗?

challenges3中的if没有else块,所以如果不满足条件,则在if块之后继续执行。那里什么都没有,所以此时函数隐式 returns () 。您还必须 return 在 if 块之后添加 Challenger,或者 panic! 以中止程序。

或者,您可以将函数的 return 类型更改为 Option<Challenger>。 Return Some(mychallenger)if 块中,Noneif 块之后:

fn challenges3(text: String) -> Option<Challenger> {
    let s: String = text;
    let split: Vec<&str> = s.as_slice().split(' ').collect();
    if split[4] == "has" && split[5] == "challenged" {
        let mychallenger = Challenger { challenger: split[2].to_string(), defender: split[6].to_string()};
        return Some(mychallenger);
    }

    None
}

如果您想 return 一些关于错误的信息,您也可以使用 Result instead of Option