簡體   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