traduccion ps4 lenguaje language juego rust

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 tenemos From<[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 .