2015-03-23 3 views
5

ich den Code gefolgt, eine Datei von Rust by Example zu öffnen:Datei kann nicht Inhalt Zeichenfolge lesen - Ergebnis keine Methode in Umfang namens nicht implementiert `read_to_string`

use std::env; 
use std::io::BufRead; 
use std::fs::File; 
use std::path::Path; 

fn main() { 
    let args: Vec<_> = env::args().collect(); 
    let pattern = &args[1]; 

    if let Some(a) = env::args().nth(2) { 
     let path = Path::new(&a); 
     let mut file = File::open(&path); 
     let mut s = String::new(); 
     file.read_to_string(&mut s); 
     println!("{:?}", s); 
    } else { 
     //do something 
    } 
} 

Aber ich habe eine Nachricht wie folgt aus:

error: no method named `read_to_string` found for type `std::result::Result<std::fs::File, std::io::Error>` in the current scope 
    --> src/main.rs:14:14 
    | 
14 |   file.read_to_string(&mut s); 
    |    ^^^^^^^^^^^^^^ 

Was mache ich falsch?

Antwort

13

Schauen wir uns Ihre Fehlermeldung:

error: no method named `read_to_string` found for type `std::result::Result<std::fs::File, std::io::Error>` in the current scope 
    --> src/main.rs:14:14 
    | 
14 |   file.read_to_string(&mut s); 
    |    ^^^^^^^^^^^^^^ 

Die Fehlermeldung ist ziemlich viel, was es auf dem Zinn sagt - die Art Result tut nicht die Methode read_to_string haben. Das ist eigentlich a method on the trait Read.

Sie haben eine Result, weil File::open(&path) kann fehlschlagen. Der Fehler wird mit dem Typ Result dargestellt. Der erste Teil von Result ist Ok, was der Erfolgsfall ist. Der andere Teil ist Err, was der Fehlerfall ist.

Sie müssen den Fehlerfall irgendwie behandeln. Am einfachsten ist es, sich nur auf Versagen sterben, mit expect:

let mut file = File::open(&path).expect("Unable to open"); 

Sie auch Read in Rahmen zu bringen, müssen Sie Zugang zu read_to_string haben:

use std::io::Read; 

Ich würde Lektüre empfehlen durch The Rust Programming Language und die Beispiele arbeiten. Ich denke, diese Dokumente sind erstklassig!

+1

https://doc.rust-lang.org/std/fs/struct.File.html: hier tut es sagen, dass Datei eine read_to_string Methode hat. Warum kann ich hier nicht darauf zugreifen, wie es der erste Beispielcode getan hat? – user3918985

+1

@ user3918985 'Datei' implementiert' Read', was 'read_to_string' liefert. Ich verstehe nicht, was du mit "hier" meinst. Sie müssen dieses Merkmal (wie ich zeige) verwenden, um diese Methoden im Geltungsbereich zu haben. – Shepmaster

+0

Vielen Dank für Ihre sehr ausführliche Erklärung. – liuyanghejerry

Verwandte Themen