繁体   English   中英

为什么&str没有实现IntoIterator?

[英]Why does &str not implement IntoIterator?

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

基本上根据这个问题IntoIterator特性负责这种可能性,但并非所有结构都实现它。 例如&strString不实现它。

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

预期的API是

let mut t1 = Trie::new();
t1.insert(String::from("this"), 1);

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

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

struct ByteString(String)
struct Utf8String(String)

并为他们实现IntoIterator

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

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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM