Não entendo por que restringir um genérico não utilizado causa um erro de compilação. Por que isso compila:
#[derive(PartialEq)]
struct B;
fn is_eq<T>(b: B, c: B) -> bool
// where
// B: PartialEq<T>,
{
b == c
}
mas remover o comentário da cláusula where causa este erro de compilação:
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`
Fazendo as ==
compilações explícitas, ou seja PartialEq::<B>::eq(&b, &c)
- embora não deveria estar claro para o compilador usar esta implementação? Estranhamente, alterando os parâmetros de entrada para &B e usando ==
compilações. Seria ótimo saber por que há um erro e o que está acontecendo aqui.
Este bug existe desde Rust 1.0: Reordenar onde as cláusulas podem alterar o comportamento do programa
Outra maneira de obter ambos
B == T
eB == B
é especificar ambos:Quando você usa
&B
, ele ignora principalmente sua cláusula where, já que você não está mais comparandoB
valores. Em vez disso, ele passa pelo impl geral em busca de referências , o que aparentemente é suficiente para encontrarPartialEq<B>
.Você pode fazer com que a referência não seja compilada alterando a cláusula where.