I am trying to write a small utility to be able to load integers from stdin. Intention was to be able to read as many integers as needed by the program.
However, I get below error when trying to compile this.
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter in function call due to conflicting requirements
I understand what the error is saying, but I can't figure out how to resolve it.
I have 2 questions here.
- Am I doing something that shouldn't be done? If yes, what is the right way to go about it?
- If this is acceptable requirement, what should I do to fix it?
Rust Playground Link:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2015&gist=5b05881daad8aa0ba4c36d8f3aba9258
use std::io;
mod sca2 {
use std::str::SplitWhitespace;
use std::io;
use std::str;
pub struct Scanner<'a, R> {
reader: R,
buffer: String,
buf_iter: SplitWhitespace<'a>,
}
impl<'a, R: io::BufRead> Scanner<'a, R> {
pub fn new(reader: R) -> Self {
Scanner {
reader: reader,
buffer: String::new(),
buf_iter: "".split_whitespace(),
}
}
pub fn token<T: str::FromStr>(&mut self) -> T {
loop {
if let Some(token) = self.buf_iter.next() {
return token.parse().ok().expect("Failed parse");
}
self.buffer.clear();
self.reader.read_line(&mut self.buffer).expect("Failed read");
// self.buf_iter = unsafe {
// let slice = str::from_utf8_unchecked(&self.buffer);
// std::mem::transmute(slice.split_whitespace())
// };
self.buf_iter = self.buffer.split_whitespace();
}
}
}
}
fn main() {
let stdin = io::stdin();
let mut scan = sca2::Scanner::new(stdin.lock());
let n: i32 = scan.token();
println!("{}", n);
}