我如何 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
块中,None
在 if
块之后:
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
}
我一直在研究 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
块中,None
在 if
块之后:
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
}