![](/img/trans.png)
[英]mypy complains: function type annotation with Type[TypeVar['T', str, date]] and T output: Incompatible return value type (got "str", expected "date")
[英]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
同時為&str
和char
實現,所以我不知道它是如何發生的。
為什么不將Split
類型簡單定義為Split<'a, &'a str>
,因為它實際上是對&str
的Iterator
? 為什么它的行為好像被有效地定義為那樣?
該類型具有
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>
,因為它實際上是對&str
的Iterator
?
因為迭代器是惰性的。 Split
結構仍需要了解模式才能匹配下一項。 它的迭代器實例具有Item = &str
,因為這是對其進行迭代的內容。
[1]實際的實現是由宏生成的 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.