我在书上看到基于 std::io::Write 的示例,它是一个 trait 类型,内部声明了一些方法。和 go 语言不同,rust 中类型必须明确实现 trait 类型,而 go 语言属于 duck 模式。
std::io::Write
下面的例子中调用 write_all 方式来演示,write_all 也是 Write trait 声明要实现的方法之一。
示例中 buf 的类型是 Vec<u8>
类型,调用 write_all 向其中写入数据,然后将 buf 转换为 &str 类型打印输出。
但下面的代码会编译报错,提示 method not found,buf 实现了 Write trait,但编译器找不到这个 write_all 方法。问题的原因:特型本身必须在作用域中,否则,特型的所有方法都是隐藏的。我理解,这属于 rust 类型和 trait 的自动绑定过程。
解决编译问题的方法非常简单,只需要在文件头部导入 use std::io::Write;
就可以了。
use std::str;
// use std::io::Write;
fn main() {
let mut buf: Vec<u8> = vec![];
let _ = buf.write_all(b"hello");
let s = match str::from_utf8(buf.as_slice()) {
Ok(v) => v,
Err(e) => panic!("Invalid UTF-8 sequence:{}", e),
};
println!("{}", s);
}
下面我们看下 write_all 方法提供的 example,创建一个文件,然后向其中写入内容。buffer 对象调用了结构体声明的 write_all 方法。这里就明显区别于 Vec 类型,File 调用的过程没有使用到 trait 特性。
use std::io::prelude::*;
use std::fs::File;
fn main() -> std::io::Result<()> {
let mut buffer = File::create("foo.txt")?;
buffer.write_all(b"some bytes")?;
Ok(())
}