Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么&;str没有实现到迭代器中吗?_Rust - Fatal编程技术网

Rust 为什么&;str没有实现到迭代器中吗?

Rust 为什么&;str没有实现到迭代器中吗?,rust,Rust,我正在编写一个以通用方式实现前缀树的容器(键和值是通用参数)。由于这种数据结构的性质,我需要有迭代器的键 本质上,根据IntoIterator的,trait负责这种可能性,但并非所有结构都实现了它。例如,&str和String不实现它 在这种情况下,如果标准类型没有实现IntoIterator,我应该怎么做 预期的API是 let mut t1 = Trie::new(); t1.insert(String::from("this"), 1); let mut t2 = Trie::new()

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

本质上,根据IntoIterator的
,trait负责这种可能性,但并非所有结构都实现了它。例如,
&str
String
不实现它

在这种情况下,如果标准类型没有实现
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);

如注释中所述,最简单的解决方案是创建包装器类型:

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);
    }
}
use::std::iter::IntoIterator;
StringWrapper结构{
类型项=字符;

键入IntoIter=::std::str::Chars字符串
str
的问题是它们有两种类型的迭代器-
Chars()
-UTF-8字符迭代器和
bytes()
-字节迭代器。这就是为什么不可能为这些类型实现
IntoIterator
。您必须创建两个包装器(或选择其中一个)


你可以编写一个包装器类型并为它实现trait。另外,为什么
string.iter()
不够用?@BernardoMeurer请查看更新的问题。据我所知,没有trait需要实现
iter()
@BernardoMeurer除了泛型在这种情况下工作需要有一个特性之外,
str
&str
String
&String
似乎都没有
iter()方法。
struct ByteString(String)
struct Utf8String(String)