首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回一个在Rust中使用闭包的映射迭代器

返回一个在Rust中使用闭包的映射迭代器
EN

Stack Overflow用户
提问于 2015-08-09 13:40:44
回答 1查看 6.6K关注 0票数 14

我正在学习一些解决Matasano密码挑战的Rust,并将Ceasar密码(“单字节xor")作为迭代器来实现。我的函数应该是这样的:

代码语言:javascript
复制
fn ceaser_cipher_iter(data: &Vec<u8>, key :u8) -> SomeType {
    data.iter().map(move |&p| p^key)
}

编译器将SomeType替换为(),然后告诉我它需要什么样的类型:core::iter::Map<core::slice::Iter<'_, u8>, [closure src/main.rs:59:21: 59:31]>。经过一番吹毛求疵之后,我发现我可以用std::slice::Iter<u8>作为core::slice::Iter<'_, u8>,这样就可以关闭了。据我所知,我天真的实验

代码语言:javascript
复制
fn ceaser_cipher_iter(data: &Vec<u8>, key :u8) -> Map<std::slice::Iter<u8>, fn(&u8)->u8 > {
    data.iter().map(move |&p| p^key)
}

无法工作,因为Rust需要知道确切的闭包类型才能为闭包分配内存(key必须通过将moved存储到闭包中)。我尝试使用建议来代替Box

代码语言:javascript
复制
fn ceaser_cipher_iter(data: &Vec<u8>, key :u8) -> Map<std::slice::Iter<u8>, Box<Fn(&u8)->u8> > {
    data.iter().map(Box::new(move |&p| p^key))
}

但是afaict map不支持它:

代码语言:javascript
复制
src/main.rs:59:17: 59:47 error: the trait `core::ops::FnMut<(&u8,)>` is not implemented for the type `Box<for<'r> core::ops::Fn(&'r u8) -> u8>` [E0277]
src/main.rs:59     data.iter().map(Box::new(move |&p| p^key))
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.rs:59:17: 59:47 error: the trait `core::ops::FnOnce<(&u8,)>` is not implemented for the type `Box<for<'r> core::ops::Fn(&'r u8) -> u8>` [E0277]
src/main.rs:59     data.iter().map(Box::new(move |&p| p^key))
                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

有方法返回带闭包的映射迭代器吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-09 13:46:00

诀窍不是将闭包装箱,而是将迭代器作为一个整体。

代码语言:javascript
复制
fn ceaser_cipher_iter<'a>(data: &'a Vec<u8>, key: u8) -> Box<dyn Iterator<Item=u8> + 'a> {
    Box::new(data.iter().map(move |&p| p.key))
}

注意,由于迭代器使用的是借阅,所以我必须添加生存期注释,这样代码才能通过借贷检查。

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

https://stackoverflow.com/questions/31904842

复制
相关文章

相似问题

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