为什么派生的clone()方法返回一个引用? [复制]

2024-02-16

推导Clone包含对泛型类型对象的引用的结构的特征(除非它有Clone边界。在这种情况下,克隆工作将按预期生成clone()方法返回对象的引用,但不返回新对象。

我有代码:

#[derive(Clone)]
struct A<'a, T: 'a>{
    ref_generic: &'a T
}

fn test_call<'a, T: 'a>(a: &A<'a, T>)->A<'a, T>{
    a.clone()
}

这会导致错误:

error[E0308]: mismatched types
  --> src/lib.rs:15:5
   |
14 | fn test_call<'a, T: 'a>(a: &A<'a, T>)->A<'a, T>{
   |                                        -------- expected `A<'a, T>` because of return type
15 |     a.clone()
   |     ^^^^^^^^^ expected struct `A`, found &A<'_, T>
   |
   = note: expected type `A<'a, T>`
              found type `&A<'_, T>`

为什么derive会有这样的行为?

手动实施可以避免这个障碍,但令人不快。

impl<'a, T: 'a> Clone for A<'a, T>{
    fn clone(&self)->Self{
        A{ref_generic: self.ref_generic}
    }
}

你没有打电话A::clone()。你正在呼唤&A::clone(),即您正在克隆引用,而不是对象。

编译器实际上更喜欢调用A::clone(),因为参数匹配更精确(Clone::clone需要一个&self,因此单个引用完全匹配,而不需要自动引用来调用引用克隆),但它不能。 (您可以通过查看尝试执行以下操作时收到的错误消息来看到这一点(*a).clone()相反。)这是因为自动派生Clone天真地将其实现为:

impl <'a, T: Clone + 'a> Clone for A<'a, T> {
  fn clone(&self) -> Self { Self { ref_generic: self.ref_generic } }
}

请注意Clone绑定于T。该界限不是必需的,但自动推导仍然需要它。这是错误#26925 https://github.com/rust-lang/rust/issues/26925.

Your test_call函数没有上界T,这意味着导出的Clone暗示为A不可用,因此编译器回退到唯一的Cloneimpl 它可以调用,这是一个&A.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么派生的clone()方法返回一个引用? [复制] 的相关文章

随机推荐

  • 如何在子类中“隐藏”超类方法

    我基本上想创建一个子类来 隐藏 超类上的方法 以便它们不会出现在dir or hasattr 呼叫并且用户无法呼叫他们 至少不能通过任何正常渠道 我也想用尽可能少的 魔法 来做到这一点 谢谢 覆盖 dir and getattribute
  • 如何在GUI中使用QStackedWidget?

    我是 Qt 新手 我必须为此制作一个具有多个窗口的 GUI 我发现QStackedWidget使用 Qt 设计器工具的类 I added QStackedWidget使用添加新 gt Qt设计器表单类 gt Qstackedwidget 之
  • 使用 Sparklyr 将字符串/字符转换为日期

    我已经将一张表带入 Hue 其中有一列日期 我正在尝试在 Rstudio 中使用 Sparklyr 来玩它 我想将字符列转换为日期列 如下所示 Weather data mutate Weather data date2 as Date d
  • Discord.js 提及

    client on message message gt if message content L hug if message mentions users size return message reply you need to ta
  • 在Xcode中使用GPX模拟位置变化时,有没有办法控制速度?

    我在 Xcode 4 2 中使用以下 GPX 文件来模拟位置更改 效果很好 但我无法控制位置变化的速度 邮票似乎不起作用 有人有解决方案吗
  • 列出参加 MS Teams 会议的人员以及参加时间

    我想列出谁参加了 MS Teams 会议以及他们参加了多长时间 以便他们能够因参加培训课程而获得积分 我查看了 Graph API v1 和 beta 版本 会议有一个名为meetingParticipantInfo 但我没有看到任何内容可
  • 如何将图像保存到Android中的Camera文件夹中?

    我正在尝试将照片保存到我的应用程序拍摄的相机文件夹中 这就是我正在尝试的 private File createImageFile throws IOException Create an image file name String ti
  • 从 DART 中的 List> 获取特定键的数组

    我有一个包含以下值的列表 List
  • 当路径包含 url 片段时,如何在 Web 浏览器中打开本地 html 文件

    我正在尝试通过以下方法打开网络浏览器 然而 当浏览器打开 url 文件路径时 片段片段被破坏 从 anchorName 到 23anchorName 这似乎没有得到处理 所以基本上 文件打开但不会跳转到文档中的适当位置 有谁知道如何打开文件
  • nginx、fastcgi 和开放套接字

    我正在尝试在 nginx 上使用 fastcgi 但遇到了一些问题 Nginx 不会重用连接 它在 BeginRequest 标志中给出 0 因此应用程序应该在请求完成后关闭连接 我有以下关闭代码 socket shutdown Socke
  • Composer/PSR - 如何自动加载函数?

    如何自动加载辅助函数 在任何类之外 我可以指定在composer json某种应该首先加载的引导文件 You can 自动加载特定文件 https getcomposer org doc 04 schema md files通过编辑你的co
  • CDI 适用于常规 Java 应用程序吗?

    我有一个简单的 Maven 项目 包含三个类 在我的META INF我有我的空beans xml 每次我运行我的Main java我得到一个NullPointerException Exception in thread main java
  • MinGW:与 LAPACK 和 BLAS 链接会导致 C++ 异常无法处理

    情况很简单 但却很奇怪 当我在没有 LinearAlgebra o 源代码 需要链接到 LAPACK 的情况下编译程序时 会捕获并处理 C 异常 当我不包含该编译单元但仍然链接到库时 llapack lblas 捕获并处理异常 但是一旦我把
  • 如何调试 COM C++ 进程外服务器? (客户端:Excel vba)

    我不知道如何使用 Visual Studio 2015 调试 COM ATL C 进程外 exe 服务器 对于 COM ATL DLL 来说没有问题 当我调用 COM dll 时断点会自动触发 然而 当我尝试调试 EXE 服务器时 调试器并
  • Angular - 如何应用 [ngStyle] 条件

    我有一个 div 我想根据条件设置样式 如果 styleOne 为 true 我想要红色的背景色 如果 StyleTwo 为 true 我希望背景颜色为蓝色 我已经用下面的代码完成了一半的工作 div 是否可以添加一个条件说 如果 styl
  • tomcat中的关闭挂钩(必要)未运行

    我有一个长时间运行的 cpu 和数据库密集型线程 以低优先级运行 可以根据管理员请求由我的 tomcat 应用程序触发 我为此线程使用了关闭钩子 这样如果应用程序被强制停止 它可以在退出之前清理数据库状态 在独立模式下完美工作 使用 con
  • 如何在终端中绘制图表

    我正在研究 ML Theano 最近遇到了这个脚本 https gist github com notmatthancock 68d52af2e8cde7fbff1c9225b2790a7f https gist github com no
  • 从“Docker快速启动终端”启动docker时如何添加`--registry-mirror`?

    来自 docker 分发文档 https github com docker distribution https github com docker distribution 它说要配置 docker 使用镜像 我们应该 Configur
  • Sprite Kit 的关卡编辑器?

    您知道与 iOS 版 Sprite Kit 兼容的关卡编辑器吗 我需要一个类似的软件Cocos 构建器 http cocosbuilder com这很好 但据我所知它与 Sprite Kit 不兼容 谢谢 这是一个清单 截至 2015 年
  • 为什么派生的clone()方法返回一个引用? [复制]

    这个问题在这里已经有答案了 推导Clone包含对泛型类型对象的引用的结构的特征 除非它有Clone边界 在这种情况下 克隆工作将按预期生成clone 方法返回对象的引用 但不返回新对象 我有代码 derive Clone struct A