ps4 - rust traduccion
¿Cuándo debo implementar std:: convert:: From vs std:: convert:: Into? (1)
Veo que
std::convert::Into
tiene una implementación para cualquier cosa que implemente
std::convert::From
:
impl<T, U> Into<U> for T where U: From<T>
Hay implementaciones mucho más específicas de
From
, mientras que
Into
actualmente tiene solo 3 implementaciones específicas, lo que hace que parezca que es la decisión predominante implementar
From
por defecto.
Estoy seguro de que hay momentos en los que solo quisiera implementar
Into
y no
From
, pero no los veo.
Curiosamente,
el RFC original
sobre los rasgos
std::convert
estaba sugiriendo la manta opuesta impl:
impl<T, U> From<T> for U where T: Into<U>
Pero cuando el RP lo implementó, se cambió a lo contrario :
Se agregó
From
=>Into
implementación, lo que permite agregar conversiones en ambas direcciones sin entrar en conflicto con la coherencia. Por ejemplo, ahora tenemosFrom<[T]> for Vec<T> where T: Clone
, que produce el correspondiente en ir en la otra dirección, a pesar de que los dos tipos viven en cajas diferentes.También creo que esto resuelve algunas preocupaciones sobre las cosas que implementan From en lugar de Into
De hecho, no es posible hacer una
impl<''a, T> Into<Foo> for &''a [T]
, mientras que
impl<''a, T> From<&''a [T]> for Foo
es posible.
El primer intento plantea un
E0210
:
error: el parámetro de tipo
T
debe usarse como parámetro de tipo para algún tipo local (por ejemplo,MyStruct<T>
); solo los rasgos definidos en la caja actual pueden implementarse para un parámetro de tipo
Pero este cambio en el último momento refleja que
From
y
Into
son básicamente equivalentes.
From
fue elegido como el preferido ya que era el menos restrictivo desde el punto de vista "parámetro de tipo frente a tipo local".
En la biblioteca estándar solo hay dos ejemplos de implementación
Into
y no
From
:
impl Into<Vec<u8>> for String
impl Into<OsString> for PathBuf
Pero creo que son el reflejo de la lógica de sus interfaces.
OsString
implementa
From<String>
y
From<T> where T: AsRef<OsStr>
, porque son las cosas naturales a partir de las
OsString
querrás construir un
OsString
.
Sin embargo,
PathBuf
todavía implementa
Into<OsString>
como la operación inversa de su implementación
From<OsString>
, pero esta lógica pertenece a
PathBuf
, no a
OsString
.