Как вы уже обнаружили, Cow
происходит от Regex::replace_all
В вашем случае очень опасен и обескуражен способ получить итератор из &str
:
extern crate regex; // 1.0.5
use regex::Regex;
use std::borrow::Cow;
pub struct Parser {
code: String,
}
impl Parser {
pub fn new(code: String) -> Parser {
Parser { code }
}
pub fn lines<'a>(&'a self, comment: Regex) -> Box<Iterator<Item = &'a str> + 'a> {
let lines = self
.code
.split("\n")
.map(move |line| comment.replace_all(line, ""))
.map(|cow| match cow {
Cow::Borrowed(sref) => sref,
Cow::Owned(_) => panic!("I hope never to be here"),
});
Box::new(lines)
}
}
fn main() {
let comment: Regex = Regex::new(r"//.*$").unwrap();
let p = Parser::new("hello\nworld".to_string());
for item in p.lines(comment) {
println!("{:?}", item);
}
}
Это работает, потому что нет Cow
s, которые бы выделяли строки.
Лучшим способом может быть возврат итератораString
с:
pub fn lines<'a>(&'a self, comment: Regex) -> Box<Iterator<Item = String> + 'a> {
let lines = self
.code
.split("\n")
.map(move |line| comment.replace_all(line, ""))
.map(|cow| cow.into_owned());
Box::new(lines)
}