generics - Implementaciones conflictivas de rasgo en Rust
implementation traits (1)
Quiero implementar un rasgo custome para &''a str
y para números enteros hasta i32
, pero Rust no me permite:
use std::convert::Into;
pub trait UiId {
fn push(&self);
}
impl<''a> UiId for &''a str {
fn push(&self) {}
}
impl<T: Into<i32>> UiId for T {
fn push(&self) {}
}
fn main() {}
Esto no se puede compilar con el siguiente error:
error[E0119]: conflicting implementations of trait `UiId` for type `&str`:
--> src/main.rs:11:1
|
7 | / impl<''a> UiId for &''a str {
8 | | fn push(&self) {}
9 | | }
| |_- first implementation here
10 |
11 | / impl<T: Into<i32>> UiId for T {
12 | | fn push(&self) {}
13 | | }
| |_^ conflicting implementation for `&str`
&''a str
no implementa Into<i32>
. ¿Es posible implementar UiId
para &''a str
y todo lo que se puede convertir a i32
sin especificar tipos concretos? ¿Cómo puedo hacer eso?
El hecho de que &''a str
no implemente Into<i32>
no se tiene en cuenta, porque no hay garantía de que no se pueda agregar más tarde. Esto luego rompería tu código.
Entonces, si esto se permitiera, la posible rotura dificultaría la implementación de los rasgos de la biblioteca.
Desafortunadamente no pude encontrar documentación para eso, ni en el Libro del lenguaje de programación de Rust ni en el Manual de referencia .
Lo mejor que pude encontrar es RFC 1023 , que dice que una caja no puede [...] confiar en que Type: !Trait
mantiene a menos que Type
o Trait
sea local.