pub trait BorrowRange<T: ?Sized, R>: Borrow<R> { }Expand description
Helper trait to allow passing a range as either a owned value or a reference.
For instance:
use std::ops::RangeBounds;
use range_cmp::BorrowRange;
fn f<T, R: RangeBounds<T>, B: BorrowRange<T, R>>(range: B) {
let range = range.borrow();
// ...
}With concrete type such as i32, this would be achieved by taking a generic type T with
the bound T: Borrow<i32>. So we might be tempted to do the same with the RangeBounds
trait:
use std::borrow::Borrow;
use std::ops::RangeBounds;
fn f<R: RangeBounds<i32>, B: Borrow<R>>(range: B) {
let range = range.borrow();
// ...
}
f(0..42)However, this fails to compile when passing a reference:
ⓘ
f(&(0..42))The compilation output is:
| f(&(0..42))
| ^ cannot infer type of the type parameter `R` declared on the function `f`Indeed, although we understand we want to pass a Range<i32> by
reference, the compiler need to assume that other types could yield a
&Range<i32> when borrowed.