There are two things that have write_fmt method:
-
std::fmt::Write(=core::fmt::Write) std::io::Write
and three things that have write_str method. The above two plus
std::fmt::Formatter
I understand that the formatting macros don’t care, because they just expand to call to write_fmt and don’t care about which trait provides the method.
However for functions that want to take “something to which I can format” this situation is bad, because streams implement std::io::Write, but std::string::String implements std::fmt::Write.
It would be much more useful if there was only one trait for writing string (std::fmt::Write) and another for writing bytes (std::io::Write). And the streams in std::io would then define both. Or even only stdin/stdout/stderr would and files would require wrapping to be explicit about encoding.