gpt4 book ai didi

rust - 为什么在使用 Regex 映射字符串时显然需要 std::borrow::Cow?

转载 作者:行者123 更新时间:2023-11-29 08:22:44 25 4
gpt4 key购买 nike

我正在 Parser 中实现代码解析器结构。我正在公开一个 pub 方法 lines迭代删除注释的代码行。我想返回 Box<Iterator>

extern crate regex; // 1.0.5

use regex::Regex;

pub struct Parser {
code: String,
}

static comment: Regex = Regex::new(r"//.*$").unwrap();

impl Parser {
pub fn new(code: String) -> Parser {
Parser { code }
}

pub fn lines(&self) -> Box<Iterator<Item = &str>> {
let lines = self
.code
.split("\n")
.map(|line| comment.replace_all(line, ""));
Box::new(lines)
}
}

但是,编译器给出了这个错误:

error[E0271]: type mismatch resolving `<[closure@src/lib.rs:20:18: 20:54] as std::ops::FnOnce<(&str,)>>::Output == &str`
--> src/lib.rs:21:9
|
21 | Box::new(lines)
| ^^^^^^^^^^^^^^^ expected enum `std::borrow::Cow`, found &str
|
= note: expected type `std::borrow::Cow<'_, str>`
found type `&str`
= note: required because of the requirements on the impl of `std::iter::Iterator` for `std::iter::Map<std::str::Split<'_, &str>, [closure@src/lib.rs:20:18: 20:54]>`
= note: required for the cast to the object type `dyn std::iter::Iterator<Item=&str>`

它要我使用 std::borrow::Cow ,但我在 the Map docs 中找不到任何内容提到这个要求。为什么这是必要的?我能避免吗?

最佳答案

强烈建议阅读您正在使用的所有类型和方法的文档。例如,Regex::replace_all记录为:

pub fn replace_all<'t, R: Replacer>(
&self,
text: &'t str,
rep: R
) -> Cow<'t, str>
// ^^^^^^^^^^^^

这就是 Cow 的来源。

一旦分配了新字符串,就不可能返回 &str 的迭代器;您将需要选择一个新的迭代器类型。类似这样的事情似乎是可能的,但由于您的代码由于此生命周期问题以外的原因无法编译,因此我无法轻松地对其进行测试。

pub fn lines<'a>(&'a self) -> Box<dyn Iterator<Item = Cow<'a, str>> + 'a>

另见:

关于rust - 为什么在使用 Regex 映射字符串时显然需要 std::borrow::Cow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52394099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com