问题
一个函数的参数为&T
,而T有可能为String
,此时只会解析成&String
,而不能使用&str
。这种接口通用性很差。
pub fn get<K>(&self, k: &K) -> Option<&V>
where
K: OtherTrait,
{
// ...
}
Borrow Trait
借用类型Q
时,可以被视为借用类型T
,如String
借用变为str
借用、Box<T>
借用变为T
借用。这需要使用Borrow
trait来实现。Q impl Borrow<T>
。Borrow in std::borrow - Rust
AsRef
trait与此功能十分相似,但也有区别。AsRef in std::convert - Rust
解决
使用Borrow trait可以解决问题。
pub fn get<Q>(&self, k: &Q) -> Option<&V>
where
K: Borrow<Q>,
Q: ?Sized + OtherTrait
{
// ...
}
K: Borrow<Q>
使得对K的借用等价为对Q的借用。如果上下文推导出K
为String
,则Q
就可以是str
,从而得到&str
类型的函数参数。
这也要求目标Q
要满足OtherTrait
。
副作用是会传参时使用into()
不能很好地自动推断。