use core::fmt;
use std::fmt::{Display, Formatter};
use std::io::{self, BufReader, prelude::*, Write};
use std::net::TcpStream;
use std::ops::Deref;
use std::str;
fn main() {
handle("localhost:9999").expect("--------------");
}
struct WordCount {
word: String,
count: i32,
}
impl WordCount{
fn acc(&mut self, o1:&WordCount, o2:&WordCount) -> &WordCount {
self.count =o1.count +o2.count;
self.word=o1.word.clone();
self
}
}
impl Display for WordCount {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "WordCount{{ word:{},count:{} }}", self.word, self.count)
}
}
fn handle<'a>(ip: &str) -> io::Result<()> {
let mut stream = TcpStream::connect(ip)?;
loop {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read from stdin");
stream.write(input.as_bytes()).expect("Failed to write to stream");
let mut reader = BufReader::new(&stream);
let mut buffer: Vec<u8> = Vec::new();
reader.read_until(b'\n', &mut buffer).expect("Could not read into buffer");
stream.flush();
let x = str::from_utf8(&buffer).expect("Could not write buffer as string");
let mut vec = Vec::new();
vec.push(x);
let mut t = vec.into_iter()
.flat_map(|e| e.split(" "))
.map(|e| WordCount { word: e.to_string(), count: 1 });
let mut vec1 = Vec::new();
while let Some(w) =&t.next() {
let mut vec2 = Vec::new();
vec2.push(w);
while let Some(w1) =&t.next() {
if w.word==w1.word {
vec2.push(w1) ;
}
}
let reduce = Reduce { iterator: vec2.into_iter() };
let wc:&'a mut WordCount =&mut WordCount{ word:String::new(),count:0 };
let option = reduce.count(|e, e1| wc.acc(e,e1));
if let Some(word_count) = option{
vec1.push(word_count);
}
}
println!("{:?}", t);
}
}
struct Reduce<'a ,T>{
iterator: std::vec::IntoIter<&'a T>
}
impl<'a,T> Reduce<'a,T> {
fn count<F>(self, f : F) -> Option<&'a T> where F:FnMut(&'a T,&'a T)-> &'a T +'static {
self.iterator.reduce(f)
}
}
##错误
--> src\bin\kvs.rs:68:33
|
68 | let option = reduce.count(|e, e1| wc.acc(e,e1));
| ^^^^^
|
= note: type must satisfy the static lifetime
1
共 7 条评论, 1 页
评论区
写评论刚才琢磨了一下,在其他语言虽然很容易实现的东西,在rust除非使用unsafe的指针,不然你使用引用很难达到你的目的
你这错误只是一个非常表面的错误,就算修复了它也编译通过不了..
感觉你写的太乱了,懒得看,给你重写了一个。 https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b37cce9a3e3e540d3c1e32f8abd8b080
是这段代码引起吗?
因为这里返回值的生命周期不匹配?
你的问题和你给的代码仿佛就在说:请给我写一个完整而正确的案例 / 请给我解释怎么通过这些代码里的生命周期。
拜托,我(或者其他想给你解决问题的人)怎么知道你到底哪个细节不懂。
提问也是一种技术。
你的问题重点在于生命周期,这是相当复杂的范畴。
首先确保你对它有足够的了解和理解,否则别在没学习过/学习到一半的时候提任何让人很难回答的问题,这会浪费所有人的时间。
如果你至少理解了 Rust Book 泛型和生命周期 , 那么请把你困惑的地方抽象(或者浓缩)成 MWE (最小工作示例), 没有人愿意读完你这整段逻辑复杂的代码,而且还很不 Rust 风格。
如果你连去掉多余代码细节,直指你问题核心之处的能力都没有,说明你基础知识非常不充分,所以自己找资料去学习。
可以参考油条哥的 https://github.com/sunli829/yql
大佬帮忙看看问题