首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >重构代码后,Peekable内容为None

重构代码后,Peekable内容为None
EN

Stack Overflow用户
提问于 2022-07-31 20:34:22
回答 1查看 40关注 0票数 0

我有这样的方法:

代码语言:javascript
运行
复制
fn parse_http_request_headers<'b>(sp: &'b mut std::str::Split<&str>) -> HashMap<String, String> {
        let mut headers: HashMap<String, String> = HashMap::new();
        let mut iter = sp.peekable();

        while iter.peek() != None {
            let next = iter.next();
            if let Some(value_to_parse) = next {
                let parts = value_to_parse.split(": ").collect::<Vec<&str>>();
                let key = parts.get(0);
                if parts.len() == 2 {
                    headers.insert(
                        (*key.expect(&format!("Error getting the header definition: {:?}", &key)))
                            .to_string(), 
                        (*parts.get(1)
                            .expect(&format!("Error getting the header value from: {:?}", &parts)))
                            .to_string()
                    );
                }
            } else { iter.next(); }
        }

        headers
    }

我重新分析了一下关于玩Interior mutability pattern的好奇心,试图解决关于包含引用的struct字段的一些疑问。但是,好吧,让我们来看看代码:

代码语言:javascript
运行
复制
fn parse_http_request_headers<'b>(sp: Rc<RefCell<&'b mut std::str::Split<&str>>>) -> HashMap<String, String> {
        
        let mut headers: HashMap<String, String> = HashMap::new();
        let mut borrow = sp.borrow_mut();  // let binding
        
        let mut iter = borrow.peekable();
        
        while iter.peek() != None {
            
            let next = iter.next();
            if let Some(value_to_parse) = next {
                let parts = value_to_parse.split(": ").collect::<Vec<&str>>();
                let key = parts.get(0);
                if parts.len() == 2 {
                    headers.insert(
                        (*key.expect(&format!("Error getting the header definition: {:?}", &key)))
                            .to_string(), 
                        (*parts.get(1)
                            .expect(&format!("Error getting the header value from: {:?}", &parts)))
                            .to_string()
                    );
                }
            } else { iter.next(); }
        }
        headers
    }

但是,让我惊讶的是,在这个可查看的peeked: None上没有迭代。

为什么会造成这种情况?

第一个版本很好地解析了http头,这是输出:

代码语言:javascript
运行
复制
HttpRequest { verb: GET, uri: Uri { uri: "/" }, http_version: V1_1, headers: {"Sec-Fetch-Mode": "navigate", "Connection": "keep-alive", "DNT": "1", "Sec-Fetch-Site": "none", "Host": "127.0.0.1:7878", "Sec-GPC": "1", "Sec-Fetch-User": "?1", "Upgrade-Insecure-Requests": "1", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0", "Accept-Language": "en-US,en;q=0.5", "Accept-Encoding": "gzip, deflate, br", "Sec-Fetch-Dest": "document"}, body: None }

呼叫代码:

代码语言:javascript
运行
复制
let rc: Rc<RefCell<&mut Split<&str>>> = Rc::new(RefCell::new(sp));
        
let (verb, uri, version) = Self::parse_verb_uri_version(Rc::clone(&rc));
let body = Self::parse_http_request_body(Rc::clone(&rc).borrow_mut().last().unwrap());
let headers = Self::parse_http_request_headers(Rc::clone(&rc));

其中spsp: &'a mut Split<&'a str>

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-31 21:15:32

在过程行中使用.last(),它将消耗迭代器中的所有元素,在parse_http_request_headers()中不留下任何迭代。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73186731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档