编译器强制我实现特征方法,但方法上绑定的“Self”特征永远不会满足我的类型

2023-11-26

我有一个特质Foo。我想强迫实现者定义一个方法,if这些实现者实现了另一个特征(Clone在此示例中)。我的想法 (操场):

trait Foo {
    // Note: in my real application, the trait has other methods as well,
    // so I can't simply add `Clone` as super trait
    fn foo(&self) 
    where 
        Self: Clone;
}

struct NoClone;
impl Foo for NoClone {}

可悲的是,这会导致:

error[E0046]: not all trait items implemented, missing: `foo`
 --> src/lib.rs:8:1
  |
2 | /     fn foo(&self) 
3 | |     where 
4 | |         Self: Clone;
  | |____________________- `foo` from trait
...
8 |   impl Foo for NoClone {}
  |   ^^^^^^^^^^^^^^^^^^^^ missing `foo` in implementation

我不明白这个错误:编译器清楚地知道NoClone不执行Clone,那么为什么我需要提供定义foo?特别是,如果我尝试提供一个定义(操场):

impl Foo for NoClone {
    fn foo(&self) 
    where 
        Self: Clone
    {
        unreachable!()
    }
}

我收到错误:

error[E0277]: the trait bound `NoClone: std::clone::Clone` is not satisfied
  --> src/lib.rs:9:5
   |
9  | /     fn foo(&self) 
10 | |     where 
11 | |         Self: Clone
12 | |     {
13 | |         unreachable!()
14 | |     }
   | |_____^ the trait `std::clone::Clone` is not implemented for `NoClone`
   |
   = help: see issue #48214
   = help: add #![feature(trivial_bounds)] to the crate attributes to enable

