Path does not implement Show for reasons that I think are rather unique to Path. Specifically, most programming languages/standard libraries have historically used strings to represent file paths. Many languages/libraries provide path-centric APIs that provide a better user experience, but still typically allow (and very commonly use) strings to represent paths in cases where complicated path manipulation is not necessary.
Programming languages that do this fall in one of two camps: 1) languages that can represent arbitrary binary data (at least, binary data without NULs) in strings, in which case representing paths as strings is workable, if not ideal, and 2) languages that require strings to conform to some encoding, in which case representing paths as strings is definitively broken.
The end result of all this is that a great many programmers are used to using strings to represent file paths. To these programmers, converting a Path to a String is highly likely to be assumed to be a reversible operation. This is made even more likely by the fact that the vast majority of file paths people see are in fact representable as a valid utf-8 sequence. Because of this, developers that do represent paths as strings are unlikely to ever notice an issue, until such time as their software mysteriously breaks on someone else’s system (sometimes with catastrophic results, if the breakage results in a truncated path and not a hard error, and the attempted operation is destructive).
All that said, my expectation is that pretty much every non-primitive data structure besides Path does not carry an implicit assumption that round-tripping through String will work (I say non-primitive because things like numeric types are expected to round-trip through String, and that’s fine).
I am undecided as to whether it makes sense to allow Path to conform to Show if .to_string() is divorced from Show. On the one hand, not being able to say path.to_string() would be good, but on the other hand, I worry that people will still make the assumption that format!("{}", path) is appropriate.
Perhaps a compromise would be to split off .to_string() from Show, and then to implement Show on Path, but implement it to return something like Path("lossy_representation"). This can’t be round-tripped, because it can’t be passed back into Path's constructor, and it also can’t be trivially used in places where strings are expected for data representation, such as being used as a string value in a JSON blob.
In order to ease transition, we could remove the implicit implementation of ToString, and modify #[deriving(Show)] to also derive a ToString impl. This would obviously not work for classes that manually implement Show, but we could also support #[deriving(ToString)] there. Then Path can implement Show without getting ToString.