2015-05-20 31 views
0

鏽FromStr性狀的定義如下FromStr特質不暴露生命的原因是什麼?

pub trait FromStr { 
    type Err; 
    fn from_str(s: &str) -> Result<Self, Self::Err>; 
} 

它不指定其壽命和一個不能執行該性狀用於容納參考源串的東西,例如:

struct MyIterator<'a> { 
    cur_pointer: &'a str 
} 

impl<'a> FromStr for MyIterator<'a> { 
    type Err = i32; 
    fn from_str(s: &'a str) -> Result<Self, Self::Err> { 
     Ok(MyIterator { cur_pointer: s }) 
    } 
} 

給出錯誤

method `from_str` has an incompatible type for trait: expected bound lifetime parameter , found concrete lifetime [E0053] 

到目前爲止,我發現沒有辦法爲MyIterator實現FromStr。我認爲這是因爲原始特徵沒有在參數中暴露字符串的生命週期。 我的第一個問題是:我沒有辦法爲MyIterator實現FromStr嗎?如果我錯了,有什麼辦法可以做到這一點(假設MyIterator想要繼續引用原始字符串)?

現在我發現只有這個問題:How do I implement FromStr with a concrete lifetime?,但最好的答案是以「我不相信你可以實現」開頭,所以我想確定這在Rust 1.0.0中是不可能的。

現在,如果特徵定義是這樣的:

trait MyFromStr<'a> { 
    type Err; 
    fn from_str(s: &'a str) -> Result<Self, Self::Err>; 
} 

一個可以實現它包含原始字符串的引用類型和不包含原始字符串的引用:

struct MyIterator<'a> { 
    cur_pointer: &'a str 
} 

impl<'a> MyFromStr<'a> for MyIterator<'a> { 
    type Err = i32; 
    fn from_str(s: &'a str) -> Result<Self, Self::Err> { 
     Ok(MyIterator { cur_pointer: s }) 
    } 
} 

struct MyCopy { 
    val: String 
} 

impl<'a> MyFromStr<'a> for MyCopy { 
    type Err = i32; 
    fn from_str(s: &'a str) -> Result<Self, Self::Err> { 
     Ok(MyCopy { val: s.to_string() }) 
    } 
} 

我的第二個問題是:特質FromStr沒有任何特殊原因暴露生命?也許我誤解了關於生命的一些事情,揭露一生有缺點?

回答

3

包括生命期使得特徵更加複雜,更具體地說,使得使用該特徵的泛型代碼更加冗長(攜帶不需要的生命週期)。 fn foo<T: FromStr>no longer work

字符串的預期用途也是不必要的。通常你從字符串解析並使用結果而不用擔心字符串。這樣編碼肯定更容易。無論如何,許多類型都不需要生命週期(參見實現它的類型的長列表)。

您無法爲此類型實施FromStr。你可以做的是

impl<'a> From<&'a str> for MyIterator<'a> { ... } 

這給了你很多的通用轉換機械,只是沒有方法str::parse()。也許這種方法的名稱是另一個遺漏壽命的理由。

+0

非常感謝這個答案!我真的錯過了,如果生命期暴露出來,性狀不能很容易地用作類型參數。 –

相關問題