所以编译器肯定知道。 (仅供参考:与#![feature(trivial_bounds)]它可以编译,但我不想定义一堆方法unreachable!()作为身体。)

为什么编译器强制我提供方法定义?我可以以某种方式解决这个问题吗?


特征的所有实现者都需要实现所有没有默认实现的方法。特征的要点在于它有一个定义的接口。向方法添加特征边界不会改变此规则的任何内容。

这就是语言参考关于这个话题说:

特征实现必须定义由实现的特征声明的所有非默认关联项,可以重新定义由实现的特征定义的默认关联项,并且不能定义任何其他项。

这也意味着特质绑定Self在特征的方法声明中在功能上等同于声明超级特征,只不过该特征只能在声明绑定的方法中使用。

明显的解决方法是为有额外要求的方法定义一个单独的特征Self:

trait FooExt: Foo + Clone {
    fn foo(&self);
}

您现在可以实施Foo对于所有类型,以及FooExt另外对于以下类型Clone.

根据评论中的要求更新: 有一个GitHub 问题讨论是否应该允许在没有方法主体的情况下实现具有不可满足特征边界的方法,所以至少{ unimplemted()! }部分可能会被丢弃。截至 2019 年 4 月,这场讨论还没有得出任何结论,甚至连实现不可调用方法的确切语法都还没有确定。

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

编译器强制我实现特征方法,但方法上绑定的“Self”特征永远不会满足我的类型 的相关文章

  • 如何在不消耗值的情况下实现添加特征[重复]

    这个问题在这里已经有答案了 当实施Add特质 还有其他一些 比如Mul Sub等 对于一个简单的结构体 必须完全消耗该结构体值 因此它的后续使用是不可能的 同时 内置原语 u8 usize等 实施Add同时允许之后使用它add被称为 我该如
  • Some() 在变量赋值的左侧做什么?

    我正在阅读一些 Rust 代码 并且遇到了这一行 if let Some path env args nth 1 这个函数内部 fn main if let Some path env args nth 1 Try reading the
  • clap::App 多次调用方法移动所有权

    即使阅读了有关引用所有权和借用的章节后 我仍然无法理解以下代码中的某些内容 这有效地阻止了我从clap App extern crate clap use clap App fn main let mut app App new name
  • for 循环和 into_iter() [重复]

    这个问题在这里已经有答案了 据我了解 for循环隐式调用into iter 在向量上循环遍历它 但是 在下面的代码中 为什么vec在 Question1 1 的第一个 for 循环中没有消耗 但在第二个 for 循环中 vec 消耗了 fn
  • 如何限制Cargo.toml中的测试线程数?

    我的测试共享公共资源并且无法同时执行 这些测试失败cargo test 但与RUST TEST THREADS 1 cargo test 我可以修改测试以等待全局互斥体 但如果有任何更简单的方法来强制 我不想让它们混乱cargo为我设置这个
  • 类型别名和不完整类型

    我可能已经超出了解决这个本应简单的问题的范围 我在这里开始这个问题 在编译时获取基类的类型 https stackoverflow com questions 17735852 getting type of a base class at
  • 包含原始指针的结构可以实现 Send 并且 FFI 安全吗?

    我有一个场景 Rust 会调用 Cmalloc缓冲区并将结果指针存储到结构中 稍后 该结构将被移动到线程并传递给 C 函数 该函数会对其进行变异 我的问题的天真的方法看起来像这样 extern crate libc use libc c v
  • 将 char 解析为 u32

    正如问题所述 我如何实现这一目标 如果我有这样的代码 let a 29 for c in a chars println c as u32 我得到的是 2 和 9 的 unicode 代码点 50 57 我想要的是将这些字符解析为实际的数字
  • Rust 中类似结构的重复代码删除

    我有一个小项目 其中有一些类似的结构 其中的实现Ord and PartialOrd是一样的 我是 主要 动态语言的新手 其中代码重复通常被认为是反模式 我想知道是否有办法避免重复此代码 或者 更一般地说 这是我应该担心 Rust 的问题吗
  • 如何让 Visual Studio Code 重置 Rust 的 IntelliSense 引擎?

    我正在开发两个项目 一个是一个库 另一个是使用该库的程序 当我对库进行更改时 其他窗口 程序 看不到这些更改 因此我没有获得更新的 IntelliSense 关闭使用该库的程序并重新打开它确实会强制更新 但我真的不想走那么远 直接回答标题
  • 在编译时检查指针大小

    我发现类似的问题编译时泛型类型大小检查 https stackoverflow com questions 30330519 compile time generic type size check 但没有收到任何答复 问题是通过FFI u
  • 由于递归结构中存在冲突的要求,无法推断适当的生命周期

    当我尝试编译这段代码时 pub struct Context lt a gt pub outer Option lt a mut Context lt a gt gt impl lt a gt Context lt a gt pub fn
  • 如何将 take_while 与 future::Stream 一起使用?

    我想了解我应该使用什么语法take while https docs rs futures 0 1 futures stream trait Stream html method take while with futures Stream
  • 从 WebAssembly .wasm 模块获取 JavaScript 导入对象条目

    我想了解 Rust 程序在编译为 wasm 文件时实际导出的内容 以便我可以提供有效的importObject到实例化函数 WebAssembly instantiate bufferSource importObject 据我了解 执行此
  • 特性与界面

    我最近一直在尝试学习 PHP 我发现自己对 Trait 很着迷 我理解水平代码重用的概念 并且不想必然从抽象类继承 我不明白的是 使用特征与接口之间的关键区别是什么 我尝试寻找一篇不错的博客文章或文章来解释何时使用其中一种 但到目前为止我发
  • 如何使用diesel-rs选择色谱柱的子集?

    我现在花了几个小时的时间来查询表的可用列的子集以及在其中包含计算 我知道这不是在选择查询中执行计算的最佳方式 但现在 我只是在开发一个原型 它应该是可行的 我在用diesel rs作为后端实现中所有数据库操作的 ORM 数据将存储在 Pos
  • '&&x' 模式匹配是否会导致 x 被复制?

    在文档中std iter 迭代器 filter https doc rust lang org stable std iter trait Iterator html method filter它解释了值通过引用传递给闭包 并且由于许多迭代
  • 如何使用同级/相邻 Rust 文件中的结构?

    我正在尝试编辑具有以下结构的 Rust 项目 src iface ip rs src iface tun rs 我想从以下位置调用东西ip rs inside tun rs So on tun rs我补充道 use iface ip 但它说
  • 具有指向其自身数据的切片的结构

    我有一个结构 struct Foo lt a gt buf u8 64 slice a u8 该切片应该指向buf结构体的字段 有什么方法可以构造这样的结构吗 就像是 impl lt a gt Foo lt a gt fn new gt F
  • 使用 if 表达式时,“不匹配的类型:预期的 `()`” 是什么意思?

    我尝试在 Rust 中实现 fizzbuzz 但因一些神秘错误而失败 fn main let mut i 1 while i lt 100 println if i 3 0 Fizz if i 5 0 Buzz if i 3 0 i 5 0

随机推荐

  • 如何使用ajax函数发送表单而不刷新页面,我错过了什么?我必须使用rest-framework吗?

    我正在尝试使用 ajax 发送评论表单 现在当用户插入评论时 整个页面都会刷新 我希望能够很好地插入此内容 而无需刷新页面 所以我尝试了很多东西但没有运气 由于我是初学者 我尝试遵循许多教程链接 https realpython com b
  • 创建 Java 消息对话框(swing/awt/其他)的最快方法?

    我正在创建一个 Java 应用程序 它将执行一些处理 然后需要显示一条消息以向用户提供反馈 然而 它似乎非常慢 需要两秒钟多的时间才能返回 我将源代码剥离到明显的罪魁祸首 这里是使用的代码 package SwingPlay import
  • 如何以编程方式生成 Android 按键

    在我的应用程序中 当用户按下 DPAD LEFT 时 我想生成两次 DPAD UP 按下 我知道可以使用这样的方法来完成 Override private boolean onKeyDown int keyCode KeyEvent eve
  • “kotlin-android-extensions”Gradle 插件已弃用

    对于 Gradle 版本 6 2 和 Android studio 版本 4 0 1 我有以下弃用消息Kotlin android extention 任何人都知道如何解决它 它已被弃用谷歌文档 Kotlin Android 扩展已被弃用
  • 什么是 CPU 寄存器以及它们如何使用,特别是 WRT 多线程?

    这个问题和我下面的回答主要是针对另一个问题中的一个困惑的地方 在答案的最后 有一些我并不完全有信心的 WRT 易失性 和线程同步问题 我欢迎评论和替代答案 然而 问题的重点主要涉及 CPU 寄存器及其使用方式 寄存器是 CPU 中的 工作存
  • 如何在codeigniter 3.0中实现HMVC?

    目前我正在使用codeigniter3 0版本 我想知道如何在其中实现 HMVC 结构 有人可以帮忙吗 codeigniter 3 hmvc 模块文件夹用于 https bitbucket org wiredesignz codeignit
  • 用鼠标在画布上画线:Java awt

    尝试是在 awt canvas 上使用鼠标绘制图形 现在是一条线 我是第一次尝试java图形 所以不知道该怎么做 这是我的第一次尝试 package def grafi import java awt Canvas import java
  • 从多个不同的 Rails 模型创建“提要”

    我正在开发一个具有几种不同模型 票证 帖子 报告等 的应用程序 每个模型中的数据都不同 我想从所有这些模型创建一个 提要 全面显示 10 个最新条目 所有数据的混合 解决这个问题的最佳方法是什么 当为用户分配票证或发布新报告时 我是否应该创
  • 在 Perl 中如何判断变量是否具有数值?

    Perl 中有没有一种简单的方法可以让我确定给定变量是否是数字 大致如下 if is number x 将是理想的 一种不会在以下情况下发出警告的技术 w正在使用的开关当然是首选 Use Scalar Util looks like num
  • 如何在命令行中运行/调试 javascript

    我想知道 实际上我知道肯定有这样一种在命令行中运行js的方法 因为当我观看google I 0演示时 他们使用像d8这样的命令 也许它是V8引擎的一部分 有什么方法可以在命令行中运行 调试我的 JavaScript 例如d8 myJsfil
  • 如何在 iPhone 的 MKMapView 中显示带点(圆圈)的蓝色图钉

    我的问题可能看起来有点复杂 但让我澄清一下 我正在使用 mkmapview 在这里我想用蓝点和圆圈显示当前用户位置 但这并不是我想要的 当我正在制作一个 iPhone 应用程序时 由于我是地图集成的新手 因此我很难做到同样的事情 如果有人可
  • 从数据框列表中合并数据框[重复]

    这个问题在这里已经有答案了 我有一个数据框列表 如下所示 ls 1 1 month year oracle 1 2004 356 0000 2 2004 390 0000 3 2004 394 4286 4 2004 391 8571 ls
  • 溢出换行和断字之间的区别?

    之间的确切区别是什么overflow wrap word wrap and word break 谁能告诉我打破很长链接的更好方法是什么 大多数人说你应该将分词与overflow wrap但这看起来不太合逻辑 我认为使用overflow w
  • 随机排列数组 swift 3

    我怎样才能将下面的函数转换为swift 3 目前正在获取一个Binary operator lt cannot be applied to operands of type Int and Self IndexDistance error
  • 修改核心数据模型后重新创建类定义的更好方法?

    在 XCode 中设计核心数据模型时 可以通过以下方式自动生成 NSManagedObject 子类定义 m 和 h 文件 选择Entities 选择 创建 NSManagedObject 子类 EDITOR menu 之后 您可能会在这些
  • 你能使用 WINDOWS 构建一个 React-native iOS 应用程序吗?

    您可以在 Windows 上使用 React Native 构建 iOS 吗 还是需要xcode 如果是这样 有什么解决方法吗 我不想在 Mac 或 Mac 虚拟机上工作 我认为你用react native创建的应用程序可以在iOS上运行
  • 如何将 Docker 容器配置为可以通过容器 IP:端口从主机外部访问?

    我的主机有多个 IP 地址分配给一个网络接口 我想配置 Docker 以便让每个容器 响应 分配给主机的这些 IP 地址中的单个 IP 这可以通过 libcontainer 完成还是我必须使用 LXC 驱动程序并使用以下命令运行我的容器 l
  • 在响应完成之前关闭 HttpURLConnection

    背景 我在用着HttpURLConnection在客户端上使用 HTTP 流 服务器推送 情况下的响应 尽管服务器可以通过关闭响应来关闭连接 但客户端也需要能够执行此操作 Problem 客户端处理InputStream在一个单独的线程中
  • Shell:在多个文件中查找匹配行

    我正在尝试使用 shell 脚本 以及 oneliner 来查找大约 50 个文件之间的任何公共行 Edit 注意我正在寻找出现在所有文件中的一行 行 到目前为止我已经尝试过 grepgrep v x f file1 sp 它只匹配所有其他
  • 编译器强制我实现特征方法,但方法上绑定的“Self”特征永远不会满足我的类型

    我有一个特质Foo 我想强迫实现者定义一个方法 if这些实现者实现了另一个特征 Clone在此示例中 我的想法 操场 trait Foo Note in my real application the trait has other met