Więc oczywiście mogłem zrobić coś takiego:

impl From<RangeInclusive<u32>> for Range<u32>{
    fn from(r: RangeInclusive<u32>) -> Self {
        (*r.start()..(r.end()+1))
    }
}

Zastanawiałem się jednak, czy była dla tego standardowa funkcja? (Nie mogłem znaleźć nic w Docs / po szybkim Google). Jeśli nie, w jaki sposób pójdziemy o wdrożenie tego typu dla każdego typu num, a taka implementacja byłaby mile widziana w rdzewienie, czy jest powód, dla którego nie jest już wdrożony?

1
PiRocks 16 październik 2020, 20:00

1 odpowiedź

Najlepsza odpowiedź

Nie każdy RangeInclusive może zostać przekonwertowany na Range, który jest głównym powodem RangeInclusive. Na przykład 0u32..=u32::MAX nie można przekonwertować na Range<u32>, ponieważ u32::MAX + 1 jest poza zasięgiem dla u32.

Wyobrażalny jest, że Range<u32> może zaimplementować TryFrom<RangeInclusive<u32>>, ale taka konwersja powinna rzadko konieczna. Zamiast konwersji między różnymi rodzajami zakresów, należy zazwyczaj pisać ogólne interfejsy API za pomocą RangeBounds.

3
trentcl 16 październik 2020, 17:20