首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将片作为IntoIterator传递

将片作为IntoIterator传递
EN

Stack Overflow用户
提问于 2016-02-02 03:13:09
回答 1查看 1.3K关注 0票数 3

我有一个具有以下签名的函数:

代码语言:javascript
复制
pub fn history<'a, I: IntoIterator<Item = &'a str>>(&self, _: I)

稍后,我有一个带有一个名为main的字段的结构,该字段是一个装箱闭包。

代码语言:javascript
复制
main: box |args: &[&str], shell: &mut Shell| {
    shell.history.history(args);
},

重要的部分是,我调用了我用&[&str]作为参数显示的签名函数。我得到以下编译错误:

代码语言:javascript
复制
src/main.rs:281:47: 281:54 error: type mismatch resolving `<&[&str] as core::iter::IntoIterator>::Item == &str`:
 expected &-ptr,
    found str [E0271]
src/main.rs:281         shell.history.history(args);

所以很明显,&[&str]不像IntoIterator那样工作。我尝试了shell.history.history(args.into_iter());,得到了类似的错误消息。

奇怪的是,shell.history.history(args.iter().map(|s|*s));确实起作用。然而,这似乎并不是正确的解决办法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-02 03:24:56

让我们来看看 is implemented for slices

代码语言:javascript
复制
impl<'a, T> IntoIterator for &'a [T]
    type Item = &'a T
    type IntoIter = Iter<'a, T>
    fn into_iter(self) -> Iter<'a, T>

注意,Item被定义为对T的引用,其中T是片中项的类型。因为您有&str的一部分,这意味着Item&&str

您可以使用.map(|s| *s),正如您所尝试的那样,取消外部引用并生成一个&str迭代器。

另一种解决方案是将history函数概括为同时接受I: IntoIterator<Item = &'a str>I: IntoIterator<Item = &'b &'a str>。为了做到这一点,我们需要一个&'a str&'b &'a str都实现的特性。为此,我们可以使用AsRef (感谢Vladimir Matveev指出这一点):

代码语言:javascript
复制
pub fn history<I>(i: I)
where
    I: IntoIterator,
    I::Item: AsRef<str>,
{
    for s in i {
        println!("{}", s.as_ref());
    }
}

fn main() {
    history(&["s"]);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35144386

复制
相关文章

相似问题

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