Com o Rust sendo relativamente novo, já vi muitas maneiras de ler e gravar arquivos. Muitos são trechos extremamente confusos que alguém criou para seu blog, e 99% dos exemplos que encontrei (mesmo no Stack Overflow) são de versões instáveis que não funcionam mais. Agora que o Rust está estável, o que é um snippet simples, legível e sem pânico para ler ou gravar arquivos?
Este é o mais próximo que cheguei de algo que funciona em termos de leitura de um arquivo de texto, mas ainda não está compilando, mesmo tendo certeza de que incluí tudo o que deveria ter. Isso se baseia em um snippet que encontrei no Google+ de todos os lugares, e a única coisa que mudei é que o antigo BufferedReader
agora é apenas BufReader
:
use std::fs::File;
use std::io::BufReader;
use std::path::Path;
fn main() {
let path = Path::new("./textfile");
let mut file = BufReader::new(File::open(&path));
for line in file.lines() {
println!("{}", line);
}
}
O compilador reclama:
error: the trait bound `std::result::Result<std::fs::File, std::io::Error>: std::io::Read` is not satisfied [--explain E0277]
--> src/main.rs:7:20
|>
7 |> let mut file = BufReader::new(File::open(&path));
|> ^^^^^^^^^^^^^^
note: required by `std::io::BufReader::new`
error: no method named `lines` found for type `std::io::BufReader<std::result::Result<std::fs::File, std::io::Error>>` in the current scope
--> src/main.rs:8:22
|>
8 |> for line in file.lines() {
|> ^^^^^
Para resumir, o que estou procurando é:
- brevidade
- legibilidade
- cobre todos os erros possíveis
- não entra em pânico
std::io::Read
), observe que no Rust você deve importar as características que espera usar explicitamente ; Assim, aqui você está faltando um use std::io::Read
(o que poderia ser um use std::io::{Read,BufReader}
a se aglutinar os dois usos em conjunto)