为什么 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 T
的 impl
不适用。您可能可以通过添加特征界限来解决此问题:
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.
,根据您的实际代码,其中一个或两个可能都有效
文档中说
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 T
的 impl
不适用。您可能可以通过添加特征界限来解决此问题:
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.