为什么 std::borrow::Borrow 没有为每个类型实现?

Why is std::borrow::Borrow not implementet for every Type?

文档中说

impl<T> Borrow<T> for T where
    T: ?Sized, 

我会读这个:

This Trait is implemented for every Type, even unsized ones.

这是正确的吗?

我收到错误信息: 特征 std::borrow::Borrow<T> 没有为 &num_complex::Complex<f64>

实现

我无法理解。

(我不想 post 整个代码,我只想澄清哪些类型实现 std::borror::Borrow)

要认识到的重要一点是,在毯子 impl 中只有一个 T 并且它必须在两个地方代表 相同的 类型:

impl<T> Borrow<T> for T
    where T: ?Sized

为每种类型 T 实现 ,仅实现特定特征 Borrow<T>i64 实现 Borrow<i64>String 实现 Borrow<String>,等等。当我们用 T = &num_complex::Complex<f64> 实例化它时,实现了什么特征?

impl Borrow<&num_complex::Complex<f64>> for &num_complex::Complex<f64>  // (not compilable code, just illustrative)

换句话说,你可以借一个&Complex<f64> 作为一个&Complex<f64>,但是你不能随便借一个T (无论如何,这没有多大意义)。

您在一些通用代码中使用了它,其中 T 可以是任何东西,因此 Borrow<T> for Timpl 不适用。您可能可以通过添加特征界限来解决此问题:

where num_complex::Complex<f64>: Borrow<T>

这意味着Complex<f64>本身实现了Borrow<T>,或者

where for<'a> &'a num_complex::Complex<f64>: Borrow<T>

这意味着对 Complex<f64> 的任何引用都实现了 Borrow<T>。由于 autoref/autoderef.

,根据您的实际代码,其中一个或两个可能都有效