< 返回版块

yueruijie 发表于 2021-06-24 12:57

Tags:求助大佬

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

评论区

写评论
araraloren 2021-06-28 12:28

刚才琢磨了一下,在其他语言虽然很容易实现的东西,在rust除非使用unsafe的指针,不然你使用引用很难达到你的目的

let mut array = vec![WordCount{count: 1}, WordCount{count:2}, WordCount { count: 3}];

let ref_arr: Vec<*mut WordCount> = vec![&mut array[0], &mut array[1], &mut array[2]];

// reduce 函数要求你返回一个 引用,你无法返回内部的引用,只能返回a,a又无法是 & &mut
let ret= ref_arr.iter().reduce(|a, b|{
    unsafe {
        (**a).count += (**b).count;
    }
    a
});

unsafe { dbg!(&*(*(ret.unwrap()))); }
araraloren 2021-06-28 12:12

你这错误只是一个非常表面的错误,就算修复了它也编译通过不了..

let  wc:&'a mut WordCount =&mut WordCount{ word:String::new(),count:0 };

let option = reduce.count(|e, e1| wc.acc(e,e1)); 
// rust的闭包很严格的,这里很难编译通过..
Bai-Jinlin 2021-06-25 15:07

感觉你写的太乱了,懒得看,给你重写了一个。 https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=b37cce9a3e3e540d3c1e32f8abd8b080

jamesmarva 2021-06-25 13:14
F:FnMut(&'a T,&'a T)-> &'a T +'static 

是这段代码引起吗?

因为这里返回值的生命周期不匹配?

fn acc(&mut self, o1:&WordCount, o2:&WordCount) -> &WordCount {
        self.count =o1.count +o2.count;
        self.word=o1.word.clone();
        self
    }
苦瓜小仔 2021-06-24 22:59

你的问题和你给的代码仿佛就在说:请给我写一个完整而正确的案例 / 请给我解释怎么通过这些代码里的生命周期。

拜托,我(或者其他想给你解决问题的人)怎么知道你到底哪个细节不懂。

提问也是一种技术。

你的问题重点在于生命周期,这是相当复杂的范畴。

首先确保你对它有足够的了解和理解,否则别在没学习过/学习到一半的时候提任何让人很难回答的问题,这会浪费所有人的时间。

如果你至少理解了 Rust Book 泛型和生命周期 , 那么请把你困惑的地方抽象(或者浓缩)成 MWE (最小工作示例), 没有人愿意读完你这整段逻辑复杂的代码,而且还很不 Rust 风格。

如果你连去掉多余代码细节,直指你问题核心之处的能力都没有,说明你基础知识非常不充分,所以自己找资料去学习。

uno 2021-06-24 13:59

可以参考油条哥的 https://github.com/sunli829/yql

作者 yueruijie 2021-06-24 12:58

大佬帮忙看看问题

1 共 7 条评论, 1 页