egmkang 服务端开发工程师

Rust BufReader::read_to_str

2015-01-16

前两天用rust写了两行代码, 就只是先写了收包的部分. 其他地方都还好, 碰到一个问题, 就是从二进制里面读取一个string不太好弄, 也不算是不好弄. Rust标准库提供了一个BufReader, 按道理是可以完成我的需求, 但是看完手册之后发现, 他只有一个read_to_string的接口. 这个接口是需要alloc一段内存, 然后做拷贝的. 这让我就不开心了. 因为rust还有另外一种字符串, 就是一个字符数组的slice, 叫str. 所以我既然都提供了数组, 你只需要slice一下, 就是str了. 而且标准库是有提供[u8]到str的转化的, 就是std::str::from_utf8这个函数.

所以就想去自己撸一个BufReader, 撸的过程中发现(其实看了一下标准库的实现), 发现只需要在标准库里面增加一个很小的函数, 就可以达到我的需求:

  #[inline]
  pub fn read_to_str(&mut self, length: uint) -> IoResult<&str> {
    if length > self.length() { return Err(standard_error(InvalidInput)); }
    let result = from_utf8(self.buf.slice(self.pos, self.pos + length));
    match result.ok() {
      Some(e) => { self.pos += length; Ok(e) }
      None => { Err(standard_error(EndOfFile)) }
    }
  }

代码还算是比较简单.

这算是rust文章的第一篇, 然后还特别新开了rust的类别, 希望能坚持研究下去.

PS: 上面只是简单实现了一下, 放到标准库里面也能编译的过, 就是不知道如果pull request上去的话, 别人会不会要我的代码. :(


上一篇 2014年总结

Comments