Es ist nicht gerade eine idiomatische MVCE, aber es sollte die Frage veranschaulichen. Angesichts der folgenden Code:Warum kann ich nicht die Referenz des Versuchsergebnisses nehmen! mit &?
fn foo() -> Result<String, i32> {
return Ok("world".to_string());
}
fn bar() -> Result<String, i32> {
let mut value = String::new();
value.push_str(&try!(foo())); // this line here
return Ok("Hello ".to_string() + &value);
}
fn main() {
match bar() {
Ok(message) => println!("{}", message),
_ => return,
}
}
Rust den Fehler zurückgibt:
<std macros>:3:43: 3:46
error: mismatched types:
expectedstr
,
foundcollections::string::String
(expectedstr
,
found structcollections::string::String
) [E0308]
<std macros>:3 $ crate:: result:: Result:: Ok (val) => val , $ crate:: result:: Result::
<std macros>:1:1: 6:48
note: in expansion oftry!
<std macros>:3:43: 3:46
help: runrustc --explain E0308
to see a detailed explanation
error: aborting due to previous error
Wenn ich stattdessen das Ergebnis try!
erfassen und separat &
auf das Ergebnis anwenden, es funktioniert (und druckt Hello world
):
fn foo() -> Result<String, i32> {
return Ok("world".to_string());
}
fn bar() -> Result<String, i32> {
let mut value = String::new();
let foo_result = try!(foo()); // capture the result of try!
value.push_str(&foo_result); // now use the result with &
return Ok("Hello ".to_string() + &value);
}
fn main() {
match bar() {
Ok(message) => println!("{}", message),
_ => return,
}
}
Warum funktioniert let foo_result = try!(foo()); value.push_str(&foo_result);
funktioniert aber value.push_str(&try!(foo()));
nicht? Aus meiner naiven Perspektive scheinen sie gleichwertig zu sein, also bin ich mir nicht sicher, welchen Schlüsselabschnitt von Rust ich nicht verstehe.
Es ist eine sehr gute MVCE. Keine Antwort, aber immer noch ein bisschen was ich normalerweise tue: http://is.gd/PZKWz0 – ArtemGr
Sie können sogar mit value.push_str (&& try! (Foo())) auflösen; – eulerdisk
Danke, @Shpmaster. Du hast vollkommen recht. – Cornstalks