簡體   English   中英

從具有生命周期的結構切換到特征

[英]Switching from struct with lifetime to trait

我正在嘗試制作一個特性來呈現作為迭代器和字符串的東西。 如果我在get_iterator結果中使用struct std :: slice :: Iter,那么每次都可以。

pub trait Value {
    fn get_iterator(&self) -> Box<std::slice::Iter<String>>;
}

struct StringList {
    strings: Vec<String>
}

impl Value for StringList {
    fn get_iterator(&self) -> Box<std::slice::Iter<String>> {
        Box::new(self.strings.iter())
    }
}

fn main() {
}

但是當我切換到trait Iterator <&String>時

pub trait Value {
    fn get_iterator(&self) -> Box<Iterator<Item=&String>>;
}

struct StringList {
    strings: Vec<String>
}

impl Value for StringList {
    fn get_iterator(&self) -> Box<Iterator<Item=&String>> {
        Box::new(self.strings.iter())
    }
}

fn main() {
}

生銹抱怨生命:

<anon>:11:31: 11:37 error: cannot infer an appropriate lifetime for lifetime parameter 'a in function call due to conflicting requirements
<anon>:11         Box::new(self.strings.iter())

我應該如何定義特征並使其實現以使其有效?

順便說一句,為什么編譯器稱這個生命周期為'a? 它沒有在任何地方命名,通常生銹符合“匿名生命”。 這是一個應該報告的錯誤嗎?

我們想在StringList引用上聲明一個新的生命周期,並確保我們返回的盒裝迭代器特征受該生命周期的約束。

pub trait Value {
    fn get_iterator<'a>(&'a self) -> Box<Iterator<Item=&String> + 'a>;
}

struct StringList {
    strings: Vec<String>
}

impl Value for StringList {
    fn get_iterator<'a>(&'a self) -> Box<Iterator<Item=&String> + 'a> {
        Box::new(self.strings.iter())
    }
}

fn main() {
}

編輯:要回答有關生命周期'a'的問題,它實際上已定義,但文檔未顯示。 單擊Vec文檔中的Iter返回對象,您將看到在該對象上聲明了'a'。 Vec的實現必須將生命周期'a引入調用iter()時所采用的Vec引用。

暫無
暫無

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

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