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

时间:2019-11-02 16:17:15

标签: rust traits

在文档中指出

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

我会读这个:

  

此特性适用于每种类型,甚至是大小不一的类型。

这正确吗?

我收到错误消息: std::borrow::Borrow<T>尚未实现特征&num_complex::Complex<f64>

我无法理解

(我不想发布整个代码,我只想澄清一下哪些类型实现了std :: borror :: Borrow)

1 个答案:

答案 0 :(得分:1)

要认识的重要一点是,在毯子impl中只有一个T,它必须在两个地方都表示 same 类型:

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的借口(这不会借用还是很有道理的。)

您正在某些通用代码中使用此代码,其中impl可以是任何东西,因此Borrow<T> for T的总括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>的任何引用都会实现FROM maven:3.6.0-jdk-11-slim AS build COPY src src COPY pom.xml . RUN mvn -f pom.xml clean package install FROM openjdk:8-jre COPY --from=build /target /opt/target WORKDIR /target RUN ls CMD ["java", "-jar", "Customer.jar"] 。取决于您的实际代码,由于autoref / autoderef,这两种方法中的一种或两种都可能起作用。