generics rust implementation traits

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.