So my question is why do i have to bind again fmt::Display for T and U in my greet function.
My first toughts, knowing Rust, was Rust can deduce that a type Person fields have to implement Display.
I know it is not idiomatic at all and i should put greet function in an impl block.
From my researchs and Discord chan help, i have understood that it is a design choice for increasing readability. Is it right ?
There is a plan to fix this, in the Implied Bounds RFC. It's taken a long time to implement this RFC because it depends on the new trait implementation, Chalk. However, it looks like progress is being made.
Iterestingly enough, implied bounds is may change what is idiomatic. Currently I would say it's "put bounds where you need them" (so in this case, on greet but not Person). After implied bounds it may be, "put bounds where you have to type the least."
The other important thing here is that it being repeated here means that it's not a breaking change to remove a trait bound for a type.
For example, if a library had struct Color<T: Copy>(T, T, T);, it's currently not a breaking change to weaken that to T: Clone, but it would be if every method was implicitly relying on T: Copy because it mentioned Color<T> in a parameter.
For any bound that's not needed for an associated type, I'd definitely suggest bounding the implementations, not the type.