首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么&str不实现IntoIterator?

为什么&str不实现IntoIterator?
EN

Stack Overflow用户
提问于 2018-04-22 12:56:20
回答 2查看 555关注 0票数 2

我正在编写一个以通用方式实现前缀树的容器(键和值是通用参数)。由于这个数据结构的性质,我需要有一个迭代器的键。

从本质上讲,根据this questionIntoIterator特征是造成这种可能性的原因,但并不是所有的结构都实现它。例如,&strString没有实现它。

在这种情况下,当IntoIterator不是由标准类型实现时,我该怎么办?

预期的API为

代码语言:javascript
复制
let mut t1 = Trie::new();
t1.insert(String::from("this"), 1);

let mut t2 = Trie::new();
t2.insert(vec![1, 2, 3], 1);
EN

回答 2

Stack Overflow用户

发布于 2018-04-22 14:51:13

Stringstr的问题在于它们有两种类型的迭代器--基于UTF-8字符的chars()迭代器和基于字节的bytes()迭代器。这就是为什么不可能为这些类型实现IntoIterator的原因。您必须创建两个包装器(或选择其中一个)

代码语言:javascript
复制
struct ByteString(String)
struct Utf8String(String)

并为它们实现IntoIterator

票数 6
EN

Stack Overflow用户

发布于 2018-04-22 14:49:50

正如评论中所述,最简单的解决方案是创建一个包装器类型:

代码语言:javascript
复制
use ::std::iter::IntoIterator;

struct StringWrapper<'a>(&'a str);

impl<'a> IntoIterator for StringWrapper<'a> {
    type Item = char;
    type IntoIter = ::std::str::Chars<'a>;

    fn into_iter(self) -> Self::IntoIter {
        self.0.chars()
    }
}

fn main() {
    // Raw str
    let wr = StringWrapper("test 1");
    for c in wr {
        println!("{}", c);
    }
    println!("-----");

    // Reference to raw str 
    let s = "test 2";
    let wr_s = StringWrapper(s);
    for c in wr_s {
        println!("{}", c);
    }
    println!("-----");

    // reference to String
    let owned_s = "test 3";
    let wr_s_owned = StringWrapper(&owned_s);
    for c in wr_s_owned {
        println!("{}", c);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49962611

复制
相关文章

相似问题

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