2017-06-21 6 views
2

Die Rust file examples erscheinen nicht mit Rust 1.18.0 kompilieren.Rust File Beispiele nicht kompilieren

Für example:

use std::fs::File; 
use std::io::prelude::*; 
fn main() { 
    let mut file = File::open("foo.txt")?; 
    let mut contents = String::new(); 
    file.read_to_string(&mut contents)?; 
    assert_eq!(contents, "Hello, world!"); 
} 

Fehlerprotokoll:

rustc 1.18.0 (03fc9d622 2017-06-06) 
error[E0277]: the trait bound `(): std::ops::Carrier` is not satisfied 
--> <anon>:4:20 
    | 
4 |  let mut file = File::open("foo.txt")?; 
    |     ---------------------- 
    |     | 
    |     the trait `std::ops::Carrier` is not implemented for `()` 
    |     in this macro invocation 
    | 
    = note: required by `std::ops::Carrier::from_error` 

error[E0277]: the trait bound `(): std::ops::Carrier` is not satisfied 
--> <anon>:6:5 
    | 
6 |  file.read_to_string(&mut contents)?; 
    |  ----------------------------------- 
    |  | 
    |  the trait `std::ops::Carrier` is not implemented for `()` 
    |  in this macro invocation 
    | 
    = note: required by `std::ops::Carrier::from_error` 

error: aborting due to 2 previous errors 
+2

I upvoted. IMO, das ist keine blöde Frage, da der '?' - Operator etwas kryptisch ist, und es ist kontraintuitiv, dass das Codebeispiel nicht in ein 'main' geschrieben werden kann. Wenn ich mich recht erinnere, gibt es einen RFC, der es erlaubt, 'Result' in einem Main zu verwenden. – Boiethios

+1

Für mich ist das Fehlerprotokoll verwirrend, also upvote auch. – Stargateur

+0

Relevante Antwort: https://StackOverflow.com/a/43395610/1233251 –

Antwort

7

? ist ein syntaktischer Zucker, die ein Result prüft: wenn das Ergebnis Err ist, es zurückgegeben wird als ob. Wenn kein Fehler auftritt (aka Ok), wird die Funktion fortgesetzt. Wenn Sie diese Art:

fn main() { 
    use std::fs::File; 

    let _ = File::open("foo.txt")?; 
} 

bedeutet das:

fn main() { 
    use std::fs::File; 

    let _ = match File::open("foo.txt") { 
     Err(e) => return Err(e), 
     Ok(val) => val, 
    }; 
} 

Dann verstehen Sie, dass jetzt können Sie ? nicht im Haupt verwenden, da Haupt kehrt Einheit () und nicht Result. Wenn Sie diese Sachen arbeiten möchten, können Sie es in einer Funktion setzen, die eine Result zurück und überprüfen Sie es aus dem Haupt:

fn my_stuff() -> std::io::Result<()> { 
    use std::fs::File; 
    use std::io::prelude::*; 

    let mut file = File::open("foo.txt")?; 
    let mut contents = String::new(); 
    file.read_to_string(&mut contents)?; 
    // do whatever you want with `contents` 
    Ok(()) 
} 


fn main() { 
    if let Err(_) = my_stuff() { 
     // manage your error 
    } 
} 

PS: Es gibt eine proposition ist Arbeit ? im Haupt zu machen.

4

Sie Kompilierung tun. Sie kompilieren einfach nicht in einer main Funktion wie dieser. Wenn Sie sich die Beispiele ansehen, haben alle einen großen "Run" -Knopf auf ihnen. Klicken Sie darauf und es öffnet das vollständige, ungekürzte Beispiel auf dem Laufstall.

Die Sie oben auf diesen Code erweitert verwendet haben:

fn main() { 
    use std::fs::File; 
    use std::io::prelude::*; 

    fn foo() -> std::io::Result<()> { 
     let mut file = File::open("foo.txt")?; 
     let mut contents = String::new(); 
     file.read_to_string(&mut contents)?; 
     assert_eq!(contents, "Hello, world!"); 
     Ok(()) 
    } 
} 

Dieser Code kompiliert nicht, weil Sie Code gesetzt haben, die eine Result in eine Funktion (main in diesem Fall), die doesn ausbreitet gib keine Result zurück.

+0

Ich sah den Run-Button und bemerkte, dass der Code anders war. Mein erster Gedanke war, dass die eine oder andere Version veraltet war. Ich vermutete auch, dass es etwas mit dem '' '' zu tun hatte, aber da ich neu zu rosten war, wusste ich nicht was '' '' – alexbirkett