¿Cuándo no debería implementar un rasgo para las referencias a los implementadores de ese rasgo?

Si tengo un rasgo y una función que acepta un tipo genérico restringido a ese tipo, todo funciona bien. Si trato de pasar una referencia a ese tipo, obtengo un error de comstackción.

trait Trait { fn hello(&self) -> u32; } struct Struct(u32); impl Trait for Struct { fn hello(&self) -> u32 { self.0 } } fn runner(t: T) { println!("{}", t.hello()) } fn main() { let s = Struct(42); // Works runner(s); // Doesn't work // runner(&s); // error: the trait `Trait` is not implemented for the type `&Struct` } 

Puedo solucionar el problema implementando el rasgo para cualquier referencia a un tipo que implemente el rasgo:

 impl Trait for &'a T where T: Trait { fn hello(&self) -> u32 { (*self).hello() } } 

La información que me falta es cuándo no debería implementar esto. Preguntado de otra manera, ¿por qué el comstackdor no implementa esto automáticamente? Dado que actualmente no lo hace, supongo que debe haber casos en los que tener esta implementación sería desventajoso.

El rasgo particular que está escribiendo aquí solo toma a uno por referencia, y esa es la única razón por la que es posible. Por esta razón, tomar el parámetro a runner() por valor es probablemente indeseable; deberías tomarlo por referencia. Esta pauta puede aplicarse en general: si es posible implementar el rasgo como referencia, en lugar de preguntarse “¿debo implementarlo?”, Debería preguntarse “¿por qué lo implementaría?” , Ya que los únicos casos en los que probablemente lo utilizaría deberían ser alterado para tomar el objeto por referencia en primer lugar.

¿Cuándo no debería implementar esto? Preguntado de otra manera, ¿por qué el comstackdor no implementa esto automáticamente? Dado que actualmente no lo hace, supongo que debe haber casos en los que tener esta implementación sería desventajoso.

Por ejemplo, el rasgo por defecto vino inmediatamente a la mente.

 pub trait Default { fn default() -> Self; } 

Podría implementarlo para T , pero no hay formas de implementarlo automáticamente para & T.