Rust 结构方法类型推断
鉴于以下情况:Rust 结构方法类型推断,rust,Rust,鉴于以下情况: use std::old_io::{BufferedReader, File}; struct Journal<T> where T: Buffer { file: T, } impl<T: Buffer> Iterator for Journal<T> { type Item = String; fn next(&mut self) -> Option<String> {
use std::old_io::{BufferedReader, File};
struct Journal<T> where T: Buffer {
file: T,
}
impl<T: Buffer> Iterator for Journal<T> {
type Item = String;
fn next(&mut self) -> Option<String> {
match self.file.read_line() {
Ok(line) => Some(line.to_string()),
Err(_) => None,
}
}
}
fn main() {
let path = Path::new("/tmp/allocator-journal.txt");
let mut file = BufferedReader::new(File::open(&path));
let journal = Journal {file: file};
for line in journal {
print!("{}", line);
}
}
将类型提示添加到变量绑定或方法调用(Journal::new:
)都无法解决此问题
为什么不能推断出类型?Journal::new的签名是明确的,对吗
另外,为什么
Journal::new()
的返回类型不能是Journal
where t=Buffer?您将泛型世界与非泛型世界混为一谈(细节?)。以下是修复方法:
impl Journal<BufferedReader<IoResult<File>>> {
fn new() -> Journal<BufferedReader<IoResult<File>>> {
let path = Path::new("/tmp/allocator-journal.txt");
let mut file = BufferedReader::new(File::open(&path));
Journal {file: file}
}
}
impl日志{
fn new()->Journal{
let path=path::new(“/tmp/allocator journal.txt”);
让mut file=BufferedReader::new(file::open(&path));
日志{file:file}
}
}
注意这里缺少T
。关键是您正在决定T
必须是什么类型(BufferedReader
),因此不需要类型变量
通过使用类型变量,编译器试图找出T
应该是什么。但是,您没有在任何地方使用t
,因此它没有任何连接点的东西,您会得到一个错误,说明了这么多
这就提出了一个问题:为什么有泛型?实际上,您并没有将它们用于任何用途,因此您最好将
t
替换为BufferedReader
。感谢您的回答:)
impl Journal<BufferedReader<IoResult<File>>> {
fn new() -> Journal<BufferedReader<IoResult<File>>> {
let path = Path::new("/tmp/allocator-journal.txt");
let mut file = BufferedReader::new(File::open(&path));
Journal {file: file}
}
}