簡體   English   中英

通用超特征/需要一攬子實現

[英]Generic supertrait / requiring blanket impl

目前,我有這樣的特質:

trait Trait
where
    Self: Sized,
{
    fn try_form_u8(num: u8) -> Option<Self>;
    fn try_from_str<T: AsRef<str>>(s: &T) -> Option<Self>;
    // ...
}

最佳情況下,我想像這樣定義它,以便在TryFrom實現之外沒有try_from_*方法:

trait Trait: for<T: AsRef<str>> TryFrom<u8> + TryFrom<T>
where
    Self: Sized
{
    // ...
}

我找不到實現這一目標的方法,最后遇到了這個線程: 特征可以有一個由泛型參數化的超特征嗎?

我想知道如何從這里繼續。 我應該使用非常規的try_from_str方法還是有更好的方法來表達這里需要的內容?

請注意,在我的原始代碼中,我使用Path而不是str ,這可以消除一些特殊的解決方案,但如果有任何好的解決方案,我仍然想知道它們!

如果一個類型實現了TryFrom<&str> ,那么從StringRc<str>或任何其他AsRef<str>創建它是微不足道的。 讓我們從這個開始:

trait Trait: TryFrom<u8> + for<'a> TryFrom<&'a str> {}

只需調用.as_ref()即可輕松將其與其他類型一起使用,但如果您仍然需要通用版本,則可以提供默認實現:

trait Trait: TryFrom<u8> + for<'a> TryFrom<&'a str> {
    fn try_from_str<S: AsRef<str>>(arg: &S) -> Result<Self, <Self as TryFrom<&str>>::Error> {
        arg.as_ref().try_into()
    }
}

這樣, Trait實現者不必編寫任何特殊的東西,但用戶仍然可以使用方便的try_from_str函數。

Path版本

trait Trait: TryFrom<u8> + for<'a> TryFrom<&'a Path> {
    fn try_from_path<P: AsRef<Path>>(arg: &P) -> Result<Self, <Self as TryFrom<&Path>>::Error> {
        arg.as_ref().try_into()
    }
}

str版本

特別是對於str ,您可能希望使用標准庫特征FromStr而不是TryFrom ,后者更專門用於此用例,啟用str::parse並且不需要更高排名的特征邊界:

trait Trait: TryFrom<u8> + FromStr {
    fn try_from_str<S: AsRef<str>>(arg: &S) -> Result<Self, <Self as FromStr>::Err> {
        arg.as_ref().parse()
    }
}

暫無
暫無

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

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