簡體   English   中英

為什么即使Pattern同時具有&str和char的實現,Split類型也只返回&str?

[英]Why does the Split type only return &str even though Pattern has implementations for both &str and char?

我很難理解Split類型在Rust中的工作方式。

Split<'a, P> where P: Pattern<'a>std::string::String::split方法返回的類型。 該類型具有Iterator<'a, P> ,其中P仍然是Pattern類型,但實際上(並且正如我所期望的那樣), Iterator僅返回&str切片。

例如, split(p).collect::<Vec<&str>>()可以工作,但是split(p).collect::<Vec<char>>()導致編譯器錯誤。 這是我希望發生的事情,但是由於Pattern同時為&strchar實現,所以我不知道它是如何發生的。

為什么不將Split類型簡單定義為Split<'a, &'a str> ,因為它實際上是對&strIterator 為什么它的行為好像被有效地定義為那樣?

該類型具有Iterator<'a, P>

沒有。 只是Iterator ,沒有類型參數。 Iterator每個實現都必須使用關聯的類型聲明要Iterator的項的類型。 例如, Split的實現[1]是這樣的:

impl <'a, P> Iterator for Split<'a, P> {
    type Item = &'a str;
    fn next(&mut self) -> Option<&'a str> { ... }
}

為什么不將Split類型簡單定義為Split<'a, &'a str> ,因為它實際上是對&strIterator

因為迭代器是惰性的。 Split結構仍需要了解模式才能匹配下一項。 它的迭代器實例具有Item = &str ,因為這是對其進行迭代的內容。


[1]實際的實現是由宏生成的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM