我不明白为什么限制未使用的泛型会导致编译错误.为什么要编译以下代码:

#[derive(PartialEq)]
struct B;

fn is_eq<T>(b: B, c: B) -> bool 
// where
//     B: PartialEq<T>,
{
    b == c
}

但是取消对WHERE子句的注释会导致以下编译错误:

error[E0308]: mismatched types
 --> src/lib.rs:9:10
  |
4 | fn is_eq<T>(b: B, c: B) -> bool
  |          - this type parameter
...
8 |     b == c
  |          ^ expected type parameter `T`, found `B`
  |
  = note: expected type parameter `T`
                     found struct `B`

使==显式编译,即PartialEq::<B>::eq(&b, &c)--尽管编译器不应该清楚地使用这个实现吗?奇怪的是,将输入参数更改为&amp;B并使用==进行编译.如果知道为什么会有错误以及这里发生了什么,那将是一件很棒的事情.

推荐答案

这个错误从Rust 1.0开始就存在了:

同时获得B == TB == B的另一种方法是同时指定两者:

fn is_eq<T>(b: B, c: B) -> bool 
where
    B: PartialEq<T> + PartialEq<B>,
// also works: B: PartialEq<T> + PartialEq,

当您使用&B时,它通常会忽略WHERE子句,因为您不再比较B个值.取而代之的是the blanket impl for references,这显然足以找到PartialEq<B>.

您可以通过更改WHERE-子句使引用不能编译.

fn is_eq<T>(b: B, c: B) -> bool
where
    for<'a> &'a B: PartialEq<&'a T>,
{
    (&b) == (&c)
}

Rust相关问答推荐

如何在tauri—leptos应用程序中监听后端值的变化?""

Arrow RecordBatch as Polars DataFrame

将PathBuf转换为字符串

对于已经被认为是未定义行为的相同数据,纯粹存在`&;[u32]`和`&;mut[u32]`吗?

如何修复数组中NewType导致的运行时开销

允许 rust 迹 struct 条目具有多种类型

Rust移动/复制涉及实际复制时进行检测

Rust wasm 中的 Closure::new 和 Closure::wrap 有什么区别

类型生命周期绑定的目的是什么?

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

如何基于常量在Rust中跳过一个测试

如何使用 Rust Governor 为每 10 秒 10 个请求创建一个 RateLimiter?

如何从 rust 中的同一父目录导入文件

如何在 Emacs Elisp 中获得类似格式化的 LSP?

为什么 for_each 在释放模式(cargo run -r)下比 for 循环快得多?

为什么我不能克隆可克隆构造函数的Vec?

将 Futures 的生命周期特征绑定到 fn 参数

Rust,使用枚举从 HashMap 获取值

为什么基于 clap::Parser 读取的大量数字进行计算比硬编码该数字时慢?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?