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}
    }
}