首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std:io:BufReader 对象借用和引用的问题

问题描述

此问题来自于Rust社区,

在问题中,题主使用如下代码读取文件内容Ok:

//第一段代码

use std::io::;

use std::fs::File;

fn main() -> std::result::Result {

let filename = "test.bed";

let fi = File::open(filename)?;

let bedreader = io::BufReader::new(fi); //注意,bedreader不是mutable

for line in bedreader.lines() {

println!("{}", line?);

}

Ok(())

}

但是当换成如下代码后,出错:

//第二段代码

use std::io::;

use std::fs::File;

fn main() -> std::result::Result {

let filename = "test.bed";

let fi = File::open(filename)?;

let bedreader = io::BufReader::new(fi); //注意,bedreader不是mutable

let mut line = String::new();

while bedreader.read_line(&mut line).unwrap() > 0 {//此处报错

println!("{}", line.trim_end());

line.clear();

}

Ok(())

}

在第二段代码中,题主认为试用while循环读取内容,line已经定义成mutable的了,不应该出错。

问题解决

对于第二段代码,进行如下修改后就能正确运行,如下:

//对第二段代码修正

use std::io::;

use std::fs::File;

fn main() -> std::result::Result {

let filename = "test.bed";

let fi = File::open(filename)?;

let mut bedreader = io::BufReader::new(fi); //注意,bedreader是mutable

let mut line = String::new();

while bedreader.read_line(&mut line).unwrap() > 0 {//此处不再报错

println!("{}", line.trim_end());

line.clear();

}

Ok(())

}

问题解释

在第一段代码中,在for循环中使用的是通过bedreader.lines()读取每一行,而该方法的定义为:

fn lines(self) -> Lines

而在第二段代码中使用的read_line,定义为:

fn read_line(&mut self, buf: &mut String) -> Result

因此,从两个方法的定义可以看出,第一段代码不需要定义成mutable,第二段代码中需要定义成mutable。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200116A0W9VA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券