This is an intentionally-created artificial limitation in Rust's interface, because Rust really wants to remind you that these are Unicode strings, and Unicode does not have constant-time "character" indexing. n-th byte or n-th codepoint is not n-th "character".
Lots of programming languages ignore that problem and give you false impression that such indexing is possible, by giving you wrong results that look correct in simple cases like "hello world".
The closest thing to human-recognizable characters that is in Unicode is grapheme cluster, and these are expressed as ranges of code points (or ranges of code units, or ranges of bytes), so that's why range indexing is supported. Grapheme cluster algorithm is big and complex (because sum of complexity of all human languages is complex), so it's not in the standard library, but you can use a 3rd party library to give you ranges of grapheme clusters.
string was implemented, it would end up reading 1/
nth of a character, where for ASCII n=1 so it seems to work, but
n can be arbitrarily large.
If you're not interested in Unicode, then you can use
string.as_bytes() and that will give you the first byte.