为什么编译器需要一个特征的实现来调用默认的自由函数?

2023-12-07

当调用一个不需要的特征的默认实现时self,为什么需要注释一个实现类型呢?

A 最小的、可重现的例子在下面 (操场):

mod builder {
    pub trait Builder: Sized {
        fn new() -> Simple {
            Simple
        }
    }

    pub struct Simple;

    impl Builder for Simple {}
}

pub fn main() {
    let _ = builder::Builder::new();
    
    /* Working version */
    // use builder::Builder;
    // let _ = builder::Simple::new();
}

这使:

error[E0283]: type annotations needed
  --> src/main.rs:14:13
   |
3  |         fn new() -> Simple {
   |         ------------------ required by `builder::Builder::new`
...
14 |     let _ = builder::Builder::new();
   |             ^^^^^^^^^^^^^^^^^^^^^ cannot infer type
   |
   = note: cannot satisfy `_: builder::Builder`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0283`.
error: could not compile `playground`.

To learn more, run the command again with --verbose.

编译器的解释为E0283没有提到默认实现,我同意这是有道理的。但对于默认实现,为什么需要类型?


这不仅是一个默认实现但是非常具体的案例其中这个默认实现甚至没有提到Self/self在它的参数、结果和主体中。

我发现更容易理解一条规则,即每次我们使用特征时都需要一个类型,无论如何,而不是« 除非默认实现甚至没有提及Self/self其参数、结果和主体 ».

对于这个非常具体的用例,您不想在调用所需函数时显式命名类型,我建议使用自由函数。

mod builder {
    // ...
    pub fn make_default() -> Simple {
        Simple
    }
    // ...
}

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

为什么编译器需要一个特征的实现来调用默认的自由函数? 的相关文章

随机推荐

  • 为什么jupyter笔记本只打印一次cython结果?

    我是 cython 的新手 现在只用它来做一些硬件 我使用以下代码在 jupyter Notebook 中查看它的总体思路 load ext Cython cython def cfunc int n cdef int a 0 for i
  • 使用 DefaultHTTPClient 发出 HTTPGet 请求时套接字超时

    重用背后的优点和缺点是什么DefaultHTTPClient当从 Android 应用程序向外部服务器发送 HTTP 请求时 我尝试使用重用DefaultHTTPClient做周期性的时候HTTPGet请求 但我得到随机套接字超时 特别是在
  • 如何每小时在sql server中运行一个存储过程?

    我有一张桌子 我想每小时在上面执行一些操作 为此 我创建了一个存储过程 但不知道如何每小时调用它 我知道有一些预定的工作 但是如何使用它们 是否有某种服务每秒持续运行 我可以在其中放置要执行的代码 在 SSMS 中导航到 SQL Serve
  • VS Code,打字 - 无 IntelliSense

    我有一个具有以下 缩短的 结构的项目 app app css app js home home css home html home js jsconfig json package json tsconfig json typings g
  • 为什么 HttpClient 总是给我相同的响应?

    环境 VS2012更新4Windows Phone 8 SDK一个基于 WP OS 7 1 的全新 Windows Phone 项目NuGet pack1 MS 异步NuGet pack2 MS HttpClient 该项目是做什么的论坛
  • 如何在Windows中使用java将webp转换为png或jpg?

    I got bitbucket org luciad webp imageio在 Ubuntu 中工作 但我无法在 Windows 中工作 这是我在 Ubuntu 中所做的 下载 webp imageio 和libwebp源代码 其他版本可
  • Prolog 成员谓词

    我需要编写一个 Prolog 谓词 以避免手头列表中多次出现的项目出现冗余答案 如以下示例查询所示 member a a b a true member X a b a X a X b false member X a b a c a d
  • Umano SlidingPanel 中状态栏下方的滑动布局

    我已经使用 UmanoSlidingPanel 实现了https github com umano AndroidSlidingUpPanel 一切工作正常 除了我的滑动面板在展开时 滑动内容 sliding view 位于状态栏下方 我怎
  • 如何使用常见的 try-catch 来处理 Javascript 中的每个给定函数?

    这些是我的一些函数 我需要编写一个通用函数来查看函数运行是否没有错误 我尝试使用 try catch 方法 但我只能对每个函数单独执行此操作 function fisrt console log First function second
  • Android扩展文件

    我正在尝试制作一个包含 80mo PNG 的应用程序 这是一个离线应用程序 所以我必须将它们存储在手机上 该应用程序在本地运行良好 但我无法上传 gt 50mo 的 apk 所以我试图实现一个包含我所有 PNG 的扩展文件 所以我在 Lin
  • 解析 EMV 9F10 令牌

    我收到以下信息IAD处理后GPO command 那么我的问题是 怎么样9F10 EMV token建造 这是令牌 06010A03A020000F04000000000000000000006232E4F9 我只需要发送CVR部分到采集开
  • Python Argparse“需要以下参数”错误

    我正在尝试使用 github 存储库 但项目的 argparse 部分存在一些问题 回购协议开始如下 import markdown sys csv getpass smtplib argparse from email mime text
  • asp.net mvc 和 linq toEntity:如何包含 IEnumerable 中的文本值

    我有一个对一个字段有约束的表 它可以是 1 2 或 3 正确的解决方案可能是为此创建一个查找表 但现在我想知道是否可以在不使用查找表 我创建了一个返回值的 IEnumerable 类 我正在使用 LINQ to Entities 并且希望能
  • .NET 5 支持旧的 csproj 格式吗?

    从 NET Framework 迁移到 NET 5 时最大的障碍之一是必须将所有 csproj 转换为新的 SDK 样式格式 没有工具可以自动执行此操作 必须手动完成 我想知道这个转换是否有必要 有没有办法在保留旧的 cs 项目的同时切换到
  • 核心 4D 图像 tif 存储为 hdf5 python

    我有 27GB 的 2D tiff 文件 代表 3D 图像电影的切片 我希望能够像简单的 numpy4d 数组一样对这些数据进行切片 看起来 dask array 是一个很好的工具 可以在数组作为 hdf5 文件存储在内存中后干净地操作数组
  • 为什么在字符串数组上使用 Array.map(parseInt) 会产生不同的结果[重复]

    这个问题在这里已经有答案了 我正在观看一个关于销毁所有软件标题的演讲JavaScript 的诞生与消亡 在演讲中 Gary Bernhardt 指出了 JavaScript 的一个奇怪的功能 即给出一个整数字符串数组 javascript
  • 在R中是否可以得到F#的函数应用“|>”运算符? [复制]

    这个问题在这里已经有答案了 可能的重复 R 流水线函数 我发现 R 语法与 F 相比非常笨拙 在 R 中 而不是 plot exp cumsum returns 我很想做 returns gt cumsum gt exp gt plot 有
  • Bootstrap 4 - 以自定义方式显示卡片

    我正在尝试创建一个基于 Bootstrap 4 的正确语义 HTML CSS 它将以某种方式呈现卡片元素 而无需添加太多自定义批量 到目前为止我所拥有的是这样的 section class section d flex align item
  • 可扩展的 WinForms 文本框

    我在 Windows 窗体应用程序中创建了一个文本框 该文本框以用于在单行中输入文本的高度开始 但我希望如果用户输入包含在控件内的文本 文本框会自动增加其高度 目前 对于此文本框 我将属性 multiline 和 wordwrap 设置为
  • 为什么编译器需要一个特征的实现来调用默认的自由函数?

    当调用一个不需要的特征的默认实现时self 为什么需要注释一个实现类型呢 A 最小的 可重现的例子在下面 操场 mod builder pub trait Builder Sized fn new gt Simple Simple pub